Skip to content

Commit 26d18cc

Browse files
committed
test(dbauthz): migrate TestGroup to mocked db\n\n- Switch TestGroup subtests to s.Mocked\n- Seed data with testutil.Fake and gofakeit\n- Add gomock expectations for Group methods\n\nCo-authored-by: hugodutka <28019628+hugodutka@users.noreply.github.com>
1 parent 11c13cd commit 26d18cc

File tree

1 file changed

+124
-128
lines changed

1 file changed

+124
-128
lines changed

coderd/database/dbauthz/dbauthz_test.go

Lines changed: 124 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -481,158 +481,154 @@ func (s *MethodTestSuite) TestFile() {
481481
}
482482

483483
func (s *MethodTestSuite) TestGroup() {
484-
s.Run("DeleteGroupByID", s.Subtest(func(db database.Store, check *expects) {
485-
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
486-
g := dbgen.Group(s.T(), db, database.Group{})
484+
s.Run("DeleteGroupByID", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
485+
g := testutil.Fake(s.T(), faker, database.Group{})
486+
dbm.EXPECT().GetGroupByID(gomock.Any(), g.ID).Return(g, nil).AnyTimes()
487+
dbm.EXPECT().DeleteGroupByID(gomock.Any(), g.ID).Return(nil).AnyTimes()
487488
check.Args(g.ID).Asserts(g, policy.ActionDelete).Returns()
488489
}))
489-
s.Run("DeleteGroupMemberFromGroup", s.Subtest(func(db database.Store, check *expects) {
490-
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
491-
g := dbgen.Group(s.T(), db, database.Group{})
492-
u := dbgen.User(s.T(), db, database.User{})
493-
m := dbgen.GroupMember(s.T(), db, database.GroupMemberTable{
494-
GroupID: g.ID,
495-
UserID: u.ID,
496-
})
497-
check.Args(database.DeleteGroupMemberFromGroupParams{
498-
UserID: m.UserID,
499-
GroupID: g.ID,
500-
}).Asserts(g, policy.ActionUpdate).Returns()
490+
491+
s.Run("DeleteGroupMemberFromGroup", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
492+
g := testutil.Fake(s.T(), faker, database.Group{})
493+
u := testutil.Fake(s.T(), faker, database.User{})
494+
m := testutil.Fake(s.T(), faker, database.GroupMember{GroupID: g.ID, UserID: u.ID})
495+
dbm.EXPECT().GetGroupByID(gomock.Any(), g.ID).Return(g, nil).AnyTimes()
496+
dbm.EXPECT().DeleteGroupMemberFromGroup(gomock.Any(), database.DeleteGroupMemberFromGroupParams{UserID: m.UserID, GroupID: g.ID}).Return(nil).AnyTimes()
497+
check.Args(database.DeleteGroupMemberFromGroupParams{UserID: m.UserID, GroupID: g.ID}).Asserts(g, policy.ActionUpdate).Returns()
501498
}))
502-
s.Run("GetGroupByID", s.Subtest(func(db database.Store, check *expects) {
503-
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
504-
g := dbgen.Group(s.T(), db, database.Group{})
499+
500+
s.Run("GetGroupByID", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
501+
g := testutil.Fake(s.T(), faker, database.Group{})
502+
dbm.EXPECT().GetGroupByID(gomock.Any(), g.ID).Return(g, nil).AnyTimes()
505503
check.Args(g.ID).Asserts(g, policy.ActionRead).Returns(g)
506504
}))
507-
s.Run("GetGroupByOrgAndName", s.Subtest(func(db database.Store, check *expects) {
508-
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
509-
g := dbgen.Group(s.T(), db, database.Group{})
510-
check.Args(database.GetGroupByOrgAndNameParams{
511-
OrganizationID: g.OrganizationID,
512-
Name: g.Name,
513-
}).Asserts(g, policy.ActionRead).Returns(g)
505+
506+
s.Run("GetGroupByOrgAndName", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
507+
g := testutil.Fake(s.T(), faker, database.Group{})
508+
dbm.EXPECT().GetGroupByOrgAndName(gomock.Any(), database.GetGroupByOrgAndNameParams{OrganizationID: g.OrganizationID, Name: g.Name}).Return(g, nil).AnyTimes()
509+
check.Args(database.GetGroupByOrgAndNameParams{OrganizationID: g.OrganizationID, Name: g.Name}).Asserts(g, policy.ActionRead).Returns(g)
514510
}))
515-
s.Run("GetGroupMembersByGroupID", s.Subtest(func(db database.Store, check *expects) {
516-
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
517-
g := dbgen.Group(s.T(), db, database.Group{})
518-
u := dbgen.User(s.T(), db, database.User{})
519-
gm := dbgen.GroupMember(s.T(), db, database.GroupMemberTable{GroupID: g.ID, UserID: u.ID})
520-
check.Args(database.GetGroupMembersByGroupIDParams{
521-
GroupID: g.ID,
522-
IncludeSystem: false,
523-
}).Asserts(gm, policy.ActionRead)
511+
512+
s.Run("GetGroupMembersByGroupID", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
513+
g := testutil.Fake(s.T(), faker, database.Group{})
514+
u := testutil.Fake(s.T(), faker, database.User{})
515+
gm := testutil.Fake(s.T(), faker, database.GroupMember{GroupID: g.ID, UserID: u.ID})
516+
arg := database.GetGroupMembersByGroupIDParams{GroupID: g.ID, IncludeSystem: false}
517+
dbm.EXPECT().GetGroupMembersByGroupID(gomock.Any(), arg).Return([]database.GroupMember{gm}, nil).AnyTimes()
518+
check.Args(arg).Asserts(gm, policy.ActionRead)
524519
}))
525-
s.Run("GetGroupMembersCountByGroupID", s.Subtest(func(db database.Store, check *expects) {
526-
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
527-
g := dbgen.Group(s.T(), db, database.Group{})
528-
check.Args(database.GetGroupMembersCountByGroupIDParams{
529-
GroupID: g.ID,
530-
IncludeSystem: false,
531-
}).Asserts(g, policy.ActionRead)
520+
521+
s.Run("GetGroupMembersCountByGroupID", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
522+
g := testutil.Fake(s.T(), faker, database.Group{})
523+
arg := database.GetGroupMembersCountByGroupIDParams{GroupID: g.ID, IncludeSystem: false}
524+
dbm.EXPECT().GetGroupByID(gomock.Any(), g.ID).Return(g, nil).AnyTimes()
525+
dbm.EXPECT().GetGroupMembersCountByGroupID(gomock.Any(), arg).Return(int64(0), nil).AnyTimes()
526+
check.Args(arg).Asserts(g, policy.ActionRead)
532527
}))
533-
s.Run("GetGroupMembers", s.Subtest(func(db database.Store, check *expects) {
534-
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
535-
g := dbgen.Group(s.T(), db, database.Group{})
536-
u := dbgen.User(s.T(), db, database.User{})
537-
dbgen.GroupMember(s.T(), db, database.GroupMemberTable{GroupID: g.ID, UserID: u.ID})
528+
529+
s.Run("GetGroupMembers", s.Mocked(func(dbm *dbmock.MockStore, _ *gofakeit.Faker, check *expects) {
530+
dbm.EXPECT().GetGroupMembers(gomock.Any(), false).Return([]database.GroupMember{}, nil).AnyTimes()
538531
check.Args(false).Asserts(rbac.ResourceSystem, policy.ActionRead)
539532
}))
540-
s.Run("System/GetGroups", s.Subtest(func(db database.Store, check *expects) {
541-
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
542-
_ = dbgen.Group(s.T(), db, database.Group{})
543-
check.Args(database.GetGroupsParams{}).
544-
Asserts(rbac.ResourceSystem, policy.ActionRead)
533+
534+
s.Run("System/GetGroups", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
535+
o := testutil.Fake(s.T(), faker, database.Organization{})
536+
g := testutil.Fake(s.T(), faker, database.Group{OrganizationID: o.ID})
537+
row := database.GetGroupsRow{Group: g, OrganizationName: o.Name, OrganizationDisplayName: o.DisplayName}
538+
dbm.EXPECT().GetGroups(gomock.Any(), database.GetGroupsParams{}).Return([]database.GetGroupsRow{row}, nil).AnyTimes()
539+
check.Args(database.GetGroupsParams{}).Asserts(rbac.ResourceSystem, policy.ActionRead)
545540
}))
546-
s.Run("GetGroups", s.Subtest(func(db database.Store, check *expects) {
547-
o := dbgen.Organization(s.T(), db, database.Organization{})
548-
g := dbgen.Group(s.T(), db, database.Group{OrganizationID: o.ID})
549-
u := dbgen.User(s.T(), db, database.User{})
550-
gm := dbgen.GroupMember(s.T(), db, database.GroupMemberTable{GroupID: g.ID, UserID: u.ID})
551-
check.Args(database.GetGroupsParams{
552-
OrganizationID: g.OrganizationID,
553-
HasMemberID: gm.UserID,
554-
}).Asserts(rbac.ResourceSystem, policy.ActionRead, g, policy.ActionRead).
555-
// Fail the system resource skip
556-
FailSystemObjectChecks()
541+
542+
s.Run("GetGroups", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
543+
o := testutil.Fake(s.T(), faker, database.Organization{})
544+
g := testutil.Fake(s.T(), faker, database.Group{OrganizationID: o.ID})
545+
u := testutil.Fake(s.T(), faker, database.User{})
546+
gm := testutil.Fake(s.T(), faker, database.GroupMember{GroupID: g.ID, UserID: u.ID})
547+
params := database.GetGroupsParams{OrganizationID: g.OrganizationID, HasMemberID: gm.UserID}
548+
row := database.GetGroupsRow{Group: g, OrganizationName: o.Name, OrganizationDisplayName: o.DisplayName}
549+
dbm.EXPECT().GetGroups(gomock.Any(), params).Return([]database.GetGroupsRow{row}, nil).AnyTimes()
550+
check.Args(params).Asserts(rbac.ResourceSystem, policy.ActionRead, g, policy.ActionRead).FailSystemObjectChecks()
557551
}))
558-
s.Run("InsertAllUsersGroup", s.Subtest(func(db database.Store, check *expects) {
559-
o := dbgen.Organization(s.T(), db, database.Organization{})
552+
553+
s.Run("InsertAllUsersGroup", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
554+
o := testutil.Fake(s.T(), faker, database.Organization{})
555+
ret := testutil.Fake(s.T(), faker, database.Group{OrganizationID: o.ID})
556+
dbm.EXPECT().InsertAllUsersGroup(gomock.Any(), o.ID).Return(ret, nil).AnyTimes()
560557
check.Args(o.ID).Asserts(rbac.ResourceGroup.InOrg(o.ID), policy.ActionCreate)
561558
}))
562-
s.Run("InsertGroup", s.Subtest(func(db database.Store, check *expects) {
563-
o := dbgen.Organization(s.T(), db, database.Organization{})
564-
check.Args(database.InsertGroupParams{
565-
OrganizationID: o.ID,
566-
Name: "test",
567-
}).Asserts(rbac.ResourceGroup.InOrg(o.ID), policy.ActionCreate)
559+
560+
s.Run("InsertGroup", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
561+
o := testutil.Fake(s.T(), faker, database.Organization{})
562+
arg := database.InsertGroupParams{OrganizationID: o.ID, Name: "test"}
563+
ret := testutil.Fake(s.T(), faker, database.Group{OrganizationID: o.ID, Name: arg.Name})
564+
dbm.EXPECT().InsertGroup(gomock.Any(), arg).Return(ret, nil).AnyTimes()
565+
check.Args(arg).Asserts(rbac.ResourceGroup.InOrg(o.ID), policy.ActionCreate)
568566
}))
569-
s.Run("InsertGroupMember", s.Subtest(func(db database.Store, check *expects) {
570-
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
571-
g := dbgen.Group(s.T(), db, database.Group{})
572-
check.Args(database.InsertGroupMemberParams{
573-
UserID: uuid.New(),
574-
GroupID: g.ID,
575-
}).Asserts(g, policy.ActionUpdate).Returns()
567+
568+
s.Run("InsertGroupMember", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
569+
g := testutil.Fake(s.T(), faker, database.Group{})
570+
arg := database.InsertGroupMemberParams{UserID: uuid.New(), GroupID: g.ID}
571+
dbm.EXPECT().GetGroupByID(gomock.Any(), g.ID).Return(g, nil).AnyTimes()
572+
dbm.EXPECT().InsertGroupMember(gomock.Any(), arg).Return(nil).AnyTimes()
573+
check.Args(arg).Asserts(g, policy.ActionUpdate).Returns()
576574
}))
577-
s.Run("InsertUserGroupsByName", s.Subtest(func(db database.Store, check *expects) {
578-
o := dbgen.Organization(s.T(), db, database.Organization{})
579-
u1 := dbgen.User(s.T(), db, database.User{})
580-
g1 := dbgen.Group(s.T(), db, database.Group{OrganizationID: o.ID})
581-
g2 := dbgen.Group(s.T(), db, database.Group{OrganizationID: o.ID})
582-
check.Args(database.InsertUserGroupsByNameParams{
583-
OrganizationID: o.ID,
584-
UserID: u1.ID,
585-
GroupNames: slice.New(g1.Name, g2.Name),
586-
}).Asserts(rbac.ResourceGroup.InOrg(o.ID), policy.ActionUpdate).Returns()
575+
576+
s.Run("InsertUserGroupsByName", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
577+
o := testutil.Fake(s.T(), faker, database.Organization{})
578+
u1 := testutil.Fake(s.T(), faker, database.User{})
579+
g1 := testutil.Fake(s.T(), faker, database.Group{OrganizationID: o.ID})
580+
g2 := testutil.Fake(s.T(), faker, database.Group{OrganizationID: o.ID})
581+
arg := database.InsertUserGroupsByNameParams{OrganizationID: o.ID, UserID: u1.ID, GroupNames: slice.New(g1.Name, g2.Name)}
582+
dbm.EXPECT().InsertUserGroupsByName(gomock.Any(), arg).Return(nil).AnyTimes()
583+
check.Args(arg).Asserts(rbac.ResourceGroup.InOrg(o.ID), policy.ActionUpdate).Returns()
587584
}))
588-
s.Run("InsertUserGroupsByID", s.Subtest(func(db database.Store, check *expects) {
589-
o := dbgen.Organization(s.T(), db, database.Organization{})
590-
u1 := dbgen.User(s.T(), db, database.User{})
591-
g1 := dbgen.Group(s.T(), db, database.Group{OrganizationID: o.ID})
592-
g2 := dbgen.Group(s.T(), db, database.Group{OrganizationID: o.ID})
593-
g3 := dbgen.Group(s.T(), db, database.Group{OrganizationID: o.ID})
594-
_ = dbgen.GroupMember(s.T(), db, database.GroupMemberTable{GroupID: g1.ID, UserID: u1.ID})
585+
586+
s.Run("InsertUserGroupsByID", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
587+
o := testutil.Fake(s.T(), faker, database.Organization{})
588+
u1 := testutil.Fake(s.T(), faker, database.User{})
589+
g1 := testutil.Fake(s.T(), faker, database.Group{OrganizationID: o.ID})
590+
g2 := testutil.Fake(s.T(), faker, database.Group{OrganizationID: o.ID})
591+
g3 := testutil.Fake(s.T(), faker, database.Group{OrganizationID: o.ID})
595592
returns := slice.New(g2.ID, g3.ID)
596593
if !dbtestutil.WillUsePostgres() {
597594
returns = slice.New(g1.ID, g2.ID, g3.ID)
598595
}
599-
check.Args(database.InsertUserGroupsByIDParams{
600-
UserID: u1.ID,
601-
GroupIds: slice.New(g1.ID, g2.ID, g3.ID),
602-
}).Asserts(rbac.ResourceSystem, policy.ActionUpdate).Returns(returns)
596+
arg := database.InsertUserGroupsByIDParams{UserID: u1.ID, GroupIds: slice.New(g1.ID, g2.ID, g3.ID)}
597+
dbm.EXPECT().InsertUserGroupsByID(gomock.Any(), arg).Return(returns, nil).AnyTimes()
598+
check.Args(arg).Asserts(rbac.ResourceSystem, policy.ActionUpdate).Returns(returns)
603599
}))
604-
s.Run("RemoveUserFromAllGroups", s.Subtest(func(db database.Store, check *expects) {
605-
o := dbgen.Organization(s.T(), db, database.Organization{})
606-
u1 := dbgen.User(s.T(), db, database.User{})
607-
g1 := dbgen.Group(s.T(), db, database.Group{OrganizationID: o.ID})
608-
g2 := dbgen.Group(s.T(), db, database.Group{OrganizationID: o.ID})
609-
_ = dbgen.GroupMember(s.T(), db, database.GroupMemberTable{GroupID: g1.ID, UserID: u1.ID})
610-
_ = dbgen.GroupMember(s.T(), db, database.GroupMemberTable{GroupID: g2.ID, UserID: u1.ID})
600+
601+
s.Run("RemoveUserFromAllGroups", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
602+
u1 := testutil.Fake(s.T(), faker, database.User{})
603+
dbm.EXPECT().RemoveUserFromAllGroups(gomock.Any(), u1.ID).Return(nil).AnyTimes()
611604
check.Args(u1.ID).Asserts(rbac.ResourceSystem, policy.ActionUpdate).Returns()
612605
}))
613-
s.Run("RemoveUserFromGroups", s.Subtest(func(db database.Store, check *expects) {
614-
o := dbgen.Organization(s.T(), db, database.Organization{})
615-
u1 := dbgen.User(s.T(), db, database.User{})
616-
g1 := dbgen.Group(s.T(), db, database.Group{OrganizationID: o.ID})
617-
g2 := dbgen.Group(s.T(), db, database.Group{OrganizationID: o.ID})
618-
_ = dbgen.GroupMember(s.T(), db, database.GroupMemberTable{GroupID: g1.ID, UserID: u1.ID})
619-
_ = dbgen.GroupMember(s.T(), db, database.GroupMemberTable{GroupID: g2.ID, UserID: u1.ID})
620-
check.Args(database.RemoveUserFromGroupsParams{
621-
UserID: u1.ID,
622-
GroupIds: []uuid.UUID{g1.ID, g2.ID},
623-
}).Asserts(rbac.ResourceSystem, policy.ActionUpdate).Returns(slice.New(g1.ID, g2.ID))
624-
}))
625-
s.Run("UpdateGroupByID", s.Subtest(func(db database.Store, check *expects) {
626-
dbtestutil.DisableForeignKeysAndTriggers(s.T(), db)
627-
g := dbgen.Group(s.T(), db, database.Group{})
628-
check.Args(database.UpdateGroupByIDParams{
629-
ID: g.ID,
630-
}).Asserts(g, policy.ActionUpdate)
631-
}))
632-
s.Run("ValidateGroupIDs", s.Subtest(func(db database.Store, check *expects) {
633-
o := dbgen.Organization(s.T(), db, database.Organization{})
634-
g := dbgen.Group(s.T(), db, database.Group{OrganizationID: o.ID})
635-
check.Args([]uuid.UUID{g.ID}).Asserts(rbac.ResourceSystem, policy.ActionRead)
606+
607+
s.Run("RemoveUserFromGroups", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
608+
o := testutil.Fake(s.T(), faker, database.Organization{})
609+
u1 := testutil.Fake(s.T(), faker, database.User{})
610+
g1 := testutil.Fake(s.T(), faker, database.Group{OrganizationID: o.ID})
611+
g2 := testutil.Fake(s.T(), faker, database.Group{OrganizationID: o.ID})
612+
arg := database.RemoveUserFromGroupsParams{UserID: u1.ID, GroupIds: []uuid.UUID{g1.ID, g2.ID}}
613+
dbm.EXPECT().RemoveUserFromGroups(gomock.Any(), arg).Return(slice.New(g1.ID, g2.ID), nil).AnyTimes()
614+
check.Args(arg).Asserts(rbac.ResourceSystem, policy.ActionUpdate).Returns(slice.New(g1.ID, g2.ID))
615+
}))
616+
617+
s.Run("UpdateGroupByID", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
618+
g := testutil.Fake(s.T(), faker, database.Group{})
619+
arg := database.UpdateGroupByIDParams{ID: g.ID}
620+
ret := testutil.Fake(s.T(), faker, database.Group{ID: g.ID})
621+
dbm.EXPECT().GetGroupByID(gomock.Any(), g.ID).Return(g, nil).AnyTimes()
622+
dbm.EXPECT().UpdateGroupByID(gomock.Any(), arg).Return(ret, nil).AnyTimes()
623+
check.Args(arg).Asserts(g, policy.ActionUpdate)
624+
}))
625+
626+
s.Run("ValidateGroupIDs", s.Mocked(func(dbm *dbmock.MockStore, faker *gofakeit.Faker, check *expects) {
627+
o := testutil.Fake(s.T(), faker, database.Organization{})
628+
g := testutil.Fake(s.T(), faker, database.Group{OrganizationID: o.ID})
629+
ids := []uuid.UUID{g.ID}
630+
dbm.EXPECT().ValidateGroupIDs(gomock.Any(), ids).Return(database.ValidateGroupIDsRow{}, nil).AnyTimes()
631+
check.Args(ids).Asserts(rbac.ResourceSystem, policy.ActionRead)
636632
}))
637633
}
638634

0 commit comments

Comments
 (0)