Files
RpgRoller/tests/e2e/campaigns-refresh.js

92 lines
3.3 KiB
JavaScript

const assert = require("node:assert/strict");
const {
absoluteUrl,
clickByTitle,
clickText,
fillInput,
getValue,
registerAndLoginApi,
runSmokeTests,
seedAuthenticatedBrowser,
uniqueName,
waitFor,
withDriver,
waitForSelector,
waitForText,
waitForUrl
} = require("./lib/selenium-smoke");
const tests = [
{
name: "campaign management rerenders immediately after campaign and character mutations",
run: async () => withDriver({}, async (driver) => {
const username = uniqueName("campaign-refresh");
const { sessionCookie } = await registerAndLoginApi(username, "Campaign Refresh");
const campaignName = uniqueName("campaign");
const characterName = uniqueName("character");
const updatedCharacterName = uniqueName("character-updated");
await seedAuthenticatedBrowser(driver, sessionCookie);
await driver.get(absoluteUrl("/campaigns"));
await waitForUrl(driver, "/campaigns");
await waitForText(driver, "Character Management");
await clickText(driver, "button", "Add campaign", { contains: true });
await waitForSelector(driver, "#campaign-name");
await fillInput(driver, "#campaign-name", campaignName);
await fillInput(driver, "#campaign-ruleset", "d6");
await clickText(driver, "button", "Create Campaign");
await waitFor(
driver,
() => driver.executeScript(
(name) => (document.querySelector("#campaign-select")?.textContent || "").includes(name),
campaignName
),
`Expected campaign ${campaignName} to appear in the campaign selector.`
);
const selectedCampaignId = await getValue(driver, "#campaign-select");
assert.ok(selectedCampaignId, "Expected a selected campaign after campaign creation.");
await clickText(driver, "button", "Add character", { contains: true });
await waitForSelector(driver, "#character-create-name");
await fillInput(driver, "#character-create-name", characterName);
await clickText(driver, "button", "Create Character");
await waitFor(
driver,
() => driver.executeScript(
(name) => [...document.querySelectorAll(".management-list strong")].some((element) => element.textContent.includes(name)),
characterName
),
`Expected character ${characterName} to appear in the campaign roster.`
);
await clickByTitle(driver, "Edit character");
await waitForSelector(driver, "#character-edit-name");
await fillInput(driver, "#character-edit-name", updatedCharacterName);
await clickText(driver, "button", "Save Character");
await waitFor(
driver,
() => driver.executeScript(
(nextName, previousName) => {
const names = [...document.querySelectorAll(".management-list strong")]
.map((element) => element.textContent || "");
return names.some((name) => name.includes(nextName)) && names.every((name) => !name.includes(previousName));
},
updatedCharacterName,
characterName
),
`Expected updated character name ${updatedCharacterName} to appear immediately in the campaign roster.`
);
})
}
];
runSmokeTests(tests).catch((error) => {
console.error(error.stack || error);
process.exitCode = 1;
});