11package idpsync_test
22
33import (
4+ "database/sql"
45 "testing"
56
67 "github.com/golang-jwt/jwt/v4"
@@ -9,9 +10,10 @@ import (
910
1011 "cdr.dev/slog/sloggers/slogtest"
1112 "github.com/coder/coder/v2/coderd/database"
13+ "github.com/coder/coder/v2/coderd/database/db2sdk"
14+ "github.com/coder/coder/v2/coderd/database/dbfake"
1215 "github.com/coder/coder/v2/coderd/database/dbgen"
1316 "github.com/coder/coder/v2/coderd/database/dbtestutil"
14- "github.com/coder/coder/v2/coderd/database/dbtime"
1517 "github.com/coder/coder/v2/coderd/idpsync"
1618 "github.com/coder/coder/v2/coderd/runtimeconfig"
1719 "github.com/coder/coder/v2/testutil"
@@ -46,29 +48,28 @@ func TestParseOrganizationClaims(t *testing.T) {
4648func TestSyncOrganizations (t * testing.T ) {
4749 t .Parallel ()
4850
51+ // This test creates some deleted organizations and checks the behavior is
52+ // correct.
4953 t .Run ("SyncUserToDeletedOrg" , func (t * testing.T ) {
5054 ctx := testutil .Context (t , testutil .WaitMedium )
5155 db , _ := dbtestutil .NewDB (t )
5256 user := dbgen .User (t , db , database.User {})
53- extra := dbgen .Organization (t , db , database.Organization {})
54- dbgen .OrganizationMember (t , db , database.OrganizationMember {
55- UserID : user .ID ,
56- OrganizationID : extra .ID ,
57- })
5857
59- // Create a new organization, add in the user as a member, then delete
60- // the org.
61- org := dbgen .Organization (t , db , database.Organization {})
62- dbgen .OrganizationMember (t , db , database.OrganizationMember {
63- UserID : user .ID ,
64- OrganizationID : org .ID ,
65- })
66-
67- err := db .UpdateOrganizationDeletedByID (ctx , database.UpdateOrganizationDeletedByIDParams {
68- UpdatedAt : dbtime .Now (),
69- ID : org .ID ,
70- })
71- require .NoError (t , err )
58+ // Create orgs for:
59+ // - stays = User is a member, and stays
60+ // - leaves = User is a member, and leaves
61+ // - joins = User is not a member, and joins
62+ // For deleted orgs, the user **should not** be a member of afterwards.
63+ // - deletedStays = User is a member of deleted org, and wants to stay
64+ // - deletedLeaves = User is a member of deleted org, and wants to leave
65+ // - deletedJoins = User is not a member of deleted org, and wants to join
66+ stays := dbfake .Organization (t , db ).Members (user ).Do ()
67+ leaves := dbfake .Organization (t , db ).Members (user ).Do ()
68+ joins := dbfake .Organization (t , db ).Do ()
69+
70+ deletedStays := dbfake .Organization (t , db ).Members (user ).Deleted (true ).Do ()
71+ deletedLeaves := dbfake .Organization (t , db ).Members (user ).Deleted (true ).Do ()
72+ deletedJoins := dbfake .Organization (t , db ).Deleted (true ).Do ()
7273
7374 // Now sync the user to the deleted organization
7475 s := idpsync .NewAGPLSync (
@@ -77,27 +78,34 @@ func TestSyncOrganizations(t *testing.T) {
7778 idpsync.DeploymentSyncSettings {
7879 OrganizationField : "orgs" ,
7980 OrganizationMapping : map [string ][]uuid.UUID {
80- "random" : {org .ID },
81- "noise" : {uuid .New ()},
81+ "stay" : {stays .Org .ID , deletedStays .Org .ID },
82+ "leave" : {leaves .Org .ID , deletedLeaves .Org .ID },
83+ "join" : {joins .Org .ID , deletedJoins .Org .ID },
8284 },
8385 OrganizationAssignDefault : false ,
8486 },
8587 )
8688
87- err = s .SyncOrganizations (ctx , db , user , idpsync.OrganizationParams {
89+ err : = s .SyncOrganizations (ctx , db , user , idpsync.OrganizationParams {
8890 SyncEntitled : true ,
8991 MergedClaims : map [string ]interface {}{
90- "orgs" : []string {"random " , "noise " },
92+ "orgs" : []string {"stay " , "join " },
9193 },
9294 })
9395 require .NoError (t , err )
9496
95- mems , err := db .OrganizationMembers (ctx , database.OrganizationMembersParams {
96- OrganizationID : org .ID ,
97- UserID : user .ID ,
98- IncludeSystem : false ,
97+ orgs , err := db .GetOrganizationsByUserID (ctx , database.GetOrganizationsByUserIDParams {
98+ UserID : user .ID ,
99+ Deleted : sql.NullBool {},
99100 })
100101 require .NoError (t , err )
101- require .Len (t , mems , 1 )
102+ require .Len (t , orgs , 2 )
103+
104+ // Verify the user only exists in 2 orgs. The one they stayed, and the one they
105+ // joined.
106+ inIDs := db2sdk .List (orgs , func (org database.Organization ) uuid.UUID {
107+ return org .ID
108+ })
109+ require .ElementsMatch (t , []uuid.UUID {stays .Org .ID , joins .Org .ID }, inIDs )
102110 })
103111}
0 commit comments