package main import ( "testing" "atlas9.dev/c/core" ) func TestAddMember(t *testing.T) { s := setupTestServer(t) userID := core.NewID() createTestUser(t, s.DB, userID) g := saveGroup(t, s.URL, "app.engineering", "Engineering") mustRPC[AddMemberReq, AddMemberRes](t, s.URL, "/members/add", AddMemberReq{GroupID: g.ID, UserID: userID}) res := mustRPC[ListMembersReq, ListMembersRes](t, s.URL, "/members/list", ListMembersReq{GroupID: g.ID}) if len(res.Items) != 1 || !res.Items[0].Equal(userID) { t.Errorf("members = %v, want [%s]", res.Items, userID) } } func TestAddMemberIdempotent(t *testing.T) { s := setupTestServer(t) userID := core.NewID() createTestUser(t, s.DB, userID) g := saveGroup(t, s.URL, "app.engineering", "Engineering") mustRPC[AddMemberReq, AddMemberRes](t, s.URL, "/members/add", AddMemberReq{GroupID: g.ID, UserID: userID}) mustRPC[AddMemberReq, AddMemberRes](t, s.URL, "/members/add", AddMemberReq{GroupID: g.ID, UserID: userID}) res := mustRPC[ListMembersReq, ListMembersRes](t, s.URL, "/members/list", ListMembersReq{GroupID: g.ID}) if len(res.Items) != 1 { t.Errorf("expected 1 member, got %d", len(res.Items)) } } func TestRemoveMember(t *testing.T) { s := setupTestServer(t) userID := core.NewID() createTestUser(t, s.DB, userID) g := saveGroup(t, s.URL, "app.engineering", "Engineering") mustRPC[AddMemberReq, AddMemberRes](t, s.URL, "/members/add", AddMemberReq{GroupID: g.ID, UserID: userID}) mustRPC[RemoveMemberReq, RemoveMemberRes](t, s.URL, "/members/remove", RemoveMemberReq{GroupID: g.ID, UserID: userID}) res := mustRPC[ListMembersReq, ListMembersRes](t, s.URL, "/members/list", ListMembersReq{GroupID: g.ID}) if len(res.Items) != 0 { t.Errorf("expected 0 members, got %d", len(res.Items)) } } func TestListUserGroups(t *testing.T) { s := setupTestServer(t) userID := core.NewID() createTestUser(t, s.DB, userID) g1 := saveGroup(t, s.URL, "app.engineering", "Engineering") g2 := saveGroup(t, s.URL, "app.design", "Design") mustRPC[AddMemberReq, AddMemberRes](t, s.URL, "/members/add", AddMemberReq{GroupID: g1.ID, UserID: userID}) mustRPC[AddMemberReq, AddMemberRes](t, s.URL, "/members/add", AddMemberReq{GroupID: g2.ID, UserID: userID}) res := mustRPC[ListUserGroupsReq, ListUserGroupsRes](t, s.URL, "/members/list-user-groups", ListUserGroupsReq{UserID: userID}) if len(res.Items) != 2 { t.Errorf("expected 2 groups, got %d", len(res.Items)) } } func TestDeleteGroupCleansUpMemberships(t *testing.T) { s := setupTestServer(t) userID := core.NewID() createTestUser(t, s.DB, userID) g := saveGroup(t, s.URL, "app.engineering", "Engineering") mustRPC[AddMemberReq, AddMemberRes](t, s.URL, "/members/add", AddMemberReq{GroupID: g.ID, UserID: userID}) mustRPC[DeleteGroupReq, DeleteGroupRes](t, s.URL, "/groups/delete", DeleteGroupReq{ID: g.ID}) // Membership should be gone. res := mustRPC[ListUserGroupsReq, ListUserGroupsRes](t, s.URL, "/members/list-user-groups", ListUserGroupsReq{UserID: userID}) if len(res.Items) != 0 { t.Errorf("expected 0 groups after delete, got %d", len(res.Items)) } }