@@ -24,7 +24,7 @@ define(function (require, exports, module) {
2424
2525 const SpecRunnerUtils = require ( "spec/SpecRunnerUtils" ) ;
2626
27- describe ( "integration:LoginBrowser " , function ( ) {
27+ describe ( "integration: login/logout browser app tests " , function ( ) {
2828
2929 if ( Phoenix . isNativeApp ) {
3030 // Browser login tests are not applicable for native apps
@@ -148,27 +148,68 @@ define(function (require, exports, module) {
148148 console . log ( "llgT: LoginBrowserExports.setFetchFn available?" , ! ! LoginBrowserExports . setFetchFn ) ;
149149
150150 if ( LoginBrowserExports . setFetchFn ) {
151+ // Track sign out state for proper mock responses
152+ let userSignedOut = false ;
153+
151154 LoginBrowserExports . setFetchFn ( ( url , options ) => {
152155 console . log ( "llgT: login-browser fetchFn called with URL:" , url ) ;
153156 console . log ( "llgT: login-browser fetchFn called with options:" , options ) ;
154- return Promise . resolve ( {
155- ok : true ,
156- status : 200 ,
157- json : ( ) => Promise . resolve ( {
158- isSuccess : true ,
159- 160- firstName : "Test" ,
161- lastName : "User" ,
162- customerID : "test-customer-id" ,
163- loginTime : Date . now ( ) ,
164- profileIcon : {
165- initials : "TU" ,
166- color : "#14b8a6"
167- }
168- } )
169- } ) ;
157+
158+ // Handle different endpoints
159+ if ( url . includes ( '/resolveBrowserSession' ) ) {
160+ // Login verification endpoint
161+ if ( userSignedOut ) {
162+ console . log ( "llgT: User is signed out, returning 401 for resolveBrowserSession" ) ;
163+ return Promise . resolve ( {
164+ ok : false ,
165+ status : 401 , // Unauthorized - user is logged out
166+ json : ( ) => Promise . resolve ( {
167+ isSuccess : false
168+ } )
169+ } ) ;
170+ } else {
171+ console . log ( "llgT: User is signed in, returning success for resolveBrowserSession" ) ;
172+ return Promise . resolve ( {
173+ ok : true ,
174+ status : 200 ,
175+ json : ( ) => Promise . resolve ( {
176+ isSuccess : true ,
177+ 178+ firstName : "Test" ,
179+ lastName : "User" ,
180+ customerID : "test-customer-id" ,
181+ loginTime : Date . now ( ) ,
182+ profileIcon : {
183+ initials : "TU" ,
184+ color : "#14b8a6"
185+ }
186+ } )
187+ } ) ;
188+ }
189+ } else if ( url . includes ( '/signOut' ) ) {
190+ // Logout endpoint - set signed out state
191+ console . log ( "llgT: Handling signOut endpoint call, marking user as signed out" ) ;
192+ userSignedOut = true ;
193+ return Promise . resolve ( {
194+ ok : true ,
195+ status : 200 ,
196+ json : ( ) => Promise . resolve ( {
197+ isSuccess : true
198+ } )
199+ } ) ;
200+ } else {
201+ // Default response for any other endpoints
202+ console . log ( "llgT: Unknown endpoint, returning default response" ) ;
203+ return Promise . resolve ( {
204+ ok : true ,
205+ status : 200 ,
206+ json : ( ) => Promise . resolve ( {
207+ isSuccess : true
208+ } )
209+ } ) ;
210+ }
170211 } ) ;
171- console . log ( "llgT: login-browser fetch mock set up successfully" ) ;
212+ console . log ( "llgT: login-browser fetch mock set up successfully for all endpoints " ) ;
172213 } else {
173214 console . log ( "llgT: LoginBrowserExports.setFetchFn not available!" ) ;
174215 }
@@ -277,13 +318,72 @@ define(function (require, exports, module) {
277318 expect ( signOutButton . length ) . toBe ( 1 ) ; // Should have sign out button
278319 expect ( newSignInButton . length ) . toBe ( 0 ) ; // Should NOT have sign in button
279320
280- // Close the profile popup (try different methods)
321+ // Step 10: Test sign out functionality
322+ console . log ( "llgT: About to click sign out button" ) ;
323+ console . log ( "llgT: Login state before sign out:" , LoginServiceExports . LoginService . isLoggedIn ( ) ) ;
324+
325+ signOutButton . trigger ( 'click' ) ;
326+
327+ // Wait for sign out dialog to appear and dismiss it
328+ console . log ( "llgT: Waiting for sign out confirmation dialog" ) ;
329+ await testWindow . __PR . waitForModalDialog ( ".modal" ) ;
330+
331+ // Dismiss the "you have been signed out" dialog with OK button
332+ console . log ( "llgT: Dismissing sign out confirmation dialog" ) ;
333+ testWindow . __PR . clickDialogButtonID ( testWindow . __PR . Dialogs . DIALOG_BTN_OK ) ;
334+ await testWindow . __PR . waitForModalDialogClosed ( ".modal" ) ;
335+
336+ // Wait for sign out to complete
337+ console . log ( "llgT: Waiting for user to be signed out..." ) ;
338+ await awaitsFor (
339+ function ( ) {
340+ return ! LoginServiceExports . LoginService . isLoggedIn ( ) ;
341+ } ,
342+ "User to be signed out" ,
343+ 10000 // Increase timeout to see if it's just taking longer
344+ ) ;
345+
346+ // Verify user is now signed out
347+ expect ( LoginServiceExports . LoginService . isLoggedIn ( ) ) . toBe ( false ) ;
348+
349+ // Verify profile icon has been updated (should be empty again)
350+ const $profileIconAfterSignout = testWindow . $ ( "#user-profile-button" ) ;
351+ const profileIconContentAfterSignout = $profileIconAfterSignout . html ( ) ;
352+ console . log ( "llgT: Profile icon after signout:" , profileIconContentAfterSignout ) ;
353+
354+ // Step 11: Verify clicking profile icon again shows login popup (not profile popup)
355+ console . log ( "llgT: Clicking profile icon after sign out to verify login popup appears" ) ;
356+ $profileIconAfterSignout . trigger ( 'click' ) ;
357+
358+ // Wait for login popup to appear again
359+ await awaitsFor (
360+ function ( ) {
361+ return testWindow . $ ( '.modal' ) . length > 0 || testWindow . $ ( '.profile-popup' ) . length > 0 ;
362+ } ,
363+ "Login popup to appear after signout" ,
364+ 3000
365+ ) ;
366+
367+ // Get the popup content after signout
368+ let finalPopupContent = testWindow . $ ( '.modal' ) ;
369+ if ( finalPopupContent . length === 0 ) {
370+ finalPopupContent = testWindow . $ ( '.profile-popup' ) ;
371+ }
372+
373+ // Verify it's back to login popup (has sign in button, no sign out button)
374+ const finalSignInButton = finalPopupContent . find ( '#phoenix-signin-btn' ) ;
375+ const finalSignOutButton = finalPopupContent . find ( '#phoenix-signout-btn' ) ;
376+
377+ expect ( finalSignInButton . length ) . toBe ( 1 ) ; // Should have sign in button again
378+ expect ( finalSignOutButton . length ) . toBe ( 0 ) ; // Should NOT have sign out button
379+
380+ // Close the final popup
281381 if ( testWindow . $ ( '.modal' ) . length > 0 ) {
282382 testWindow . __PR . clickDialogButtonID ( testWindow . __PR . Dialogs . DIALOG_BTN_CANCEL ) ;
283383 await testWindow . __PR . waitForModalDialogClosed ( ".modal" ) ;
284384 } else {
285385 // If it's not a modal, just click outside or use popup close method
286- $profileButton . trigger ( 'click' ) ; // Toggle to close
386+ $profileIconAfterSignout . trigger ( 'click' ) ; // Toggle to close
287387 }
288388 } ) ;
289389 } ) ;
0 commit comments