Merge pull request #15623 from calixteman/editor_int_test

Fix editor tests on Windows
This commit is contained in:
calixteman 2022-10-26 11:31:07 +02:00 committed by GitHub
commit 9a33a0fba9
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 262 additions and 243 deletions

View File

@ -18,8 +18,25 @@ const {
getEditorSelector, getEditorSelector,
getSelectedEditors, getSelectedEditors,
loadAndWait, loadAndWait,
waitForEvent,
} = require("./test_utils.js"); } = require("./test_utils.js");
const copyPaste = async page => {
let promise = waitForEvent(page, "copy");
await page.keyboard.down("Control");
await page.keyboard.press("c");
await page.keyboard.up("Control");
await promise;
await page.waitForTimeout(10);
promise = waitForEvent(page, "paste");
await page.keyboard.down("Control");
await page.keyboard.press("v");
await page.keyboard.up("Control");
await promise;
};
describe("Editor", () => { describe("Editor", () => {
describe("FreeText", () => { describe("FreeText", () => {
let pages; let pages;
@ -32,10 +49,22 @@ describe("Editor", () => {
await closePages(pages); await closePages(pages);
}); });
const countStorageEntries = async page => const waitForStorageEntries = async (page, nEntries) => {
page.evaluate( await page.waitForFunction(
() => window.PDFViewerApplication.pdfDocument.annotationStorage.size n =>
window.PDFViewerApplication.pdfDocument.annotationStorage.size === n,
{},
nEntries
); );
};
const waitForSelected = async (page, selector) => {
await page.waitForFunction(
sel => document.querySelector(sel).classList.contains("selectedEditor"),
{},
selector
);
};
it("must write a string in a FreeText editor", async () => { it("must write a string in a FreeText editor", async () => {
await Promise.all( await Promise.all(
@ -69,9 +98,8 @@ describe("Editor", () => {
editorRect.y + 2 * editorRect.height editorRect.y + 2 * editorRect.height
); );
expect(await countStorageEntries(page)) await waitForSelected(page, getEditorSelector(0));
.withContext(`In ${browserName}`) await waitForStorageEntries(page, 1);
.toEqual(1);
const content = await page.$eval(getEditorSelector(0), el => const content = await page.$eval(getEditorSelector(0), el =>
el.innerText.trimEnd() el.innerText.trimEnd()
@ -82,8 +110,8 @@ describe("Editor", () => {
}); });
it("must copy/paste", async () => { it("must copy/paste", async () => {
await Promise.all( // Run sequentially to avoid clipboard issues.
pages.map(async ([browserName, page]) => { for (const [browserName, page] of pages) {
const editorRect = await page.$eval(getEditorSelector(0), el => { const editorRect = await page.$eval(getEditorSelector(0), el => {
const { x, y, width, height } = el.getBoundingClientRect(); const { x, y, width, height } = el.getBoundingClientRect();
return { x, y, width, height }; return { x, y, width, height };
@ -95,17 +123,9 @@ describe("Editor", () => {
editorRect.y + editorRect.height / 2 editorRect.y + editorRect.height / 2
); );
await page.keyboard.down("Control"); await waitForSelected(page, getEditorSelector(0));
await page.keyboard.press("c"); await copyPaste(page);
await page.keyboard.up("Control"); await waitForStorageEntries(page, 2);
await page.keyboard.down("Control");
await page.keyboard.press("v");
await page.keyboard.up("Control");
expect(await countStorageEntries(page))
.withContext(`In ${browserName}`)
.toEqual(2);
const content = await page.$eval(getEditorSelector(0), el => const content = await page.$eval(getEditorSelector(0), el =>
el.innerText.trimEnd() el.innerText.trimEnd()
@ -115,30 +135,16 @@ describe("Editor", () => {
el.innerText.trimEnd() el.innerText.trimEnd()
); );
expect(pastedContent) expect(pastedContent).withContext(`In ${browserName}`).toEqual(content);
.withContext(`In ${browserName}`)
.toEqual(content);
await page.keyboard.down("Control"); await copyPaste(page);
await page.keyboard.press("c"); await waitForStorageEntries(page, 3);
await page.keyboard.up("Control");
await page.keyboard.down("Control");
await page.keyboard.press("v");
await page.keyboard.up("Control");
expect(await countStorageEntries(page))
.withContext(`In ${browserName}`)
.toEqual(3);
pastedContent = await page.$eval(getEditorSelector(2), el => pastedContent = await page.$eval(getEditorSelector(2), el =>
el.innerText.trimEnd() el.innerText.trimEnd()
); );
expect(pastedContent) expect(pastedContent).withContext(`In ${browserName}`).toEqual(content);
.withContext(`In ${browserName}`) }
.toEqual(content);
})
);
}); });
it("must clear all", async () => { it("must clear all", async () => {
@ -160,16 +166,14 @@ describe("Editor", () => {
expect(hasEditor).withContext(`In ${browserName}`).toEqual(false); expect(hasEditor).withContext(`In ${browserName}`).toEqual(false);
} }
expect(await countStorageEntries(page)) await waitForStorageEntries(page, 0);
.withContext(`In ${browserName}`)
.toEqual(0);
}) })
); );
}); });
it("must check that a paste has been undone", async () => { it("must check that a paste has been undone", async () => {
await Promise.all( // Run sequentially to avoid clipboard issues.
pages.map(async ([browserName, page]) => { for (const [browserName, page] of pages) {
const rect = await page.$eval(".annotationEditorLayer", el => { const rect = await page.$eval(".annotationEditorLayer", el => {
const { x, y } = el.getBoundingClientRect(); const { x, y } = el.getBoundingClientRect();
return { x, y }; return { x, y };
@ -195,13 +199,8 @@ describe("Editor", () => {
editorRect.y + editorRect.height / 2 editorRect.y + editorRect.height / 2
); );
await page.keyboard.down("Control"); await waitForSelected(page, getEditorSelector(3));
await page.keyboard.press("c"); await copyPaste(page);
await page.keyboard.up("Control");
await page.keyboard.down("Control");
await page.keyboard.press("v");
await page.keyboard.up("Control");
let hasEditor = await page.evaluate(sel => { let hasEditor = await page.evaluate(sel => {
return !!document.querySelector(sel); return !!document.querySelector(sel);
@ -212,6 +211,7 @@ describe("Editor", () => {
await page.keyboard.down("Control"); await page.keyboard.down("Control");
await page.keyboard.press("z"); await page.keyboard.press("z");
await page.keyboard.up("Control"); await page.keyboard.up("Control");
await page.waitForTimeout(10);
hasEditor = await page.evaluate(sel => { hasEditor = await page.evaluate(sel => {
return !!document.querySelector(sel); return !!document.querySelector(sel);
@ -220,9 +220,12 @@ describe("Editor", () => {
expect(hasEditor).withContext(`In ${browserName}`).toEqual(false); expect(hasEditor).withContext(`In ${browserName}`).toEqual(false);
for (let i = 0; i < 2; i++) { for (let i = 0; i < 2; i++) {
const promise = waitForEvent(page, "paste");
await page.keyboard.down("Control"); await page.keyboard.down("Control");
await page.keyboard.press("v"); await page.keyboard.press("v");
await page.keyboard.up("Control"); await page.keyboard.up("Control");
await promise;
await page.waitForTimeout(10);
} }
let length = await page.evaluate(sel => { let length = await page.evaluate(sel => {
@ -234,14 +237,14 @@ describe("Editor", () => {
await page.keyboard.down("Control"); await page.keyboard.down("Control");
await page.keyboard.press("z"); await page.keyboard.press("z");
await page.keyboard.up("Control"); await page.keyboard.up("Control");
await page.waitForTimeout(10);
} }
length = await page.evaluate(sel => { length = await page.evaluate(sel => {
return document.querySelectorAll(sel).length; return document.querySelectorAll(sel).length;
}, `${getEditorSelector(5)}, ${getEditorSelector(6)}`); }, `${getEditorSelector(5)}, ${getEditorSelector(6)}`);
expect(length).withContext(`In ${browserName}`).toEqual(0); expect(length).withContext(`In ${browserName}`).toEqual(0);
}) }
);
}); });
it("must check that aria-owns is correct", async () => { it("must check that aria-owns is correct", async () => {
@ -332,6 +335,8 @@ describe("Editor", () => {
editorRect.y + editorRect.height / 2 editorRect.y + editorRect.height / 2
); );
await waitForSelected(page, getEditorSelector(8));
expect(await getSelectedEditors(page)) expect(await getSelectedEditors(page))
.withContext(`In ${browserName}`) .withContext(`In ${browserName}`)
.toEqual([8]); .toEqual([8]);
@ -367,8 +372,8 @@ describe("Editor", () => {
}); });
it("must select/unselect several editors and check copy, paste and delete operations", async () => { it("must select/unselect several editors and check copy, paste and delete operations", async () => {
await Promise.all( // Run sequentially to avoid clipboard issues.
pages.map(async ([browserName, page]) => { for (const [browserName, page] of pages) {
await page.click("#editorFreeText"); await page.click("#editorFreeText");
const rect = await page.$eval(".annotationEditorLayer", el => { const rect = await page.$eval(".annotationEditorLayer", el => {
@ -436,13 +441,7 @@ describe("Editor", () => {
.withContext(`In ${browserName}`) .withContext(`In ${browserName}`)
.toEqual([0, 1, 3]); .toEqual([0, 1, 3]);
await page.keyboard.down("Control"); await copyPaste(page);
await page.keyboard.press("c");
await page.keyboard.up("Control");
await page.keyboard.down("Control");
await page.keyboard.press("v");
await page.keyboard.up("Control");
// 0,1,3 are unselected and new pasted editors are selected. // 0,1,3 are unselected and new pasted editors are selected.
expect(await getSelectedEditors(page)) expect(await getSelectedEditors(page))
@ -510,8 +509,7 @@ describe("Editor", () => {
expect(await getSelectedEditors(page)) expect(await getSelectedEditors(page))
.withContext(`In ${browserName}`) .withContext(`In ${browserName}`)
.toEqual([0, 2, 4, 5, 6]); .toEqual([0, 2, 4, 5, 6]);
}) }
);
}); });
}); });
}); });

View File

@ -24,6 +24,9 @@ const {
describe("Interaction", () => { describe("Interaction", () => {
async function actAndWaitForInput(page, selector, action, clear = true) { async function actAndWaitForInput(page, selector, action, clear = true) {
await page.waitForSelector(selector, {
timeout: 0,
});
if (clear) { if (clear) {
await clearInput(page, selector); await clearInput(page, selector);
} }
@ -1430,13 +1433,18 @@ describe("Interaction", () => {
[45, 180], [45, 180],
[46, 270], [46, 270],
]) { ]) {
const rotation = await page.$eval( await page.waitForFunction(
(sel, b, a) => {
const el = document.querySelector(sel);
const rotation =
parseInt(el.getAttribute("data-main-rotation")) || 0;
return rotation === (360 + ((360 - (b + a)) % 360)) % 360;
},
{},
`[data-annotation-id='${ref}R']`, `[data-annotation-id='${ref}R']`,
el => parseInt(el.getAttribute("data-main-rotation") || 0) base,
angle
); );
expect(rotation)
.withContext(`In ${browserName}`)
.toEqual((360 + ((360 - (base + angle)) % 360)) % 360);
} }
base += 90; base += 90;
await page.click(getSelector("48R")); await page.click(getSelector("48R"));

View File

@ -87,3 +87,16 @@ function getSelectedEditors(page) {
}); });
} }
exports.getSelectedEditors = getSelectedEditors; exports.getSelectedEditors = getSelectedEditors;
async function waitForEvent(page, eventName, timeout = 30000) {
await Promise.race([
// add event listener and wait for event to fire before returning
page.evaluate(name => {
return new Promise(resolve => {
document.addEventListener(name, resolve, { once: true });
});
}, eventName),
page.waitForTimeout(timeout),
]);
}
exports.waitForEvent = waitForEvent;