Files
AFFiNE-Mirror/blocksuite/tests-legacy/utils/playwright.ts

111 lines
3.1 KiB
TypeScript

import crypto from 'node:crypto';
import fs from 'node:fs';
import path from 'node:path';
import process from 'node:process';
import { expect, type Page, test as baseTest } from '@playwright/test';
import {
enterPlaygroundRoom,
initEmptyParagraphState,
} from './actions/misc.js';
import { currentEditorIndex, scope } from './multiple-editor.js';
const istanbulTempDir = process.env.ISTANBUL_TEMP_DIR
? path.resolve(process.env.ISTANBUL_TEMP_DIR)
: path.join(process.cwd(), '.nyc_output');
function generateUUID() {
return crypto.randomUUID();
}
const enableCoverage = !!process.env.CI || !!process.env.COVERAGE;
export const scoped = (stringsArray: TemplateStringsArray) => {
return `${scope ?? ''}${stringsArray.join()}`;
};
export const test = baseTest.extend<{}>({
context: async ({ context }, use) => {
if (enableCoverage) {
await context.addInitScript(() =>
window.addEventListener('beforeunload', () =>
// @ts-expect-error
window.collectIstanbulCoverage(JSON.stringify(window.__coverage__))
)
);
await fs.promises.mkdir(istanbulTempDir, { recursive: true });
await context.exposeFunction(
'collectIstanbulCoverage',
(coverageJSON?: string) => {
if (coverageJSON)
fs.writeFileSync(
path.join(
istanbulTempDir,
`playwright_coverage_${generateUUID()}.json`
),
coverageJSON
);
}
);
}
await use(context);
if (enableCoverage) {
for (const page of context.pages()) {
await page.evaluate(() =>
// @ts-expect-error
window.collectIstanbulCoverage(JSON.stringify(window.__coverage__))
);
}
}
},
});
if (scope) {
test.beforeEach(async ({ browser }, testInfo) => {
if (!testInfo.title.startsWith(scope!)) {
testInfo.fn = () => {
testInfo.skip();
};
testInfo.skip();
await browser.close();
}
});
let page: Page;
test.beforeAll(async ({ browser }) => {
page = await browser.newPage();
});
// oxlint-disable-next-line no-empty-pattern
test.afterAll(async ({}, testInfo) => {
if (!testInfo.title.startsWith(scope!)) {
return;
}
const focusInSecondEditor = await page.evaluate(
([currentEditorIndex]) => {
const editor = document.querySelectorAll('affine-editor-container')[
currentEditorIndex
];
const selection = getSelection();
if (!selection || selection.rangeCount === 0) {
return true;
}
// once the range exists, it must be in the corresponding editor
return editor.contains(selection.getRangeAt(0).startContainer);
},
[currentEditorIndex]
);
expect(focusInSecondEditor).toBe(true);
});
test('ensure enable two editor', async ({ page }) => {
await enterPlaygroundRoom(page);
await initEmptyParagraphState(page);
const count = await page.evaluate(() => {
return document.querySelectorAll('affine-editor-container').length;
});
expect(count).toBe(2);
});
}