diff --git a/scripts/verify-campaign-objective-journal-browser.mjs b/scripts/verify-campaign-objective-journal-browser.mjs index 2e862a0..1ed1ebc 100644 --- a/scripts/verify-campaign-objective-journal-browser.mjs +++ b/scripts/verify-campaign-objective-journal-browser.mjs @@ -54,10 +54,15 @@ const baseUrl = process.env.VERIFY_CAMPAIGN_OBJECTIVE_JOURNAL_URL ?? 'http://127.0.0.1:41808/heros_web/'; const targetUrl = withDebugOptions(baseUrl, renderer); +const localSeedUrl = withDebugOptions( + 'http://127.0.0.1:41808/heros_web/', + renderer +); const screenshotPath = `dist/verification-campaign-objective-journal-${renderer}-1920x1080.png`; let serverProcess; +let seedServerProcess; let browser; try { @@ -90,13 +95,41 @@ try { } }); - await page.addInitScript(() => window.localStorage.clear()); + await page.addInitScript(() => { + const marker = + 'heros-web:qa:campaign-objective-journal-storage-cleared'; + if (window.sessionStorage.getItem(marker) === '1') { + return; + } + window.localStorage.clear(); + window.sessionStorage.setItem(marker, '1'); + }); await page.goto(targetUrl, { waitUntil: 'domcontentloaded', timeout: 90000 }); await waitForDebugApi(page); - const seeded = await seedFirstVictoryCamp(page); + let seeded; + if (isLocalUrl(targetUrl)) { + seeded = await seedFirstVictoryCamp(page); + } else { + const seedBridge = await createFirstVictorySeedBridge( + browser, + localSeedUrl + ); + seedServerProcess = seedBridge.serverProcess; + seeded = seedBridge.seeded; + await page.evaluate((campaignSaves) => { + for (const [key, value] of Object.entries(campaignSaves)) { + window.localStorage.setItem(key, value); + } + }, seedBridge.campaignSaves); + await page.reload({ + waitUntil: 'domcontentloaded', + timeout: 90000 + }); + await waitForDebugApi(page); + } assert.deepEqual( seeded, { @@ -229,6 +262,7 @@ try { } finally { await browser?.close(); await stopServerProcess(serverProcess); + await stopServerProcess(seedServerProcess); } function withDebugOptions(url, requestedRenderer) { @@ -238,6 +272,12 @@ function withDebugOptions(url, requestedRenderer) { return parsed.toString(); } +function isLocalUrl(url) { + return ['localhost', '127.0.0.1', '0.0.0.0'].includes( + new URL(url).hostname + ); +} + async function waitForDebugApi(page) { await page.waitForFunction( () => @@ -303,6 +343,39 @@ async function seedFirstVictoryCamp(page) { }, sourceBattleId); } +async function createFirstVictorySeedBridge(activeBrowser, seedUrl) { + const localServerProcess = await ensureLocalServer(seedUrl); + const context = await activeBrowser.newContext( + desktopBrowserContextOptions + ); + try { + const page = await context.newPage(); + page.setDefaultTimeout(30000); + await page.addInitScript(() => window.localStorage.clear()); + await page.goto(seedUrl, { + waitUntil: 'domcontentloaded', + timeout: 90000 + }); + await waitForDebugApi(page); + const seeded = await seedFirstVictoryCamp(page); + const campaignSaves = await readCampaignSaves(page); + assert( + Object.keys(campaignSaves).length > 0, + 'Local seed bridge did not create a campaign save.' + ); + return { + campaignSaves, + seeded, + serverProcess: localServerProcess + }; + } catch (error) { + await stopServerProcess(localServerProcess); + throw error; + } finally { + await context.close(); + } +} + async function waitForCampJournalReady(page) { try { await page.waitForFunction(