Skip to content

Commit 3f09c25

Browse files
committed
test: browser logout integ tests
1 parent 56c1c04 commit 3f09c25

File tree

1 file changed

+120
-20
lines changed

1 file changed

+120
-20
lines changed

test/spec/login-browser-integ-test.js

Lines changed: 120 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)