129 lines
4.2 KiB
TypeScript
129 lines
4.2 KiB
TypeScript
|
import { Page } from "playwright-core";
|
||
|
import { randomBytes } from "crypto";
|
||
|
import { resolve, join } from "path";
|
||
|
import { fireEvent } from "@testing-library/vue";
|
||
|
|
||
|
const sampleFiles = ["smut.md", "smut-2.md", "somno.md"];
|
||
|
|
||
|
export function rand(min: number, max: number) {
|
||
|
return Math.floor(Math.random() * (max - min + 1)) + min;
|
||
|
}
|
||
|
|
||
|
async function fillCharacters(page: Page, fieldId: string, count: number) {
|
||
|
const el = page.getByTestId(fieldId);
|
||
|
const inp = el.locator("input");
|
||
|
await inp.focus();
|
||
|
let existingIndices: number[] = [];
|
||
|
|
||
|
while (existingIndices.length <= count) {
|
||
|
let downPresses = rand(1, 4);
|
||
|
if (existingIndices.includes(downPresses)) {
|
||
|
continue;
|
||
|
}
|
||
|
existingIndices.push(downPresses);
|
||
|
}
|
||
|
for (let k = 0; k < existingIndices.length; k++) {
|
||
|
await inp.focus();
|
||
|
await inp.press("ArrowDown");
|
||
|
for (let l = 0; l < existingIndices[k]; l++) {
|
||
|
await inp.press("ArrowDown");
|
||
|
}
|
||
|
await inp.press("Escape");
|
||
|
}
|
||
|
await inp.press("Enter");
|
||
|
}
|
||
|
|
||
|
async function fillRelationships(page: Page, id: string) {
|
||
|
const add = page.getByTestId(`${id}.form.relationships.add`);
|
||
|
for (let i = 0; i < rand(1, 3); i++) {
|
||
|
await add.click();
|
||
|
|
||
|
const pairingMembers = rand(2, 3);
|
||
|
|
||
|
await fillCharacters(page, `${id}.form.relationships.${i}`, pairingMembers);
|
||
|
}
|
||
|
}
|
||
|
|
||
|
async function uploadOrPaste(page: Page, selector: string, index: number) {
|
||
|
const uop = rand(1, 2) == 1;
|
||
|
const innerSel = `${selector}.form.uploadOrPaste`;
|
||
|
if (uop) {
|
||
|
const fileChoosePromise = page.waitForEvent("filechooser");
|
||
|
const el = page.getByTestId(`${innerSel}.radio.upload`);
|
||
|
await el.click();
|
||
|
const ubtn = page.getByTestId(`${innerSel}.upload`);
|
||
|
await ubtn.click();
|
||
|
const fc = await fileChoosePromise;
|
||
|
await fc.setFiles(join(resolve(import.meta.dirname, "../../tests/inputFiles"), sampleFiles[rand(0, 2)]));
|
||
|
} else {
|
||
|
const el = page.getByTestId(`${innerSel}.radio.pasteOrType`);
|
||
|
await el.click();
|
||
|
const content = page.getByTestId(`${innerSel}.type`).frameLocator("iframe").locator("[contenteditable]");
|
||
|
await content.pressSequentially(
|
||
|
randomBytes(148)
|
||
|
.toString("base64")
|
||
|
.match(/.{1,2}/g)!
|
||
|
.join(" "),
|
||
|
);
|
||
|
await content.focus();
|
||
|
await content.press("Enter");
|
||
|
await content.press("Enter");
|
||
|
await content.pressSequentially(`--- end of chapter ${index + 1} ---`.toLocaleUpperCase());
|
||
|
}
|
||
|
}
|
||
|
|
||
|
export async function partialChapter(page: Page, i: number) {
|
||
|
const b = `storyform.chapters[${i}]`;
|
||
|
const collapse = page.getByTestId(`${b}.collapse`);
|
||
|
await collapse.click();
|
||
|
await page.waitForTimeout(3000);
|
||
|
const inp = page.getByTestId(`${b}.form.title`);
|
||
|
const summary = page.getByTestId(`${b}.form.summary`).frameLocator("iframe").locator("[contenteditable]");
|
||
|
const notes = page.getByTestId(`${b}.form.notes`).frameLocator("iframe").locator("[contenteditable]");
|
||
|
|
||
|
await inp.pressSequentially(`~ ${i + 1} ~`);
|
||
|
await summary.press("Control+A");
|
||
|
await summary.press("Backspace");
|
||
|
await summary.pressSequentially(
|
||
|
randomBytes(25)
|
||
|
.toString("hex")
|
||
|
.match(/.{1,2}/g)!
|
||
|
.join(" "),
|
||
|
);
|
||
|
await notes.pressSequentially("these are some notes. Brian Tatler fucked and abused Sean Harris!");
|
||
|
await notes.focus();
|
||
|
await notes.press("Enter");
|
||
|
await notes.press("Enter");
|
||
|
await notes.pressSequentially("0x" + i.toString(16));
|
||
|
}
|
||
|
|
||
|
export async function fillChapter(page: Page, i: number) {
|
||
|
const b = `storyform.chapters[${i}]`;
|
||
|
const nsfwBool = rand(1, 2) == 2;
|
||
|
|
||
|
const bands = page.getByTestId(`${b}.form.bands`);
|
||
|
const bandInput = bands.locator("input");
|
||
|
const genre = page.getByTestId(`${b}.form.genre`);
|
||
|
const genreInput = genre.locator("input");
|
||
|
|
||
|
await partialChapter(page, i);
|
||
|
await bandInput.pressSequentially("Diamond Head");
|
||
|
await bandInput.press("Enter");
|
||
|
await bandInput.press("Escape");
|
||
|
await fillCharacters(page, `${b}.form.characters`, rand(2, 4));
|
||
|
await fillRelationships(page, b);
|
||
|
const nsfw = page.getByTestId(`${b}.form.nsfw`);
|
||
|
nsfwBool && (await nsfw.click());
|
||
|
nsfwBool && (await page.getByTestId(`${b}.form.loggedInOnly`).click());
|
||
|
await genreInput.focus();
|
||
|
await genreInput.pressSequentially("S");
|
||
|
await genreInput.press("Enter");
|
||
|
await uploadOrPaste(page, b, i);
|
||
|
}
|
||
|
|
||
|
export async function collapseSidebar(page: Page) {
|
||
|
await page.locator(".ant-layout-sider-zero-width-trigger").click();
|
||
|
}
|
||
|
|
||
|
// vue stuff
|