mirror of
https://github.com/go-gitea/gitea.git
synced 2026-07-14 01:11:55 +02:00
`data-render-name` is set before the plugin's async render runs, so measuring the container height right after the attribute appears can observe the pre-render 48px height when the `pdfobject` chunk loads slowly (flaked in CI). Poll for the height instead, like the asciicast test in the same file does.
64 lines
3.8 KiB
TypeScript
64 lines
3.8 KiB
TypeScript
import {env} from 'node:process';
|
|
import {expect, test} from '@playwright/test';
|
|
import {apiCreateRepo, apiCreateFile, assertFlushWithParent, assertNoJsError, login, randomString} from './utils.ts';
|
|
|
|
test('3d model file', async ({page, request, browserName}) => {
|
|
test.skip(browserName === 'firefox', 'unclear firefox-only CI-only failure'); // eslint-disable-line playwright/no-skipped-test
|
|
const repoName = `e2e-3d-render-${randomString(8)}`;
|
|
const owner = env.GITEA_TEST_E2E_USER;
|
|
await apiCreateRepo(request, {name: repoName});
|
|
const stl = 'solid test\nfacet normal 0 0 1\nouter loop\nvertex 0 0 0\nvertex 1 0 0\nvertex 0 1 0\nendloop\nendfacet\nendsolid test\n';
|
|
await apiCreateFile(request, owner, repoName, 'test.stl', stl);
|
|
await page.goto(`/${owner}/${repoName}/src/branch/main/test.stl?display=rendered`);
|
|
const iframe = page.locator('iframe.external-render-iframe');
|
|
await expect(iframe).toBeVisible();
|
|
const frame = page.frameLocator('iframe.external-render-iframe');
|
|
const viewer = frame.locator('#frontend-render-viewer');
|
|
await expect(viewer.locator('canvas')).toBeVisible(); // unclear firefox-only CI-only failure
|
|
expect((await viewer.boundingBox())!.height).toBeGreaterThan(300);
|
|
await assertFlushWithParent(iframe, page.locator('.file-view'));
|
|
// bgcolor passed via gitea-iframe-bgcolor; 3D viewer reads it from body bgcolor — must match parent
|
|
const [parentBg, iframeBg] = await Promise.all([
|
|
page.evaluate(() => getComputedStyle(document.body).backgroundColor),
|
|
frame.locator('body').evaluate((el) => getComputedStyle(el).backgroundColor),
|
|
]);
|
|
expect(iframeBg).toBe(parentBg);
|
|
await assertNoJsError(page);
|
|
});
|
|
|
|
test('pdf file', async ({page, request}) => {
|
|
// headless playwright cannot render PDFs (PDFObject.embed returns false), so this is a limited test
|
|
const repoName = `e2e-pdf-render-${randomString(8)}`;
|
|
const owner = env.GITEA_TEST_E2E_USER;
|
|
await apiCreateRepo(request, {name: repoName});
|
|
await apiCreateFile(request, owner, repoName, 'test.pdf', '%PDF-1.0\n%%EOF\n');
|
|
await page.goto(`/${owner}/${repoName}/src/branch/main/test.pdf`);
|
|
const container = page.locator('.file-view-render-container');
|
|
await expect(container).toHaveAttribute('data-render-name', 'pdf-viewer');
|
|
await expect.poll(async () => (await container.boundingBox())!.height).toBeGreaterThan(300);
|
|
await assertFlushWithParent(container, page.locator('.file-view'));
|
|
});
|
|
|
|
test('asciicast file', async ({page, request}) => {
|
|
const repoName = `e2e-asciicast-render-${randomString(8)}`;
|
|
const owner = env.GITEA_TEST_E2E_USER;
|
|
const branch = '日本語-branch';
|
|
const branchEnc = encodeURIComponent(branch);
|
|
await Promise.all([apiCreateRepo(request, {name: repoName, autoInit: false}), login(page)]);
|
|
const cast = '{"version": 2, "width": 80, "height": 24}\n[0.0, "o", "test-content"]\n';
|
|
// on an empty repo, apiCreateFile with newBranch creates that branch as the initial commit
|
|
await apiCreateFile(request, owner, repoName, 'test.cast', cast, {newBranch: branch});
|
|
await page.goto(`/${owner}/${repoName}/src/branch/${branchEnc}/test.cast`);
|
|
const iframe = page.locator('iframe.external-render-iframe');
|
|
const frame = iframe.contentFrame();
|
|
const viewer = frame.locator('#frontend-render-viewer[data-frontend-render-name]');
|
|
await expect(viewer).toHaveAttribute('data-frontend-render-name', 'asciicast'); // render succeeded
|
|
await expect(viewer).toHaveAttribute('data-window-origin', 'null'); // no same-origin, avoid XSS
|
|
const wrapper = frame.locator('.ap-wrapper');
|
|
await expect(wrapper).toBeVisible();
|
|
await expect(wrapper).toContainText('test-content');
|
|
await expect.poll(async () => (await iframe.boundingBox())!.height).toBeGreaterThan(300);
|
|
await assertFlushWithParent(iframe, page.locator('.file-view'));
|
|
await assertNoJsError(page);
|
|
});
|