104 lines
5.6 KiB
JavaScript
104 lines
5.6 KiB
JavaScript
const { chromium } = require('C:/Users/phenom/.cache/codex-runtimes/codex-primary-runtime/dependencies/node/node_modules/playwright');
|
|
const assert = require('node:assert/strict');
|
|
const fs = require('node:fs');
|
|
const os = require('node:os');
|
|
const path = require('node:path');
|
|
|
|
const directory = path.resolve(process.env.COMPANION_READINESS_PLAYTEST_DIR || 'playtest-artifacts/companion-readiness');
|
|
const port = Number(process.env.COMPANION_READINESS_PLAYTEST_PORT || 4192);
|
|
const base = `http://127.0.0.1:${port}`;
|
|
fs.mkdirSync(directory, { recursive: true });
|
|
const runtimeData = fs.mkdtempSync(path.join(os.tmpdir(), 'healer-man-readiness-ui-'));
|
|
|
|
(async () => {
|
|
const { createGameServer } = await import('../server/server.mjs');
|
|
const runtime = createGameServer({ dataDir: runtimeData, enableShelvedModes: false });
|
|
await new Promise((resolve) => runtime.server.listen(port, '127.0.0.1', resolve));
|
|
const browser = await chromium.launch({ channel: 'msedge', headless: true });
|
|
const context = await browser.newContext({ viewport: { width: 1440, height: 1000 } });
|
|
const page = await context.newPage();
|
|
page.setDefaultTimeout(120_000);
|
|
const pageErrors = [];
|
|
page.on('pageerror', (error) => pageErrors.push(error.message));
|
|
const capture = async (name, fullPage = true) => {
|
|
await page.screenshot({ path: path.join(directory, `${name}.png`), fullPage });
|
|
console.log(`Captured ${name}`);
|
|
};
|
|
|
|
try {
|
|
await page.goto(base, { waitUntil: 'domcontentloaded' });
|
|
await page.getByLabel('Username').fill('Phenom');
|
|
await page.getByLabel('Password').fill('readiness-playtest');
|
|
await page.getByRole('button', { name: /Create account/ }).click();
|
|
await page.locator('.character-select-screen').waitFor();
|
|
await page.getByRole('button', { name: /Create character/ }).click();
|
|
await page.getByRole('button', { name: /Customize & name/ }).click();
|
|
await page.getByLabel('Character name').fill('ReadinessQA');
|
|
await page.getByRole('button', { name: /Create character/ }).click();
|
|
await page.getByRole('button', { name: /Continue/ }).first().click();
|
|
await page.locator('.main-menu-screen').waitFor();
|
|
|
|
await page.getByRole('button', { name: /Companion Readiness/ }).click();
|
|
await page.locator('.companion-readiness').waitFor();
|
|
const totals = page.getByLabel('Readiness totals');
|
|
assert.match(await totals.innerText(), /5\s+Ready/);
|
|
assert.match(await totals.innerText(), /0\s+Beta/);
|
|
assert.match(await totals.innerText(), /26\s+Needs Testing/);
|
|
assert.equal(await page.locator('.companion-readiness__spec').count(), 31);
|
|
assert.match(await page.locator('.companion-readiness__spec').filter({ hasText: 'Aldren' }).innerText(), /Protection/);
|
|
assert.match(await page.locator('.companion-readiness__spec').filter({ hasText: 'Quorin' }).innerText(), /Discipline/);
|
|
await capture('01-readiness-desktop');
|
|
|
|
await page.setViewportSize({ width: 480, height: 900 });
|
|
await page.waitForTimeout(250);
|
|
assert.equal(await page.evaluate(() => document.documentElement.scrollWidth <= window.innerWidth), true);
|
|
await page.getByLabel('Status').selectOption('ready');
|
|
assert.equal(await page.locator('.companion-readiness__spec').count(), 5);
|
|
await capture('02-readiness-narrow');
|
|
|
|
await page.setViewportSize({ width: 1440, height: 1000 });
|
|
await page.getByLabel('Status').selectOption('all');
|
|
await page.getByLabel('Arms readiness').selectOption('beta');
|
|
await page.getByRole('button', { name: 'Publish policy' }).click();
|
|
await page.getByText('Published policy is active').waitFor();
|
|
assert.match(await totals.innerText(), /1\s+Beta/);
|
|
assert.match(await totals.innerText(), /25\s+Needs Testing/);
|
|
await page.getByRole('button', { name: 'Back' }).click();
|
|
await page.locator('.main-menu-screen').waitFor();
|
|
|
|
await page.getByRole('button', { name: /Dungeons/ }).click();
|
|
await page.locator('.dungeon-select-screen').waitFor();
|
|
const beta = page.getByRole('checkbox', { name: /Include Beta Specs/ });
|
|
assert.equal(await beta.isDisabled(), false);
|
|
assert.equal(await beta.isChecked(), false);
|
|
assert.match(await page.locator('.companion-pool-controls').innerText(), /1 beta spec available/);
|
|
await page.locator('.dungeon-select-row').filter({ hasText: 'Wailing Caverns' }).click();
|
|
await page.locator('.dungeon-select-copy h2').getByText('Wailing Caverns', { exact: true }).waitFor();
|
|
await capture('03-dungeon-ready-pool');
|
|
|
|
await page.getByRole('button', { name: /Choose role/ }).click();
|
|
const roleButton = page.locator('.dungeon-role-option').first();
|
|
await roleButton.click();
|
|
await page.locator('.party-frames').waitFor({ timeout: 180_000 });
|
|
await page.locator('.party-frame').nth(4).waitFor();
|
|
await page.locator('.loading-screen').waitFor({ state: 'detached', timeout: 180_000 });
|
|
assert.equal(await page.locator('.party-frame').count(), 5);
|
|
const npcFrames = await page.locator('.party-frame:not(.party-frame--player):not(.party-frame--online)').allInnerTexts();
|
|
assert.equal(npcFrames.length, 4);
|
|
for (const frame of npcFrames) {
|
|
assert.match(frame, /Protection|Discipline|Marksmanship|Fire|Assassination/i);
|
|
assert.doesNotMatch(frame, /Arms/i);
|
|
}
|
|
await capture('04-live-dungeon-ready-party', false);
|
|
assert.deepEqual(pageErrors, []);
|
|
console.log(`Companion Readiness playtest passed with NPCs: ${npcFrames.map((frame) => frame.split('\n')[0]).join(', ')}`);
|
|
} finally {
|
|
await browser.close();
|
|
await new Promise((resolve) => runtime.server.close(resolve));
|
|
fs.rmSync(runtimeData, { recursive: true, force: true });
|
|
}
|
|
})().catch((error) => {
|
|
console.error(error);
|
|
process.exitCode = 1;
|
|
});
|