@@ -9,8 +9,20 @@ import { __internal_useOrganizationDirectorySync } from '../useOrganizationDirec
99import { createMockClerk , createMockQueryClient } from './mocks/clerk' ;
1010import { wrapper } from './wrapper' ;
1111
12- const directory = { id : 'dir_1' , enterpriseConnectionId : 'ent_1' } ;
12+ const updateSpy = vi . fn ( ( ) => Promise . resolve ( { ...directory , name : 'Renamed' } ) ) ;
13+ const rotateTokenSpy = vi . fn ( ( ) => Promise . resolve ( { ...directory , token : 'tok_new' } ) ) ;
14+ const deleteSpy = vi . fn ( ( ) => Promise . resolve ( { object : 'directory' , id : 'dir_1' , deleted : true } ) ) ;
15+ const directory = {
16+ id : 'dir_1' ,
17+ enterpriseConnectionId : 'ent_1' ,
18+ update : updateSpy ,
19+ rotateToken : rotateTokenSpy ,
20+ delete : deleteSpy ,
21+ } ;
1322const getDirectorySyncSpy = vi . fn ( ( _enterpriseConnectionId : string ) => Promise . resolve ( directory ) ) ;
23+ const createDirectorySyncSpy = vi . fn ( ( _enterpriseConnectionId : string , _params ?: unknown ) =>
24+ Promise . resolve ( { ...directory , token : 'tok_1' } ) ,
25+ ) ;
1426
1527const defaultQueryClient = createMockQueryClient ( ) ;
1628
@@ -19,7 +31,7 @@ const mockClerk = createMockClerk({
1931 __internal_lastEmittedResources : {
2032 user : null ,
2133 session : null ,
22- organization : { id : 'org_1' , getDirectorySync : getDirectorySyncSpy } ,
34+ organization : { id : 'org_1' , getDirectorySync : getDirectorySyncSpy , createDirectorySync : createDirectorySyncSpy } ,
2335 client : null ,
2436 } ,
2537} ) ;
@@ -89,4 +101,96 @@ describe('useOrganizationDirectorySync', () => {
89101 expect ( getDirectorySyncSpy ) . toHaveBeenCalledTimes ( 2 ) ;
90102 expect ( defaultQueryClient . client . getQueryState ( otherKey ) ?. isInvalidated ) . toBe ( false ) ;
91103 } ) ;
104+
105+ describe ( 'mutations' , ( ) => {
106+ it ( 'createDirectorySync creates for the connection, resolves the token-bearing resource, and refetches' , async ( ) => {
107+ const { result } = renderDirectorySync ( ) ;
108+ await waitFor ( ( ) => expect ( result . current . isLoading ) . toBe ( false ) ) ;
109+ expect ( getDirectorySyncSpy ) . toHaveBeenCalledTimes ( 1 ) ;
110+
111+ let created : Awaited < ReturnType < typeof result . current . createDirectorySync > > ;
112+ await act ( async ( ) => {
113+ created = await result . current . createDirectorySync ( { name : 'Okta' } ) ;
114+ } ) ;
115+
116+ expect ( createDirectorySyncSpy ) . toHaveBeenCalledWith ( 'ent_1' , { name : 'Okta' } ) ;
117+ expect ( created ) . toMatchObject ( { id : 'dir_1' , token : 'tok_1' } ) ;
118+ expect ( getDirectorySyncSpy ) . toHaveBeenCalledTimes ( 2 ) ;
119+ } ) ;
120+
121+ it ( 'createDirectorySync is a no-op without an enterprise connection id' , async ( ) => {
122+ const { result } = renderDirectorySync ( null ) ;
123+
124+ await expect ( result . current . createDirectorySync ( ) ) . resolves . toBeUndefined ( ) ;
125+ expect ( createDirectorySyncSpy ) . not . toHaveBeenCalled ( ) ;
126+ } ) ;
127+
128+ it . each ( [
129+ [
130+ 'updateDirectorySync' ,
131+ updateSpy ,
132+ ( r : ReturnType < typeof renderDirectorySync > [ 'result' ] ) => r . current . updateDirectorySync ( { name : 'Renamed' } ) ,
133+ ] ,
134+ [
135+ 'rotateDirectorySyncToken' ,
136+ rotateTokenSpy ,
137+ ( r : ReturnType < typeof renderDirectorySync > [ 'result' ] ) => r . current . rotateDirectorySyncToken ( ) ,
138+ ] ,
139+ [
140+ 'deleteDirectorySync' ,
141+ deleteSpy ,
142+ ( r : ReturnType < typeof renderDirectorySync > [ 'result' ] ) => r . current . deleteDirectorySync ( ) ,
143+ ] ,
144+ ] as const ) ( '%s acts on the loaded directory and refetches it' , async ( _name , resourceSpy , run ) => {
145+ const { result } = renderDirectorySync ( ) ;
146+ await waitFor ( ( ) => expect ( result . current . isLoading ) . toBe ( false ) ) ;
147+ expect ( getDirectorySyncSpy ) . toHaveBeenCalledTimes ( 1 ) ;
148+
149+ let resolved : unknown ;
150+ await act ( async ( ) => {
151+ resolved = await run ( result ) ;
152+ } ) ;
153+
154+ expect ( resourceSpy ) . toHaveBeenCalledTimes ( 1 ) ;
155+ expect ( resolved ) . toBe ( await resourceSpy . mock . results [ 0 ] . value ) ;
156+ expect ( getDirectorySyncSpy ) . toHaveBeenCalledTimes ( 2 ) ;
157+ } ) ;
158+
159+ it ( 'updateDirectorySync forwards its params to the resource' , async ( ) => {
160+ const { result } = renderDirectorySync ( ) ;
161+ await waitFor ( ( ) => expect ( result . current . isLoading ) . toBe ( false ) ) ;
162+
163+ await act ( async ( ) => {
164+ await result . current . updateDirectorySync ( { name : 'Renamed' } ) ;
165+ } ) ;
166+
167+ expect ( updateSpy ) . toHaveBeenCalledWith ( { name : 'Renamed' } ) ;
168+ } ) ;
169+
170+ it ( 'directory-scoped mutations resolve undefined before the directory has loaded' , async ( ) => {
171+ getDirectorySyncSpy . mockRejectedValueOnce ( new ClerkAPIResponseError ( 'Not found' , { status : 404 , data : [ ] } ) ) ;
172+ const { result } = renderDirectorySync ( ) ;
173+ await waitFor ( ( ) => expect ( result . current . isLoading ) . toBe ( false ) ) ;
174+ expect ( result . current . data ) . toBeNull ( ) ;
175+
176+ await expect ( result . current . updateDirectorySync ( { name : 'Renamed' } ) ) . resolves . toBeUndefined ( ) ;
177+ await expect ( result . current . rotateDirectorySyncToken ( ) ) . resolves . toBeUndefined ( ) ;
178+ await expect ( result . current . deleteDirectorySync ( ) ) . resolves . toBeUndefined ( ) ;
179+ expect ( updateSpy ) . not . toHaveBeenCalled ( ) ;
180+ expect ( rotateTokenSpy ) . not . toHaveBeenCalled ( ) ;
181+ expect ( deleteSpy ) . not . toHaveBeenCalled ( ) ;
182+ } ) ;
183+
184+ it ( 'propagates a failed mutation and skips the refetch' , async ( ) => {
185+ const { result } = renderDirectorySync ( ) ;
186+ await waitFor ( ( ) => expect ( result . current . isLoading ) . toBe ( false ) ) ;
187+ expect ( getDirectorySyncSpy ) . toHaveBeenCalledTimes ( 1 ) ;
188+
189+ const failure = new Error ( 'rotate failed' ) ;
190+ rotateTokenSpy . mockRejectedValueOnce ( failure ) ;
191+
192+ await expect ( result . current . rotateDirectorySyncToken ( ) ) . rejects . toBe ( failure ) ;
193+ expect ( getDirectorySyncSpy ) . toHaveBeenCalledTimes ( 1 ) ;
194+ } ) ;
195+ } ) ;
92196} ) ;
0 commit comments