Skip to content
Open
Changes from all commits
Commits
Show all changes
150 commits
Select commit Hold shift + click to select a range
f07a8d7
test(fe): run the session-ending scenarios in a browser
sea-snake Aug 26, 2026
f44789b
test(fe): ask the app what it holds, in the session-ending scenarios
sea-snake Aug 26, 2026
98be925
test(fe): say the protocol in the ending-a-session scenarios
sea-snake Aug 26, 2026
aeb6fd6
test(fe): wait long enough for a browser sign-out to land
sea-snake Aug 26, 2026
3a18bfe
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Aug 31, 2026
e86ea02
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Aug 31, 2026
045442c
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Aug 31, 2026
8a7b243
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Aug 31, 2026
eff3eac
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Aug 31, 2026
2f9e3a0
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Aug 31, 2026
8c4bb92
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 1, 2026
e3be670
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 1, 2026
c8576a4
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 1, 2026
9557562
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 1, 2026
e6d2133
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 1, 2026
e9e5724
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 2, 2026
1ee88b4
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 4, 2026
ceea702
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 4, 2026
6bc7210
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 4, 2026
eb96d2a
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 4, 2026
9a0dd26
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 4, 2026
fa76fc7
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 4, 2026
7d8f4bf
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 4, 2026
7b5abb1
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
bdda53c
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
dfb4d92
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
83990f1
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
0834783
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
083c671
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
846204f
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
ce85fff
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
c3433ac
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
b7bfd04
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
baf394f
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
da941e0
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
8fd5356
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
5b1c998
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
3a7df9d
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
8c2834c
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
afc94c4
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
0fee1fb
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
25593e5
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
e803262
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
59f0a72
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
a53e80e
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
c4b0dc0
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
250a4e6
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
634c4e8
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
b8ea431
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
0a596de
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
10e1393
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
996ce74
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
438d7f9
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
4cb8d99
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
c6db03a
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
eba4aa8
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
0af75de
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
9a9adf7
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
0f22a13
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
3be98f8
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
49d2400
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
c870828
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
a2230b5
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
b8f6167
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
11b5bde
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
a8935d0
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 5, 2026
8ccd677
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
3f24c26
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
eff8774
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
d7bae4b
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
1800a8d
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
cc7bc14
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
bc0d987
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
b8939c1
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
5f99aeb
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
3029a6c
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
ea61c25
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
8ac4d18
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
d7437c1
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
a47516b
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
ad048a0
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
8533303
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
1e6d7cf
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 6, 2026
6427d0d
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 7, 2026
57c1528
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 7, 2026
9bde680
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 7, 2026
aa80da0
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 7, 2026
cc8559f
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 7, 2026
8f572fe
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 7, 2026
e85bffc
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 7, 2026
ca5ba34
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 7, 2026
a196553
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 7, 2026
d10e151
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 7, 2026
f773c81
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 7, 2026
e2e2769
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 7, 2026
b85aa60
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 8, 2026
a15c5f6
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 8, 2026
f9827a2
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 8, 2026
0051663
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 8, 2026
6de7098
chore: merge test/session-e2e-tabs-and-siblings
sea-snake Sep 8, 2026
f1bf3cd
chore: merge test/session-e2e-tabs-and-siblings
sea-snake Sep 8, 2026
5ae1e9d
chore: merge test/session-e2e-tabs-and-siblings
sea-snake Sep 8, 2026
e161990
chore: merge test/session-e2e-tabs-and-siblings
sea-snake Sep 8, 2026
fc6ee8b
chore: merge test/session-e2e-tabs-and-siblings
sea-snake Sep 8, 2026
d926900
chore: merge test/session-e2e-tabs-and-siblings
sea-snake Sep 8, 2026
6277f2e
chore: merge test/session-e2e-tabs-and-siblings
sea-snake Sep 8, 2026
4b085d4
chore: merge test/session-e2e-tabs-and-siblings
sea-snake Sep 8, 2026
094dd56
chore: merge test/session-e2e-tabs-and-siblings
sea-snake Sep 8, 2026
9c5ef61
chore: merge test/session-e2e-tabs-and-siblings
sea-snake Sep 9, 2026
9526e4a
chore: merge test/session-e2e-tabs-and-siblings
sea-snake Sep 9, 2026
d2bc160
chore: merge test/session-e2e-tabs-and-siblings
sea-snake Sep 9, 2026
909a362
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
5efd603
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
f414632
test: answer the sign-out dialog
sea-snake Sep 9, 2026
8cd5364
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
9697e5f
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
ec92bce
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
0de97aa
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
49829a2
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
7c2d9eb
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
7b02595
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
c6e32ab
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
acbd676
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
16043d5
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
23d9f97
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
73f3ede
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
c33932c
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 9, 2026
2004d25
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 10, 2026
7141768
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 10, 2026
37b98fe
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 10, 2026
1c67ffe
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 10, 2026
4a30175
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 10, 2026
28be74e
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 10, 2026
047bb86
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 10, 2026
070b813
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 10, 2026
6e0fbe6
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 10, 2026
19a696a
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 10, 2026
37e2025
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 10, 2026
a6cac56
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 11, 2026
87a4b39
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 11, 2026
5da8ce2
test(fe): EXIT-3 covers both browsers, and several apps
sea-snake Sep 11, 2026
88311e2
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 11, 2026
03ba974
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 11, 2026
5c178c2
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 11, 2026
002cbfb
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 11, 2026
fa54931
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 11, 2026
0fbb70b
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 11, 2026
bf6319e
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 11, 2026
da39973
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 11, 2026
47cafba
Merge branch 'test/session-e2e-tabs-and-siblings' into test/session-e…
sea-snake Sep 11, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,211 @@
import { expect } from "@playwright/test";
import { test } from "../../../fixtures";
import { TEST_APP_CANONICAL_URL } from "../../../utils";
import {
continueAs,
forgetThisBrowser,
listedBrowsers,
openSettings,
signInAsFirstIdentity,
signOutFirstBrowser,
} from "./helpers";

/**
* Access that can be ended is the point of the design, so these are the scenarios
* about ending it: by the app signing out, and by the identity's owner signing a
* whole browser out from settings. Ending it reaches an app that is running,
* leaves nothing to come back from, and touches nothing else.
*
* Runs the "Ending a session" scenarios of
* `docs/ongoing/session-test-scenarios.md` — EXIT-1, EXIT-3, EXIT-5 and EXIT-6 —
* and the silent re-issue that has nothing left to answer from.
*/
test.describe("ending a session", () => {
test.use({ authorizeConfig: { protocol: "icrc25" } });

test.describe("signing out leaves nothing behind, across a reload", () => {
test.afterEach(async ({ signedInApp }) => {
await signedInApp.signOut();
await signedInApp.expectSignedOut();

await signedInApp.reload();
await signedInApp.expectSignedOut();
});

test("picks an identity and continues", signInAsFirstIdentity);
});

test.describe("a silent re-issue with nothing to answer from fails one way", () => {
test.afterEach(async ({ signedInApp }) => {
await signedInApp.signOut();
await signedInApp.expectSignedOut();

await signedInApp.silentReauth();

// FAIL-1 and SIL-2: one outcome, reported without asking the user
// anything, and nothing created. Windows are not counted: the window
// transport opens a channel either way, and SIL-1 is about screens, which
// the redirect transport the silent design targets is what makes
// checkable.
await signedInApp.expectSilentReauthFailed();
});

test("picks an identity and continues", signInAsFirstIdentity);
});

test("signing this browser out ends every app it signed into", async ({
testApp,
openTestApp,
context,
identities,
signInWithIdentity,
}) => {
const authenticate = continueAs(
identities[0].identityNumber,
signInWithIdentity,
);
// EXIT-3 says several apps, because one app only proves one session was
// ended: what the browser-wide action claims is that it reaches all of them.
await testApp.open();
await testApp.signIn(authenticate);

const other = openTestApp(await context.newPage());
await other.open({ url: TEST_APP_CANONICAL_URL });
await other.signIn(authenticate);

// This browser is the one that signed in, and a browser cannot sign itself
// out from the list — that row carries no button. Its route is the identity's
// own sign-out, where forgetting revokes rather than merely leaving.
const settings = await openSettings(
context,
identities[0].identityNumber,
signInWithIdentity,
);
await forgetThisBrowser(settings);
await settings.close();

// END-5 allows an app to keep working until the delegation it holds expires,
// so nothing shows until one is due. It is the mint that then discovers the
// session is gone.
for (const app of [testApp, other]) {
await app.focus();
await app.ageDelegation();
await app.replaceDelegation();
await app.expectSignedOut();
}
await other.close();
});

test("signing another browser out from the list ends its access alone", async ({
testApp,
browser,
identities,
signInWithIdentity,
}) => {
const authenticate = continueAs(
identities[0].identityNumber,
signInWithIdentity,
);
await testApp.open();
await testApp.signIn(authenticate);
await testApp.waitUntilSignedIn();

// The other half of EXIT-3: the owner looking at their list from somewhere
// else, where the browser that signed in is another browser and does carry a
// button.
const onlooker = await browser.newContext({ ignoreHTTPSErrors: true });
try {
const settings = await openSettings(
onlooker,
identities[0].identityNumber,
signInWithIdentity,
);
await expect(listedBrowsers(settings)).toHaveCount(1);
await signOutFirstBrowser(settings);
await settings.close();
} finally {
await onlooker.close();
}

await testApp.focus();
await testApp.ageDelegation();
await testApp.replaceDelegation();
await testApp.expectSignedOut();
});

// The two below sign in twice, which `authorizePage` does not do, so they drive
// the app themselves.

test("signing out of one app leaves the other alone", async ({
testApp,
openTestApp,
context,
identities,
signInWithIdentity,
}) => {
const authenticate = continueAs(
identities[0].identityNumber,
signInWithIdentity,
);
await testApp.open();
await testApp.signIn(authenticate);

const other = openTestApp(await context.newPage());
await other.open({ url: TEST_APP_CANONICAL_URL });
await other.signIn(authenticate);

await testApp.focus();
await testApp.signOut();
await testApp.expectSignedOut();

// Another origin is another account and another session.
await other.waitUntilSignedIn();
await other.close();
});

test("a browser signed out is still the same browser", async ({
testApp,
browser,
identities,
signInWithIdentity,
}) => {
const authenticate = continueAs(
identities[0].identityNumber,
signInWithIdentity,
);
await testApp.open();
await testApp.signIn(authenticate);
await testApp.waitUntilSignedIn();

// Read and signed out from elsewhere, because the list offers no button for
// the browser reading it: signing out the browser in front of you goes
// through the identity's own sign-out instead.
const onlooker = await browser.newContext({ ignoreHTTPSErrors: true });
try {
const settings = await openSettings(
onlooker,
identities[0].identityNumber,
signInWithIdentity,
);
await expect(listedBrowsers(settings)).toHaveCount(1);
await signOutFirstBrowser(settings);
await settings.close();

// DEV-18: the entry stays, so signing in again reuses it rather than
// adding a second.
await testApp.focus();
await testApp.signIn(authenticate);
await testApp.waitUntilSignedIn();

const again = await openSettings(
onlooker,
identities[0].identityNumber,
signInWithIdentity,
);
await expect(listedBrowsers(again)).toHaveCount(1);
await again.close();
} finally {
await onlooker.close();
}
});
});
Loading