@@ -736,3 +736,76 @@ func TestDeleteLabel(t *testing.T) {
736
736
Caller : auth.Caller {Name : "test" , MetricGroups : []string {"test" }},
737
737
}}, server .auth .AuthorizeArgs )
738
738
}
739
+
740
+ func TestDeleteLabelEntityNotFound (t * testing.T ) {
741
+ // Test that DELETE /.../labels/:label is idempotent and returns HTTP 200 OK
742
+ // when the entity does not exist.
743
+ store := mock.EntityStore {
744
+ DeleteLabelFunc : func (ctx context.Context , wo entity.WriteOp , label string ) (etre.Entity , error ) {
745
+ // Simulate entity not found. DeleteLabel returns (nil, etre.ErrEntityNotFound).
746
+ // The handler then sets err = nil because DELETE is idempotent.
747
+ return nil , etre .ErrEntityNotFound
748
+ },
749
+ }
750
+ server := setup (t , defaultConfig , store )
751
+ defer server .ts .Close ()
752
+
753
+ etreurl := server .url + etre .API_ROOT + "/entity/" + entityType + "/" + testEntityIds [0 ] +
754
+ "/labels/foo"
755
+
756
+ var gotWR etre.WriteResult
757
+ statusCode , err := test .MakeHTTPRequest ("DELETE" , etreurl , nil , & gotWR )
758
+ require .NoError (t , err )
759
+
760
+ assert .Equal (t , http .StatusOK , statusCode )
761
+ expectWrite := []etre.Write {{
762
+ EntityId : "" ,
763
+ URI : addr + etre .API_ROOT + "/entity/" ,
764
+ Diff : nil ,
765
+ },
766
+ }
767
+ assert .Equal (t , expectWrite , gotWR .Writes )
768
+ assert .Nil (t , gotWR .Error )
769
+ }
770
+
771
+ func TestDeleteLabelError (t * testing.T ) {
772
+ // Test that DELETE /.../labels/:label works correctly when the diff returned
773
+ // from the store returns an error. This can happen. The API
774
+ // should handle it gracefully by returning an empty EntityId in the
775
+ // write result.
776
+ store := mock.EntityStore {
777
+ DeleteLabelFunc : func (ctx context.Context , wo entity.WriteOp , label string ) (etre.Entity , error ) {
778
+ // Simulate a diff without an _id.
779
+ return nil , fmt .Errorf ("some error" )
780
+ },
781
+ }
782
+ server := setup (t , defaultConfig , store )
783
+ defer server .ts .Close ()
784
+
785
+ etreurl := server .url + etre .API_ROOT + "/entity/" + entityType + "/" + testEntityIds [0 ] +
786
+ "/labels/foo"
787
+
788
+ var gotWR etre.WriteResult
789
+ statusCode , err := test .MakeHTTPRequest ("DELETE" , etreurl , nil , & gotWR )
790
+ require .NoError (t , err )
791
+
792
+ assert .Equal (t , http .StatusInternalServerError , statusCode )
793
+ require .NotNil (t , gotWR .Writes )
794
+ require .Len (t , gotWR .Writes , 1 )
795
+
796
+ // Because the diff had no _id, the EntityId is empty string.
797
+ // The diff from the mock is returned.
798
+ expectWrite := etre.Write {
799
+ EntityId : "" ,
800
+ URI : addr + etre .API_ROOT + "/entity/" ,
801
+ Diff : nil ,
802
+ }
803
+ expectedError := & etre.Error {
804
+ Type : "unhandled-error" ,
805
+ Message : "some error" ,
806
+ EntityId : "" ,
807
+ HTTPStatus : http .StatusInternalServerError ,
808
+ }
809
+ assert .Equal (t , expectWrite , gotWR .Writes [0 ])
810
+ assert .Equal (t , expectedError , gotWR .Error )
811
+ }
0 commit comments