1+ import { ClerkRuntimeError } from '@clerk/shared/error' ;
12import type { ReactElement } from 'react' ;
23import { describe , expect , it , vi } from 'vitest' ;
34
@@ -7,6 +8,7 @@ import { CardStateProvider } from '@/ui/elements/contexts';
78
89const goNext = vi . fn ( ) ;
910const goPrev = vi . fn ( ) ;
11+ const goToStep = vi . fn ( ) ;
1012
1113vi . mock ( '../../elements/Wizard' , ( ) => ( {
1214 useWizard : ( ) => ( {
@@ -19,23 +21,42 @@ vi.mock('../../elements/Wizard', () => ({
1921 isNested : false ,
2022 goNext,
2123 goPrev,
22- goToStep : vi . fn ( ) ,
24+ goToStep,
2325 registerStep : vi . fn ( ) ,
2426 unregisterStep : vi . fn ( ) ,
2527 } ) ,
2628} ) ) ;
2729
2830const setProvider = vi . fn ( ) ;
31+ const createEnterpriseConnection = vi . fn ( ) ;
2932
3033vi . mock ( '../../ConfigureSSOContext' , ( ) => ( {
3134 useConfigureSSO : ( ) => ( {
3235 enterpriseConnection : undefined ,
3336 provider : undefined ,
3437 setProvider,
38+ createEnterpriseConnection,
3539 initialStepId : 'select-provider' ,
3640 } ) ,
3741} ) ) ;
3842
43+ vi . mock ( '@clerk/shared/react/index' , async importOriginal => {
44+ const actual = await importOriginal < typeof import ( '@clerk/shared/react/index' ) > ( ) ;
45+ return {
46+ ...actual ,
47+ useUser : ( ) => ( {
48+ user : {
49+ primaryEmailAddress : {
50+ emailAddress : 'test@clerk.com' ,
51+ verification : { status : 'verified' } ,
52+ } ,
53+ } ,
54+ isLoaded : true ,
55+ isSignedIn : true ,
56+ } ) ,
57+ } ;
58+ } ) ;
59+
3960import { SelectProviderStep } from '../SelectProviderStep' ;
4061
4162const { createFixtures } = bindCreateFixtures ( 'ConfigureSSO' ) ;
@@ -50,7 +71,10 @@ const renderStep = (
5071const resetMocks = ( ) => {
5172 goNext . mockReset ( ) ;
5273 goPrev . mockReset ( ) ;
74+ goToStep . mockReset ( ) ;
5375 setProvider . mockReset ( ) ;
76+ createEnterpriseConnection . mockReset ( ) ;
77+ createEnterpriseConnection . mockResolvedValue ( undefined ) ;
5478} ;
5579
5680describe ( 'SelectProviderStep' , ( ) => {
@@ -137,8 +161,11 @@ describe('SelectProviderStep', () => {
137161 setProvider . mockImplementation ( ( ) => {
138162 callOrder . push ( 'setProvider' ) ;
139163 } ) ;
140- goNext . mockImplementation ( ( ) => {
141- callOrder . push ( 'goNext' ) ;
164+ createEnterpriseConnection . mockImplementation ( async ( ) => {
165+ callOrder . push ( 'createEnterpriseConnection' ) ;
166+ } ) ;
167+ goToStep . mockImplementation ( ( ) => {
168+ callOrder . push ( 'goToStep' ) ;
142169 } ) ;
143170
144171 const { wrapper } = await createFixtures ( ) ;
@@ -148,11 +175,12 @@ describe('SelectProviderStep', () => {
148175 await userEvent . click ( screen . getByRole ( 'button' , { name : / C o n t i n u e / i } ) ) ;
149176
150177 await waitFor ( ( ) => {
151- expect ( goNext ) . toHaveBeenCalledTimes ( 1 ) ;
178+ expect ( goToStep ) . toHaveBeenCalledWith ( 'configure' ) ;
152179 } ) ;
153180
154181 expect ( setProvider ) . toHaveBeenCalledWith ( 'saml_okta' ) ;
155- expect ( callOrder ) . toEqual ( [ 'setProvider' , 'goNext' ] ) ;
182+ expect ( createEnterpriseConnection ) . toHaveBeenCalledWith ( 'saml_okta' ) ;
183+ expect ( callOrder ) . toEqual ( [ 'setProvider' , 'createEnterpriseConnection' , 'goToStep' ] ) ;
156184 } ) ;
157185
158186 it ( 'forwards the Custom SAML backend provider id when selected' , async ( ) => {
@@ -164,10 +192,32 @@ describe('SelectProviderStep', () => {
164192 await userEvent . click ( screen . getByRole ( 'button' , { name : / C o n t i n u e / i } ) ) ;
165193
166194 await waitFor ( ( ) => {
167- expect ( goNext ) . toHaveBeenCalledTimes ( 1 ) ;
195+ expect ( goToStep ) . toHaveBeenCalledWith ( 'configure' ) ;
168196 } ) ;
169197
170198 expect ( setProvider ) . toHaveBeenCalledWith ( 'saml_custom' ) ;
199+ expect ( createEnterpriseConnection ) . toHaveBeenCalledWith ( 'saml_custom' ) ;
200+ } ) ;
201+
202+ it ( 'does not advance when failing to create enterprise connection' , async ( ) => {
203+ resetMocks ( ) ;
204+ createEnterpriseConnection . mockRejectedValue (
205+ new ClerkRuntimeError ( 'failed to create enterprise connection' , {
206+ code : 'enterprise_connection_creation_failed' ,
207+ } ) ,
208+ ) ;
209+
210+ const { wrapper } = await createFixtures ( ) ;
211+ const { userEvent } = renderStep ( wrapper ) ;
212+
213+ await userEvent . click ( screen . getByRole ( 'radio' , { name : 'Okta Workforce' } ) ) ;
214+ await userEvent . click ( screen . getByRole ( 'button' , { name : / C o n t i n u e / i } ) ) ;
215+
216+ await waitFor ( ( ) => {
217+ expect ( createEnterpriseConnection ) . toHaveBeenCalledWith ( 'saml_okta' ) ;
218+ } ) ;
219+
220+ expect ( goToStep ) . not . toHaveBeenCalled ( ) ;
171221 } ) ;
172222
173223 it ( 'disables Previous on the first step' , async ( ) => {
0 commit comments