feat(tests/browser): add playwright helpers
This commit is contained in:
		
							parent
							
								
									0c038fe708
								
							
						
					
					
						commit
						82faaa5179
					
				
							
								
								
									
										128
									
								
								lib/testing/helpers.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								lib/testing/helpers.ts
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,128 @@ | |||||||
|  | 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
 | ||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user