Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
7 changes: 7 additions & 0 deletions app/e2e/page.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import { deviceEvoluAtom } from "@/atoms/device-evolu";
import type { DeviceEvolu } from "@/lib/evolu/device";
import {
bootstrapE2eAccount,
resetE2eBrowserState,
seedCatalogScenario,
} from "@/lib/testing/e2e-catalog";

Expand Down Expand Up @@ -42,6 +43,12 @@ export default function Page() {
}

window.__finitoE2E = {
resetBrowserState: async () => {
setStatus("running");
await resetE2eBrowserState();
setLastResult("{}");
setStatus("ready");
},
bootstrap: async () => {
setStatus("running");
const result = await bootstrapE2eAccount(deviceEvoluState.data);
Expand Down
16 changes: 14 additions & 2 deletions e2e/helpers/harness.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,21 @@ export const openHarness = async (page: Page) => {
await expect(page.getByTestId("e2e-status")).toHaveText("status:ready");
};

export const bootstrapE2EAuth = async (page: Page) => {
export const resetBrowserState = async (page: Page) => {
await openHarness(page);

await page.evaluate(async () => {
if (!window.__finitoE2E) {
throw new Error("E2E harness is not available.");
}

await window.__finitoE2E.resetBrowserState();
});
};

export const bootstrapE2EAuth = async (page: Page) => {
await resetBrowserState(page);

return await page.evaluate(async () => {
if (!window.__finitoE2E) {
throw new Error("E2E harness is not available.");
Expand All @@ -25,7 +37,7 @@ export const seedCatalog = async (
page: Page,
scenario: CatalogSeedScenario,
): Promise<CatalogSeedResult> => {
await openHarness(page);
await resetBrowserState(page);

return await page.evaluate(async (inputScenario) => {
if (!window.__finitoE2E) {
Expand Down
27 changes: 27 additions & 0 deletions lib/testing/e2e-catalog.ts
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,33 @@ const persistE2eBrowserState = () => {
window.localStorage.setItem("finito.deviceId", e2eDevice.id);
};

const deleteIndexedDb = async (name: string) =>
await new Promise<void>((resolve) => {
const request = window.indexedDB.deleteDatabase(name);
request.onsuccess = () => resolve();
request.onerror = () => resolve();
request.onblocked = () => resolve();
});

export const resetE2eBrowserState = async () => {
window.localStorage.clear();
window.sessionStorage.clear();

if ("databases" in window.indexedDB) {
const databases = await window.indexedDB.databases();
for (const database of databases) {
if (database.name) {
await deleteIndexedDb(database.name);
}
}
}

if ("caches" in window) {
const cacheKeys = await window.caches.keys();
await Promise.all(cacheKeys.map((key) => window.caches.delete(key)));
}
};

const ensureDeviceRow = async (deviceEvolu: DeviceEvolu) => {
await new Promise<void>((resolve) => {
deviceEvolu.upsert("device", e2eDevice, {
Expand Down
1 change: 1 addition & 0 deletions lib/testing/e2e-types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@ export type CatalogSeedResult = {
};

export type FinitoE2EHarness = {
resetBrowserState: () => Promise<void>;
bootstrap: () => Promise<{
deviceId: string;
mnemonic: string;
Expand Down
Loading