@@ -724,3 +724,144 @@ func TestConnectHandler_UpdateProjectResource(t *testing.T) {
724724 })
725725 }
726726}
727+
728+ func TestConnectHandler_DeleteProjectResource (t * testing.T ) {
729+ tests := []struct {
730+ name string
731+ setup func (rs * mocks.ResourceService , ps * mocks.ProjectService )
732+ request * connect.Request [frontierv1beta1.DeleteProjectResourceRequest ]
733+ want * connect.Response [frontierv1beta1.DeleteProjectResourceResponse ]
734+ wantErr error
735+ }{
736+ {
737+ name : "should return internal error if resource service Get returns error" ,
738+ setup : func (rs * mocks.ResourceService , ps * mocks.ProjectService ) {
739+ rs .EXPECT ().Get (mock .AnythingOfType ("context.backgroundCtx" ), testResource .ID ).Return (resource.Resource {}, errors .New ("test error" ))
740+ },
741+ request : connect .NewRequest (& frontierv1beta1.DeleteProjectResourceRequest {
742+ Id : testResource .ID ,
743+ }),
744+ want : nil ,
745+ wantErr : connect .NewError (connect .CodeInternal , ErrInternalServerError ),
746+ },
747+ {
748+ name : "should return not found error if resource not exist" ,
749+ setup : func (rs * mocks.ResourceService , ps * mocks.ProjectService ) {
750+ rs .EXPECT ().Get (mock .AnythingOfType ("context.backgroundCtx" ), testResource .ID ).Return (resource.Resource {}, resource .ErrNotExist )
751+ },
752+ request : connect .NewRequest (& frontierv1beta1.DeleteProjectResourceRequest {
753+ Id : testResource .ID ,
754+ }),
755+ want : nil ,
756+ wantErr : connect .NewError (connect .CodeNotFound , ErrResourceNotFound ),
757+ },
758+ {
759+ name : "should return not found error if id is invalid" ,
760+ setup : func (rs * mocks.ResourceService , ps * mocks.ProjectService ) {
761+ rs .EXPECT ().Get (mock .AnythingOfType ("context.backgroundCtx" ), "some-id" ).Return (resource.Resource {}, resource .ErrInvalidUUID )
762+ },
763+ request : connect .NewRequest (& frontierv1beta1.DeleteProjectResourceRequest {
764+ Id : "some-id" ,
765+ }),
766+ want : nil ,
767+ wantErr : connect .NewError (connect .CodeNotFound , ErrResourceNotFound ),
768+ },
769+ {
770+ name : "should return not found error if id is empty" ,
771+ setup : func (rs * mocks.ResourceService , ps * mocks.ProjectService ) {
772+ rs .EXPECT ().Get (mock .AnythingOfType ("context.backgroundCtx" ), "" ).Return (resource.Resource {}, resource .ErrInvalidID )
773+ },
774+ request : connect .NewRequest (& frontierv1beta1.DeleteProjectResourceRequest {}),
775+ want : nil ,
776+ wantErr : connect .NewError (connect .CodeNotFound , ErrResourceNotFound ),
777+ },
778+ {
779+ name : "should return internal error if project service returns error" ,
780+ setup : func (rs * mocks.ResourceService , ps * mocks.ProjectService ) {
781+ rs .EXPECT ().Get (mock .AnythingOfType ("context.backgroundCtx" ), testResource .ID ).Return (testResource , nil )
782+ ps .EXPECT ().Get (mock .AnythingOfType ("context.backgroundCtx" ), testResource .ProjectID ).Return (project.Project {}, errors .New ("test error" ))
783+ },
784+ request : connect .NewRequest (& frontierv1beta1.DeleteProjectResourceRequest {
785+ Id : testResource .ID ,
786+ }),
787+ want : nil ,
788+ wantErr : connect .NewError (connect .CodeInternal , ErrInternalServerError ),
789+ },
790+ {
791+ name : "should return internal error if resource service Delete returns error" ,
792+ setup : func (rs * mocks.ResourceService , ps * mocks.ProjectService ) {
793+ rs .EXPECT ().Get (mock .AnythingOfType ("context.backgroundCtx" ), testResource .ID ).Return (testResource , nil )
794+ ps .EXPECT ().Get (mock .AnythingOfType ("context.backgroundCtx" ), testResource .ProjectID ).Return (project.Project {
795+ ID : testResource .ProjectID ,
796+ Organization : organization.Organization {
797+ ID : "test-org-id" ,
798+ },
799+ }, nil )
800+ rs .EXPECT ().Delete (mock .AnythingOfType ("context.backgroundCtx" ), testResource .NamespaceID , testResource .ID ).Return (errors .New ("delete error" ))
801+ },
802+ request : connect .NewRequest (& frontierv1beta1.DeleteProjectResourceRequest {
803+ Id : testResource .ID ,
804+ }),
805+ want : nil ,
806+ wantErr : connect .NewError (connect .CodeInternal , ErrInternalServerError ),
807+ },
808+ {
809+ name : "should return success if resource is deleted successfully" ,
810+ setup : func (rs * mocks.ResourceService , ps * mocks.ProjectService ) {
811+ rs .EXPECT ().Get (mock .AnythingOfType ("context.backgroundCtx" ), testResource .ID ).Return (testResource , nil )
812+ ps .EXPECT ().Get (mock .AnythingOfType ("context.backgroundCtx" ), testResource .ProjectID ).Return (project.Project {
813+ ID : testResource .ProjectID ,
814+ Organization : organization.Organization {
815+ ID : "test-org-id" ,
816+ },
817+ }, nil )
818+ rs .EXPECT ().Delete (mock .AnythingOfType ("context.backgroundCtx" ), testResource .NamespaceID , testResource .ID ).Return (nil )
819+ },
820+ request : connect .NewRequest (& frontierv1beta1.DeleteProjectResourceRequest {
821+ Id : testResource .ID ,
822+ }),
823+ want : connect .NewResponse (& frontierv1beta1.DeleteProjectResourceResponse {}),
824+ wantErr : nil ,
825+ },
826+ {
827+ name : "should handle deletion with different namespace correctly" ,
828+ setup : func (rs * mocks.ResourceService , ps * mocks.ProjectService ) {
829+ resourceWithDiffNS := testResource
830+ resourceWithDiffNS .NamespaceID = "different-namespace"
831+ rs .EXPECT ().Get (mock .AnythingOfType ("context.backgroundCtx" ), testResource .ID ).Return (resourceWithDiffNS , nil )
832+ ps .EXPECT ().Get (mock .AnythingOfType ("context.backgroundCtx" ), testResource .ProjectID ).Return (project.Project {
833+ ID : testResource .ProjectID ,
834+ Organization : organization.Organization {
835+ ID : "test-org-id" ,
836+ },
837+ }, nil )
838+ rs .EXPECT ().Delete (mock .AnythingOfType ("context.backgroundCtx" ), "different-namespace" , testResource .ID ).Return (nil )
839+ },
840+ request : connect .NewRequest (& frontierv1beta1.DeleteProjectResourceRequest {
841+ Id : testResource .ID ,
842+ }),
843+ want : connect .NewResponse (& frontierv1beta1.DeleteProjectResourceResponse {}),
844+ wantErr : nil ,
845+ },
846+ }
847+
848+ for _ , tt := range tests {
849+ t .Run (tt .name , func (t * testing.T ) {
850+ mockResourceSrv := new (mocks.ResourceService )
851+ mockProjectSrv := new (mocks.ProjectService )
852+ if tt .setup != nil {
853+ tt .setup (mockResourceSrv , mockProjectSrv )
854+ }
855+ h := ConnectHandler {resourceService : mockResourceSrv , projectService : mockProjectSrv }
856+ resp , err := h .DeleteProjectResource (context .Background (), tt .request )
857+ if tt .wantErr != nil {
858+ assert .Error (t , err )
859+ assert .Equal (t , tt .wantErr .(* connect.Error ).Code (), err .(* connect.Error ).Code ())
860+ assert .Equal (t , tt .wantErr .(* connect.Error ).Message (), err .(* connect.Error ).Message ())
861+ } else {
862+ assert .NoError (t , err )
863+ assert .EqualValues (t , tt .want , resp )
864+ }
865+ })
866+ }
867+ }
0 commit comments