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  }