1
1
import type { MembershipRole , OrganizationInvitationResource } from '@clerk/types' ;
2
2
import { describe } from '@jest/globals' ;
3
3
import { waitFor } from '@testing-library/dom' ;
4
+ import { act } from '@testing-library/react' ;
4
5
import React from 'react' ;
5
6
6
7
import { ClerkAPIResponseError } from '../../../../core/resources' ;
@@ -12,25 +13,27 @@ const { createFixtures } = bindCreateFixtures('OrganizationProfile');
12
13
13
14
describe ( 'InviteMembersPage' , ( ) => {
14
15
it ( 'renders the component' , async ( ) => {
15
- const { wrapper } = await createFixtures ( f => {
16
+ const { wrapper, fixtures } = await createFixtures ( f => {
16
17
f . withOrganizations ( ) ;
17
18
f . withUser ( { email_addresses : [ 'test@clerk.com' ] , organization_memberships : [ { name : 'Org1' , role : 'admin' } ] } ) ;
18
19
} ) ;
19
20
20
- const { getByText } = render ( < InviteMembersPage /> , { wrapper } ) ;
21
+ fixtures . clerk . organization ?. getRoles . mockRejectedValue ( null ) ;
22
+ const { getByText } = await act ( ( ) => render ( < InviteMembersPage /> , { wrapper } ) ) ;
21
23
expect ( getByText ( 'Invite new members to this organization' ) ) . toBeDefined ( ) ;
22
24
} ) ;
23
25
24
26
describe ( 'Submitting' , ( ) => {
25
27
it ( 'enables the Send button when one or more email has been entered' , async ( ) => {
26
- const { wrapper } = await createFixtures ( f => {
28
+ const { wrapper, fixtures } = await createFixtures ( f => {
27
29
f . withOrganizations ( ) ;
28
30
f . withUser ( {
29
31
email_addresses : [ 'test@clerk.com' ] ,
30
32
organization_memberships : [ { name : 'Org1' , role : 'admin' } ] ,
31
33
} ) ;
32
34
} ) ;
33
35
36
+ fixtures . clerk . organization ?. getRoles . mockRejectedValue ( null ) ;
34
37
const { getByRole, userEvent, getByTestId } = render ( < InviteMembersPage /> , { wrapper } ) ;
35
38
expect ( getByRole ( 'button' , { name : 'Send invitations' } ) ) . toBeDisabled ( ) ;
36
39
@@ -47,16 +50,56 @@ describe('InviteMembersPage', () => {
47
50
} ) ;
48
51
} ) ;
49
52
53
+ fixtures . clerk . organization ?. getRoles . mockRejectedValue ( null ) ;
50
54
fixtures . clerk . organization ?. inviteMembers . mockResolvedValueOnce ( [ { } ] as OrganizationInvitationResource [ ] ) ;
51
- const { getByRole, userEvent, getByTestId } = render ( < InviteMembersPage /> , { wrapper } ) ;
55
+ const { getByRole, userEvent, getByTestId, getByText } = render ( < InviteMembersPage /> , { wrapper } ) ;
52
56
await userEvent . type ( getByTestId ( 'tag-input' ) , 'test+1@clerk.com,' ) ;
57
+ await userEvent . click ( getByRole ( 'button' , { name : 'Select an option' } ) ) ;
58
+ await userEvent . click ( getByText ( 'Member' ) ) ;
53
59
await userEvent . click ( getByRole ( 'button' , { name : 'Send invitations' } ) ) ;
54
60
expect ( fixtures . clerk . organization ?. inviteMembers ) . toHaveBeenCalledWith ( {
55
61
emailAddresses : [ 'test+1@clerk.com' ] ,
56
62
role : 'basic_member' as MembershipRole ,
57
63
} ) ;
58
64
} ) ;
59
65
66
+ it ( 'fetches custom role and sends invite to email entered and teacher role when clicking Send' , async ( ) => {
67
+ const { wrapper, fixtures } = await createFixtures ( f => {
68
+ f . withOrganizations ( ) ;
69
+ f . withUser ( {
70
+ email_addresses : [ 'test@clerk.com' ] ,
71
+ organization_memberships : [ { name : 'Org1' , role : 'admin' } ] ,
72
+ } ) ;
73
+ } ) ;
74
+
75
+ fixtures . clerk . organization ?. getRoles . mockResolvedValueOnce ( {
76
+ data : [
77
+ {
78
+ pathRoot : '' ,
79
+ reload : jest . fn ( ) ,
80
+ id : '1' ,
81
+ description : '' ,
82
+ updatedAt : new Date ( ) ,
83
+ createdAt : new Date ( ) ,
84
+ permissions : [ ] ,
85
+ name : 'Teacher' ,
86
+ key : 'org:teacher' ,
87
+ } ,
88
+ ] ,
89
+ total_count : 1 ,
90
+ } ) ;
91
+ fixtures . clerk . organization ?. inviteMembers . mockResolvedValueOnce ( [ { } ] as OrganizationInvitationResource [ ] ) ;
92
+ const { getByRole, userEvent, getByTestId, getByText } = render ( < InviteMembersPage /> , { wrapper } ) ;
93
+ await userEvent . type ( getByTestId ( 'tag-input' ) , 'test+1@clerk.com,' ) ;
94
+ await userEvent . click ( getByRole ( 'button' , { name : 'Select an option' } ) ) ;
95
+ await userEvent . click ( getByText ( 'Teacher' ) ) ;
96
+ await userEvent . click ( getByRole ( 'button' , { name : 'Send invitations' } ) ) ;
97
+ expect ( fixtures . clerk . organization ?. inviteMembers ) . toHaveBeenCalledWith ( {
98
+ emailAddresses : [ 'test+1@clerk.com' ] ,
99
+ role : 'org:teacher' as MembershipRole ,
100
+ } ) ;
101
+ } ) ;
102
+
60
103
it ( 'sends invites to multiple emails' , async ( ) => {
61
104
const { wrapper, fixtures } = await createFixtures ( f => {
62
105
f . withOrganizations ( ) ;
@@ -66,12 +109,15 @@ describe('InviteMembersPage', () => {
66
109
} ) ;
67
110
} ) ;
68
111
112
+ fixtures . clerk . organization ?. getRoles . mockRejectedValue ( null ) ;
69
113
fixtures . clerk . organization ?. inviteMembers . mockResolvedValueOnce ( [ { } ] as OrganizationInvitationResource [ ] ) ;
70
- const { getByRole, userEvent, getByTestId } = render ( < InviteMembersPage /> , { wrapper } ) ;
114
+ const { getByRole, userEvent, getByTestId, getByText } = render ( < InviteMembersPage /> , { wrapper } ) ;
71
115
await userEvent . type (
72
116
getByTestId ( 'tag-input' ) ,
73
117
'test+1@clerk.com,test+2@clerk.com,test+3@clerk.com,test+4@clerk.com,' ,
74
118
) ;
119
+ await userEvent . click ( getByRole ( 'button' , { name : 'Select an option' } ) ) ;
120
+ await userEvent . click ( getByText ( 'Member' ) ) ;
75
121
await userEvent . click ( getByRole ( 'button' , { name : 'Send invitations' } ) ) ;
76
122
expect ( fixtures . clerk . organization ?. inviteMembers ) . toHaveBeenCalledWith ( {
77
123
emailAddresses : [ 'test+1@clerk.com' , 'test+2@clerk.com' , 'test+3@clerk.com' , 'test+4@clerk.com' ] ,
@@ -88,10 +134,11 @@ describe('InviteMembersPage', () => {
88
134
} ) ;
89
135
} ) ;
90
136
137
+ fixtures . clerk . organization ?. getRoles . mockRejectedValue ( null ) ;
91
138
fixtures . clerk . organization ?. inviteMembers . mockResolvedValueOnce ( [ { } ] as OrganizationInvitationResource [ ] ) ;
92
139
const { getByRole, userEvent, getByText, getByTestId } = render ( < InviteMembersPage /> , { wrapper } ) ;
93
140
await userEvent . type ( getByTestId ( 'tag-input' ) , 'test+1@clerk.com,' ) ;
94
- await userEvent . click ( getByRole ( 'button' , { name : 'Member ' } ) ) ;
141
+ await userEvent . click ( getByRole ( 'button' , { name : 'Select an option ' } ) ) ;
95
142
await userEvent . click ( getByText ( 'Admin' ) ) ;
96
143
await userEvent . click ( getByRole ( 'button' , { name : 'Send invitations' } ) ) ;
97
144
expect ( fixtures . clerk . organization ?. inviteMembers ) . toHaveBeenCalledWith ( {
@@ -109,6 +156,7 @@ describe('InviteMembersPage', () => {
109
156
} ) ;
110
157
} ) ;
111
158
159
+ fixtures . clerk . organization ?. getRoles . mockRejectedValue ( null ) ;
112
160
fixtures . clerk . organization ?. inviteMembers . mockRejectedValueOnce (
113
161
new ClerkAPIResponseError ( 'Error' , {
114
162
data : [
@@ -143,6 +191,7 @@ describe('InviteMembersPage', () => {
143
191
} ) ;
144
192
} ) ;
145
193
194
+ fixtures . clerk . organization ?. getRoles . mockRejectedValue ( null ) ;
146
195
fixtures . clerk . organization ?. inviteMembers . mockRejectedValueOnce (
147
196
new ClerkAPIResponseError ( 'Error' , {
148
197
data : [
@@ -173,6 +222,7 @@ describe('InviteMembersPage', () => {
173
222
} ) ;
174
223
} ) ;
175
224
225
+ fixtures . clerk . organization ?. getRoles . mockRejectedValue ( null ) ;
176
226
fixtures . clerk . organization ?. inviteMembers . mockRejectedValueOnce (
177
227
new ClerkAPIResponseError ( 'Error' , {
178
228
data : [
@@ -203,6 +253,7 @@ describe('InviteMembersPage', () => {
203
253
organization_memberships : [ { name : 'Org1' , role : 'admin' } ] ,
204
254
} ) ;
205
255
} ) ;
256
+ fixtures . clerk . organization ?. getRoles . mockRejectedValue ( null ) ;
206
257
207
258
const { getByRole, userEvent } = render ( < InviteMembersPage /> , { wrapper } ) ;
208
259
await userEvent . click ( getByRole ( 'button' , { name : 'Cancel' } ) ) ;
0 commit comments