From c6c9cc96bf779e2923ebb639c584eefbbd104e8b Mon Sep 17 00:00:00 2001 From: Calixte Denizet Date: Thu, 10 Dec 2020 22:45:14 +0100 Subject: [PATCH] Follow-up of #12707: Add an integration test for checkboxes as radio buttons * Integration tests: Add a function to load a pdf and wait for a selected element * Integration tests: Add a function to close all the open pages --- test/integration/annotation_spec.js | 63 +++++++++++++++++++--------- test/integration/scripting_spec.js | 30 ++++--------- test/integration/test_utils.js | 36 ++++++++++++++++ test/pdfs/.gitignore | 1 + test/pdfs/issue12706.pdf | Bin 0 -> 47808 bytes 5 files changed, 88 insertions(+), 42 deletions(-) create mode 100644 test/integration/test_utils.js create mode 100644 test/pdfs/issue12706.pdf diff --git a/test/integration/annotation_spec.js b/test/integration/annotation_spec.js index ba798461e763b..40971ddd5b0fa 100644 --- a/test/integration/annotation_spec.js +++ b/test/integration/annotation_spec.js @@ -13,49 +13,72 @@ * limitations under the License. */ +const { closePages, loadAndWait } = require("./test_utils.js"); + describe("Annotation highlight", () => { describe("annotation-highlight.pdf", () => { let pages; beforeAll(async () => { - pages = await Promise.all( - global.integrationSessions.map(async session => { - const page = await session.browser.newPage(); - await page.goto( - `${global.integrationBaseUrl}?file=/test/pdfs/annotation-highlight.pdf` - ); - await page.bringToFront(); - await page.waitForSelector("[data-annotation-id='19R']", { - timeout: 0, - }); - return page; - }) + pages = await loadAndWait( + "annotation-highlight.pdf", + "[data-annotation-id='19R']" ); }); afterAll(async () => { - await Promise.all( - pages.map(async page => { - await page.close(); - }) - ); + await closePages(pages); }); it("must show a popup on mouseover", async () => { await Promise.all( - pages.map(async page => { + pages.map(async ([browserName, page]) => { let hidden = await page.$eval( "[data-annotation-id='21R']", el => el.hidden ); - expect(hidden).toEqual(true); + expect(hidden).withContext(`In ${browserName}`).toEqual(true); await page.hover("[data-annotation-id='19R']"); await page.waitForTimeout(100); hidden = await page.$eval( "[data-annotation-id='21R']", el => el.hidden ); - expect(hidden).toEqual(false); + expect(hidden).withContext(`In ${browserName}`).toEqual(false); + }) + ); + }); + }); +}); + +describe("Checkbox annotation", () => { + describe("issue12706.pdf", () => { + let pages; + + beforeAll(async () => { + pages = await loadAndWait("issue12706.pdf", "[data-annotation-id='63R']"); + }); + + afterAll(async () => { + await closePages(pages); + }); + + it("must let checkboxes with the same name behave like radio buttons", async () => { + const selectors = [63, 70, 79].map(n => `[data-annotation-id='${n}R']`); + await Promise.all( + pages.map(async ([browserName, page]) => { + for (const selector of selectors) { + await page.click(selector); + for (const otherSelector of selectors) { + const checked = await page.$eval( + `${otherSelector} > :first-child`, + el => el.checked + ); + expect(checked) + .withContext(`In ${browserName}`) + .toBe(selector === otherSelector); + } + } }) ); }); diff --git a/test/integration/scripting_spec.js b/test/integration/scripting_spec.js index 67835bfbb1d06..ae9999837d6c3 100644 --- a/test/integration/scripting_spec.js +++ b/test/integration/scripting_spec.js @@ -13,52 +13,38 @@ * limitations under the License. */ +const { closePages, loadAndWait } = require("./test_utils.js"); + describe("Interaction", () => { describe("in 160F-2019.pdf", () => { let pages; beforeAll(async () => { - pages = await Promise.all( - global.integrationSessions.map(async session => { - const page = await session.browser.newPage(); - await page.goto( - `${global.integrationBaseUrl}?file=/test/pdfs/160F-2019.pdf` - ); - await page.bringToFront(); - await page.waitForSelector("#\\34 16R", { - timeout: 0, - }); - return [session.name, page]; - }) - ); + pages = await loadAndWait("160F-2019.pdf", "#\\34 16R"); }); afterAll(async () => { - await Promise.all( - pages.map(async ([_, page]) => { - await page.close(); - }) - ); + await closePages(pages); }); it("must format the field with 2 digits and leave field with a click", async () => { await Promise.all( - pages.map(async ([name, page]) => { + pages.map(async ([browserName, page]) => { await page.type("#\\34 16R", "3.14159", { delay: 200 }); await page.click("#\\34 19R"); const text = await page.$eval("#\\34 16R", el => el.value); - expect(text).withContext(`In ${name}`).toEqual("3,14"); + expect(text).withContext(`In ${browserName}`).toEqual("3,14"); }) ); }); it("must format the field with 2 digits and leave field with a TAB", async () => { await Promise.all( - pages.map(async ([name, page]) => { + pages.map(async ([browserName, page]) => { await page.type("#\\34 22R", "2.7182818", { delay: 200 }); await page.keyboard.press("Tab"); const text = await page.$eval("#\\34 22R", el => el.value); - expect(text).withContext(`In ${name}`).toEqual("2,72"); + expect(text).withContext(`In ${browserName}`).toEqual("2,72"); }) ); }); diff --git a/test/integration/test_utils.js b/test/integration/test_utils.js new file mode 100644 index 0000000000000..bb22fb97a603b --- /dev/null +++ b/test/integration/test_utils.js @@ -0,0 +1,36 @@ +/* Copyright 2020 Mozilla Foundation + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +exports.loadAndWait = (filename, selector) => + Promise.all( + global.integrationSessions.map(async session => { + const page = await session.browser.newPage(); + await page.goto( + `${global.integrationBaseUrl}?file=/test/pdfs/${filename}` + ); + await page.bringToFront(); + await page.waitForSelector(selector, { + timeout: 0, + }); + return [session.name, page]; + }) + ); + +exports.closePages = pages => + Promise.all( + pages.map(async ([_, page]) => { + await page.close(); + }) + ); diff --git a/test/pdfs/.gitignore b/test/pdfs/.gitignore index 7ec52a9155643..e4fca428adc0a 100644 --- a/test/pdfs/.gitignore +++ b/test/pdfs/.gitignore @@ -331,6 +331,7 @@ !issue5334.pdf !annotation-caret-ink.pdf !bug1186827.pdf +!issue12706.pdf !issue215.pdf !issue5044.pdf !issue1512r.pdf diff --git a/test/pdfs/issue12706.pdf b/test/pdfs/issue12706.pdf new file mode 100644 index 0000000000000000000000000000000000000000..40bd9e4d49d9aab6432baa09f36f5d8dda234339 GIT binary patch literal 47808 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 XN&GUDHr7r2F6Nw__~l5go5b%Awf%~< literal 0 HcmV?d00001