@@ -410,3 +410,184 @@ func TestParseIdentifyingProperties(t *testing.T) {
410410 })
411411 }
412412}
413+
414+ func TestServer_ListEntities (t * testing.T ) {
415+ t .Parallel ()
416+
417+ projectID := uuid .New ()
418+ providerID := uuid .New ()
419+ providerName := "github"
420+
421+ tests := []struct {
422+ name string
423+ request * pb.ListEntitiesRequest
424+ setupContext func (context.Context ) context.Context
425+ setupMocks func (* mockproviders.MockProviderStore , * mockentitysvc.MockEntityService )
426+ wantCode codes.Code
427+ errContains string
428+ validateResp func (* testing.T , * pb.ListEntitiesResponse )
429+ }{
430+ {
431+ name : "successfully lists entities" ,
432+ request : & pb.ListEntitiesRequest {
433+ EntityType : pb .Entity_ENTITY_REPOSITORIES ,
434+ },
435+ setupMocks : func (provStore * mockproviders.MockProviderStore , svc * mockentitysvc.MockEntityService ) {
436+ provStore .EXPECT ().
437+ GetByName (gomock .Any (), projectID , providerName ).
438+ Return (& db.Provider {
439+ ID : providerID ,
440+ Name : providerName ,
441+ ProjectID : projectID ,
442+ }, nil )
443+
444+ svc .EXPECT ().
445+ ListEntities (gomock .Any (), projectID , providerID , pb .Entity_ENTITY_REPOSITORIES , "" , int64 (100 )).
446+ Return ([]* pb.EntityInstance {
447+ {Id : uuid .New ().String (), Name : "repo1" , Type : pb .Entity_ENTITY_REPOSITORIES },
448+ {Id : uuid .New ().String (), Name : "repo2" , Type : pb .Entity_ENTITY_REPOSITORIES },
449+ }, "" , nil )
450+ },
451+ validateResp : func (t * testing.T , resp * pb.ListEntitiesResponse ) {
452+ t .Helper ()
453+ assert .Len (t , resp .Results , 2 )
454+ assert .Nil (t , resp .Page )
455+ },
456+ },
457+ {
458+ name : "lists multiple entity types" ,
459+ request : & pb.ListEntitiesRequest {},
460+ setupMocks : func (provStore * mockproviders.MockProviderStore , svc * mockentitysvc.MockEntityService ) {
461+ provStore .EXPECT ().
462+ GetByName (gomock .Any (), projectID , providerName ).
463+ Return (& db.Provider {
464+ ID : providerID ,
465+ Name : providerName ,
466+ ProjectID : projectID ,
467+ }, nil )
468+
469+ svc .EXPECT ().
470+ ListEntities (gomock .Any (), projectID , providerID , pb .Entity_ENTITY_UNSPECIFIED , "" , int64 (100 )).
471+ Return ([]* pb.EntityInstance {
472+ {Id : uuid .New ().String (), Name : "repo1" , Type : pb .Entity_ENTITY_REPOSITORIES },
473+ {Id : uuid .New ().String (), Name : "repo1/pull/2" , Type : pb .Entity_ENTITY_PULL_REQUESTS },
474+ }, "" , nil )
475+ },
476+ validateResp : func (t * testing.T , resp * pb.ListEntitiesResponse ) {
477+ t .Helper ()
478+ assert .Len (t , resp .Results , 2 )
479+ assert .Nil (t , resp .Page )
480+ },
481+ },
482+ {
483+ name : "successfully lists entities with pagination" ,
484+ request : & pb.ListEntitiesRequest {
485+ EntityType : pb .Entity_ENTITY_REPOSITORIES ,
486+ Cursor : & pb.Cursor {
487+ Size : 1 ,
488+ },
489+ },
490+ setupMocks : func (provStore * mockproviders.MockProviderStore , svc * mockentitysvc.MockEntityService ) {
491+ provStore .EXPECT ().
492+ GetByName (gomock .Any (), projectID , providerName ).
493+ Return (& db.Provider {
494+ ID : providerID ,
495+ Name : providerName ,
496+ ProjectID : projectID ,
497+ }, nil )
498+
499+ svc .EXPECT ().
500+ ListEntities (gomock .Any (), projectID , providerID , pb .Entity_ENTITY_REPOSITORIES , "" , int64 (1 )).
501+ Return ([]* pb.EntityInstance {
502+ {Id : uuid .New ().String (), Name : "repo1" , Type : pb .Entity_ENTITY_REPOSITORIES },
503+ }, "next-cursor" , nil )
504+ },
505+ validateResp : func (t * testing.T , resp * pb.ListEntitiesResponse ) {
506+ t .Helper ()
507+ assert .Len (t , resp .Results , 1 )
508+ assert .NotNil (t , resp .Page )
509+ assert .Equal (t , "next-cursor" , resp .Page .Next .Cursor )
510+ assert .Equal (t , uint32 (1 ), resp .Page .Next .Size )
511+ },
512+ },
513+ {
514+ name : "fails when provider not found" ,
515+ request : & pb.ListEntitiesRequest {
516+ EntityType : pb .Entity_ENTITY_REPOSITORIES ,
517+ },
518+ setupMocks : func (provStore * mockproviders.MockProviderStore , _ * mockentitysvc.MockEntityService ) {
519+ provStore .EXPECT ().
520+ GetByName (gomock .Any (), projectID , providerName ).
521+ Return (nil , sql .ErrNoRows )
522+ },
523+ wantCode : codes .NotFound ,
524+ errContains : "provider not found" ,
525+ },
526+ {
527+ name : "handles service error" ,
528+ request : & pb.ListEntitiesRequest {
529+ EntityType : pb .Entity_ENTITY_REPOSITORIES ,
530+ },
531+ setupMocks : func (provStore * mockproviders.MockProviderStore , svc * mockentitysvc.MockEntityService ) {
532+ provStore .EXPECT ().
533+ GetByName (gomock .Any (), projectID , providerName ).
534+ Return (& db.Provider {
535+ ID : providerID ,
536+ Name : providerName ,
537+ ProjectID : projectID ,
538+ }, nil )
539+
540+ svc .EXPECT ().
541+ ListEntities (gomock .Any (), projectID , providerID , pb .Entity_ENTITY_REPOSITORIES , "" , int64 (100 )).
542+ Return (nil , "" , errors .New ("service error" ))
543+ },
544+ wantCode : codes .Internal ,
545+ },
546+ }
547+
548+ for _ , tt := range tests {
549+ t .Run (tt .name , func (t * testing.T ) {
550+ t .Parallel ()
551+
552+ ctrl := gomock .NewController (t )
553+ defer ctrl .Finish ()
554+
555+ mockProvStore := mockproviders .NewMockProviderStore (ctrl )
556+ mockEntitySvc := mockentitysvc .NewMockEntityService (ctrl )
557+
558+ if tt .setupMocks != nil {
559+ tt .setupMocks (mockProvStore , mockEntitySvc )
560+ }
561+
562+ server := & Server {
563+ providerStore : mockProvStore ,
564+ entityService : mockEntitySvc ,
565+ }
566+
567+ ctx := engcontext .WithEntityContext (context .Background (), & engcontext.EntityContext {
568+ Project : engcontext.Project {ID : projectID },
569+ Provider : engcontext.Provider {Name : providerName },
570+ })
571+
572+ resp , err := server .ListEntities (ctx , tt .request )
573+
574+ if tt .wantCode != codes .OK {
575+ require .Error (t , err )
576+
577+ if tt .wantCode != codes .Internal {
578+ st , ok := status .FromError (err )
579+ require .True (t , ok , "error should be a gRPC status error" )
580+ assert .Equal (t , tt .wantCode , st .Code ())
581+ }
582+ assert .Contains (t , err .Error (), tt .errContains )
583+ return
584+ }
585+
586+ require .NoError (t , err )
587+ require .NotNil (t , resp )
588+ if tt .validateResp != nil {
589+ tt .validateResp (t , resp )
590+ }
591+ })
592+ }
593+ }
0 commit comments