github.com/clerkinc/clerk-sdk-go@v1.49.1/tests/integration/organizations_test.go (about) 1 //go:build integration 2 // +build integration 3 4 package integration 5 6 import ( 7 "encoding/json" 8 "os" 9 "path" 10 "testing" 11 12 "github.com/clerkinc/clerk-sdk-go/clerk" 13 "github.com/stretchr/testify/assert" 14 ) 15 16 type organizationMetadata struct { 17 AppID int `json:"app_id"` 18 } 19 20 func TestOrganizations(t *testing.T) { 21 client := createClient() 22 23 limit := 2 24 users, err := client.Users().ListAll(clerk.ListAllUsersParams{ 25 Limit: &limit, 26 }) 27 if err != nil { 28 t.Fatalf("Users.ListAll returned error: %v", err) 29 } 30 if len(users) != 2 { 31 t.Fatalf("Users.ListAll returned %d results, expected 2", len(users)) 32 } 33 34 // Delete all pre existing org before running the tests. 35 deleteAllOrgs, err := client.Organizations().ListAll(clerk.ListAllOrganizationsParams{ 36 IncludeMembersCount: true, 37 }) 38 for _, organization := range deleteAllOrgs.Data { 39 _, err := client.Organizations().Delete(organization.ID) 40 assert.NoError(t, err) 41 } 42 43 newOrganization, err := client.Organizations().Create(clerk.CreateOrganizationParams{ 44 Name: "my-org", 45 CreatedBy: users[0].ID, 46 }) 47 if err != nil { 48 t.Fatal(err) 49 } 50 assert.NotEmpty(t, newOrganization.ID) 51 assert.Equal(t, "my-org", newOrganization.Name) 52 53 membershipLimit := 20 54 updatedOrganization, err := client.Organizations().Update(newOrganization.ID, clerk.UpdateOrganizationParams{ 55 MaxAllowedMemberships: &membershipLimit, 56 }) 57 if err != nil { 58 t.Fatal(err) 59 } 60 assert.Equal(t, membershipLimit, updatedOrganization.MaxAllowedMemberships) 61 62 privateMetadata, err := json.Marshal( 63 organizationMetadata{ 64 AppID: 6, 65 }, 66 ) 67 publicMetadata, err := json.Marshal( 68 organizationMetadata{ 69 AppID: 2, 70 }, 71 ) 72 updatedOrganization, err = client.Organizations().Update(newOrganization.ID, clerk.UpdateOrganizationParams{ 73 PrivateMetadata: privateMetadata, 74 PublicMetadata: publicMetadata, 75 }) 76 if err != nil { 77 t.Fatal(err) 78 } 79 assert.Equal(t, updatedOrganization.PrivateMetadata, json.RawMessage(privateMetadata)) 80 assert.Equal(t, updatedOrganization.PublicMetadata, json.RawMessage(publicMetadata)) 81 82 slug := "my-org-slug" 83 updatedOrganization, err = client.Organizations().Update(newOrganization.ID, clerk.UpdateOrganizationParams{ 84 Slug: &slug, 85 }) 86 if err != nil { 87 t.Fatal(err) 88 } 89 assert.Equal(t, slug, *updatedOrganization.Slug) 90 91 // Update organization logo 92 assert.Nil(t, updatedOrganization.LogoURL) 93 filename := "200x200-grayscale.jpg" 94 file, err := os.Open(path.Join("..", "..", "testdata", filename)) 95 if err != nil { 96 t.Fatal(err) 97 } 98 defer file.Close() 99 updatedOrganization, err = client.Organizations().UpdateLogo(updatedOrganization.ID, clerk.UpdateOrganizationLogoParams{ 100 File: file, 101 Filename: &filename, 102 UploaderUserID: users[0].ID, 103 }) 104 assert.NoError(t, err) 105 assert.NotNil(t, updatedOrganization.LogoURL) 106 107 // Delete organization logo 108 updatedOrganization, err = client.Organizations().DeleteLogo(updatedOrganization.ID) 109 assert.NoError(t, err) 110 assert.Nil(t, updatedOrganization.LogoURL) 111 112 organizations, err := client.Organizations().ListAll(clerk.ListAllOrganizationsParams{ 113 IncludeMembersCount: true, 114 }) 115 if err != nil { 116 t.Fatalf("Organizations.ListAll returned error: %v", err) 117 } 118 if organizations == nil { 119 t.Fatalf("Organizations.ListAll returned nil") 120 } 121 122 assert.Greater(t, len(organizations.Data), 0) 123 assert.Greater(t, organizations.TotalCount, int64(0)) 124 for _, organization := range organizations.Data { 125 assert.Greater(t, *organization.MembersCount, 0) 126 } 127 128 newOrganization2, err := client.Organizations().Create(clerk.CreateOrganizationParams{ 129 Name: "my-org-2", 130 CreatedBy: users[0].ID, 131 }) 132 if err != nil { 133 t.Fatal(err) 134 } 135 assert.NotEmpty(t, newOrganization2.ID) 136 assert.Equal(t, "my-org-2", newOrganization2.Name) 137 138 // Should sort Organizations by name DESC 139 orderBy := "-name" 140 organizations, err = client.Organizations().ListAll(clerk.ListAllOrganizationsParams{ 141 OrderBy: &orderBy, 142 }) 143 assert.NoError(t, err) 144 assert.Equal(t, organizations.Data[0].ID, newOrganization2.ID) 145 146 orderBy = "+name" 147 // Should short Organizations by name ASC 148 organizations, err = client.Organizations().ListAll(clerk.ListAllOrganizationsParams{ 149 OrderBy: &orderBy, 150 }) 151 assert.NoError(t, err) 152 assert.Equal(t, organizations.Data[0].ID, newOrganization.ID) 153 154 // Should return 1 organization - exact match on ID 155 organizations, err = client.Organizations().ListAll(clerk.ListAllOrganizationsParams{ 156 Query: newOrganization.ID, 157 }) 158 159 if err != nil { 160 t.Fatalf("Organizations.ListAll returned error: %v", err) 161 } 162 if organizations == nil { 163 t.Fatalf("Organizations.ListAll returned nil") 164 } 165 166 assert.Equal(t, len(organizations.Data), 1) 167 assert.Equal(t, organizations.Data[0].ID, newOrganization.ID) 168 assert.Greater(t, organizations.TotalCount, int64(0)) 169 170 // Should return organizations with name containing "my-org" 171 organizations, err = client.Organizations().ListAll(clerk.ListAllOrganizationsParams{ 172 Query: "my-org", 173 }) 174 175 if err != nil { 176 t.Fatalf("Organizations.ListAll returned error: %v", err) 177 } 178 if organizations == nil { 179 t.Fatalf("Organizations.ListAll returned nil") 180 } 181 182 assert.Greater(t, len(organizations.Data), 0) 183 assert.Greater(t, organizations.TotalCount, int64(0)) 184 for _, organization := range organizations.Data { 185 assert.Contains(t, organization.Name, "my-org") 186 } 187 188 // Should return 2 results when using the userID as search param with ('+') prefix. 189 filteredOrganizationByUserID, err := client.Organizations().ListAll(clerk.ListAllOrganizationsParams{ 190 UserIDs: []string{"+" + users[0].ID}, 191 }) 192 assert.NoError(t, err) 193 194 assert.Equal(t, len(filteredOrganizationByUserID.Data), 2) 195 assert.Equal(t, filteredOrganizationByUserID.TotalCount, int64(2)) 196 197 // Should return non empty list 198 organizationMemberships, err := client.Organizations().ListMemberships(clerk.ListOrganizationMembershipsParams{ 199 OrganizationID: newOrganization.ID, 200 }) 201 if err != nil { 202 t.Fatalf("Organizations.ListMemberships returned error: %v", err) 203 } 204 if organizationMemberships == nil { 205 t.Fatalf("Organizations.ListMemberships returned nil") 206 } 207 assert.Greater(t, len(organizationMemberships.Data), 0) 208 assert.Greater(t, organizationMemberships.TotalCount, int64(0)) 209 for _, organizationMembership := range organizationMemberships.Data { 210 assert.NotEmpty(t, organizationMembership.ID) 211 } 212 213 // Should return 1 result when providing matching query 214 organizationMembershipsWithQuery, err := client.Organizations().ListMemberships(clerk.ListOrganizationMembershipsParams{ 215 OrganizationID: newOrganization.ID, 216 Query: &organizationMemberships.Data[0].PublicUserData.UserID, 217 }) 218 if err != nil { 219 t.Fatalf("Organizations.ListMemberships with query returned error: %v", err) 220 } 221 if organizationMembershipsWithQuery == nil { 222 t.Fatalf("Organizations.ListMemberships with query returned nil") 223 } 224 assert.Equal(t, len(organizationMembershipsWithQuery.Data), 1) 225 assert.Equal(t, organizationMembershipsWithQuery.TotalCount, int64(1)) 226 227 // Should return 0 results when providing non matching query 228 query := "somequery" 229 organizationMembershipsWithQuery, err = client.Organizations().ListMemberships(clerk.ListOrganizationMembershipsParams{ 230 OrganizationID: newOrganization.ID, 231 Query: &query, 232 }) 233 if err != nil { 234 t.Fatalf("Organizations.ListMemberships with query returned error: %v", err) 235 } 236 if organizationMembershipsWithQuery == nil { 237 t.Fatalf("Organizations.ListMemberships with query returned nil") 238 } 239 assert.Equal(t, len(organizationMembershipsWithQuery.Data), 0) 240 assert.Equal(t, organizationMembershipsWithQuery.TotalCount, int64(0)) 241 242 // Should return 1 results when using the email as search param and email exist 243 organizationMembershipsWithQuery, err = client.Organizations().ListMemberships(clerk.ListOrganizationMembershipsParams{ 244 OrganizationID: newOrganization.ID, 245 EmailAddresses: []string{organizationMemberships.Data[0].PublicUserData.Identifier}, 246 }) 247 if err != nil { 248 t.Fatalf("Organizations.ListMemberships with query returned error: %v", err) 249 } 250 if organizationMembershipsWithQuery == nil { 251 t.Fatalf("Organizations.ListMemberships with query returned nil") 252 } 253 assert.Equal(t, len(organizationMembershipsWithQuery.Data), 1) 254 assert.Equal(t, organizationMembershipsWithQuery.TotalCount, int64(1)) 255 256 // Should return 0 results when using the email as search param and email does not exist 257 organizationMembershipsWithQuery, err = client.Organizations().ListMemberships(clerk.ListOrganizationMembershipsParams{ 258 OrganizationID: newOrganization.ID, 259 EmailAddresses: []string{"justanemptyemai@clerk.com"}, 260 }) 261 if err != nil { 262 t.Fatalf("Organizations.ListMemberships with query returned error: %v", err) 263 } 264 if organizationMembershipsWithQuery == nil { 265 t.Fatalf("Organizations.ListMemberships with query returned nil") 266 } 267 assert.Equal(t, len(organizationMembershipsWithQuery.Data), 0) 268 assert.Equal(t, organizationMembershipsWithQuery.TotalCount, int64(0)) 269 270 // Should change the role of a user to admin 271 createdOrganizationMembership, err := client.Organizations().CreateMembership(newOrganization.ID, clerk.CreateOrganizationMembershipParams{ 272 UserID: users[1].ID, 273 Role: "admin", 274 }) 275 if err != nil { 276 t.Fatalf("Organizations.CreateMembership returned error: %v", err) 277 } 278 if createdOrganizationMembership == nil { 279 t.Fatalf("Organizations.CreateMembership returned nil") 280 } 281 assert.Equal(t, createdOrganizationMembership.Role, "admin") 282 283 // Should return 2 results when using Role admin as a query param 284 organizationMembershipsWithQuery, err = client.Organizations().ListMemberships(clerk.ListOrganizationMembershipsParams{ 285 OrganizationID: newOrganization.ID, 286 Roles: []string{"admin"}, 287 }) 288 if err != nil { 289 t.Fatalf("Organizations.ListMemberships with query returned error: %v", err) 290 } 291 if organizationMembershipsWithQuery == nil { 292 t.Fatalf("Organizations.ListMemberships with query returned nil") 293 } 294 assert.Equal(t, len(organizationMembershipsWithQuery.Data), 2) 295 assert.Equal(t, organizationMembershipsWithQuery.TotalCount, int64(2)) 296 297 // Should change the role of a user to basic_member 298 updatedOrganizationMembership, err := client.Organizations().UpdateMembership(newOrganization.ID, clerk.UpdateOrganizationMembershipParams{ 299 UserID: organizationMemberships.Data[0].PublicUserData.UserID, 300 Role: "basic_member", 301 }) 302 if err != nil { 303 t.Fatalf("Organizations.UpdateMembership returned error: %v", err) 304 } 305 if updatedOrganizationMembership == nil { 306 t.Fatalf("Organizations.UpdateMembership returned nil") 307 } 308 assert.Equal(t, updatedOrganizationMembership.Role, "basic_member") 309 310 // Should return 1 results when using Role admin as a query param 311 organizationMembershipsWithQuery, err = client.Organizations().ListMemberships(clerk.ListOrganizationMembershipsParams{ 312 OrganizationID: newOrganization.ID, 313 Roles: []string{"admin"}, 314 }) 315 if err != nil { 316 t.Fatalf("Organizations.ListMemberships with query returned error: %v", err) 317 } 318 if organizationMembershipsWithQuery == nil { 319 t.Fatalf("Organizations.ListMemberships with query returned nil") 320 } 321 assert.Equal(t, len(organizationMembershipsWithQuery.Data), 1) 322 assert.Equal(t, organizationMembershipsWithQuery.TotalCount, int64(1)) 323 324 // Should delete member 325 deletedOrganizationMembership, err := client.Organizations().DeleteMembership(newOrganization.ID, 326 organizationMemberships.Data[0].PublicUserData.UserID, 327 ) 328 if err != nil { 329 t.Fatalf("Organizations.DeleteMembership returned error: %v", err) 330 } 331 if deletedOrganizationMembership == nil { 332 t.Fatalf("Organizations.DeleteMembership returned nil") 333 } 334 assert.Equal(t, deletedOrganizationMembership.Role, "basic_member") 335 336 // Should return 0 result 337 afterDeletionMembershipsWithQuery, err := client.Organizations().ListMemberships(clerk.ListOrganizationMembershipsParams{ 338 OrganizationID: newOrganization.ID, 339 Query: &organizationMemberships.Data[0].PublicUserData.UserID, 340 }) 341 if err != nil { 342 t.Fatalf("Organizations.ListMemberships with query returned error: %v", err) 343 } 344 if afterDeletionMembershipsWithQuery == nil { 345 t.Fatalf("Organizations.ListMemberships with query returned nil") 346 } 347 assert.Equal(t, len(afterDeletionMembershipsWithQuery.Data), 0) 348 assert.Equal(t, afterDeletionMembershipsWithQuery.TotalCount, int64(0)) 349 350 deleteResponse, err := client.Organizations().Delete(newOrganization.ID) 351 if err != nil { 352 t.Fatal(err) 353 } 354 assert.Equal(t, newOrganization.ID, deleteResponse.ID) 355 }