Merge pull request #15623 from calixteman/editor_int_test
Fix editor tests on Windows
This commit is contained in:
commit
9a33a0fba9
@ -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]);
|
||||||
})
|
}
|
||||||
);
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -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"));
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user