From b78c85c4d12edf45dcd81e534cfb89910d15741a Mon Sep 17 00:00:00 2001 From: Rishabh Gautam <47270636+RG7279805@users.noreply.github.com> Date: Tue, 5 Sep 2023 12:46:04 +0530 Subject: [PATCH] Restructure tests and add Gutenberg tests on BrowserStack (#1079) --- .github/workflows/CI.yml | 61 ++++++++++++++---- package.json | 20 +++--- tests/{ => e2e}/paths.js | 4 +- .../runners/chrome}/chrome58.bs.runner.js | 7 +- .../e2e/runners/chrome/chrome60.bs.runner.js | 41 ++++++++++++ .../runners/chrome}/chromium.e2e.runner.js | 6 +- .../runners/edge}/edge18.bs.runner.js | 12 ++-- .../runners/edge}/ieMode.e2e.runner.js | 4 +- .../runners/edge}/microsoftEdge.e2e.runner.js | 4 +- .../runners/firefox}/firefox.e2e.runner.js | 6 +- .../runners/firefox}/firefox56.bs.runner.js | 2 +- .../runners/firefox/firefox70.bs.runner.js} | 14 ++-- .../runners/safari}/safari14.bs.runner.js | 14 ++-- tests/{ => e2e/spec}/gutenberg_ro.e2e.spec.js | 54 ++++++++++------ .../spec}/legacy-ray_charles.e2e.spec.js | 6 +- tests/{ => unit}/index.html | 6 +- tests/{ => unit}/initTestCafe.js | 2 +- tests/{ => unit/js}/init.js | 4 +- tests/{ => unit/spec}/tests.js | 14 ++-- tests/{ => zims/foo-zstd}/foo-zstd.zim | Bin .../gutenberg_ro_all_2023-08.zim | Bin .../wikipedia_en_ray_charles_2015-06.zimaa | Bin .../wikipedia_en_ray_charles_2015-06.zimab | Bin .../wikipedia_en_ray_charles_2015-06.zimac | Bin .../wikipedia_en_ray_charles_2015-06.zimad | Bin .../wikipedia_en_ray_charles_2015-06.zimae | Bin .../wikipedia_en_ray_charles_2015-06.zimaf | Bin .../wikipedia_en_ray_charles_2015-06.zimag | Bin .../wikipedia_en_ray_charles_2015-06.zimah | Bin .../wikipedia_en_ray_charles_2015-06.zimai | Bin .../wikipedia_en_ray_charles_2015-06.zimaj | Bin .../wikipedia_en_ray_charles_2015-06.zimak | Bin .../wikipedia_en_ray_charles_2015-06.zimal | Bin .../wikipedia_en_ray_charles_2015-06.zimam | Bin .../wikipedia_en_ray_charles_2015-06.ziman | Bin .../wikipedia_en_ray_charles_2015-06.zimao | Bin 36 files changed, 189 insertions(+), 92 deletions(-) rename tests/{ => e2e}/paths.js (58%) rename tests/{ => e2e/runners/chrome}/chrome58.bs.runner.js (82%) create mode 100644 tests/e2e/runners/chrome/chrome60.bs.runner.js rename tests/{ => e2e/runners/chrome}/chromium.e2e.runner.js (80%) rename tests/{ => e2e/runners/edge}/edge18.bs.runner.js (69%) rename tests/{ => e2e/runners/edge}/ieMode.e2e.runner.js (81%) rename tests/{ => e2e/runners/edge}/microsoftEdge.e2e.runner.js (82%) rename tests/{ => e2e/runners/firefox}/firefox.e2e.runner.js (84%) rename tests/{ => e2e/runners/firefox}/firefox56.bs.runner.js (94%) rename tests/{firefox61.bs.runner.js => e2e/runners/firefox/firefox70.bs.runner.js} (74%) rename tests/{ => e2e/runners/safari}/safari14.bs.runner.js (66%) rename tests/{ => e2e/spec}/gutenberg_ro.e2e.spec.js (89%) rename tests/{ => e2e/spec}/legacy-ray_charles.e2e.spec.js (98%) rename tests/{ => unit}/index.html (91%) rename tests/{ => unit}/initTestCafe.js (87%) rename tests/{ => unit/js}/init.js (92%) rename tests/{ => unit/spec}/tests.js (98%) rename tests/{ => zims/foo-zstd}/foo-zstd.zim (100%) rename tests/{ => zims/gutenberg-ro}/gutenberg_ro_all_2023-08.zim (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimaa (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimab (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimac (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimad (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimae (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimaf (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimag (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimah (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimai (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimaj (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimak (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimal (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimam (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.ziman (100%) rename tests/{ => zims/legacy-ray-charles}/wikipedia_en_ray_charles_2015-06.zimao (100%) diff --git a/.github/workflows/CI.yml b/.github/workflows/CI.yml index ee184682..2afe7863 100644 --- a/.github/workflows/CI.yml +++ b/.github/workflows/CI.yml @@ -93,30 +93,63 @@ jobs: local-testing: start local-identifier: random - - name: Run BrowserStack tests + - name: Run App locally in background if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository env: BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} - run: | - npx http-server --silent -p 8099 & - echo -e "\n\e[0;32mTesting on Edge Legacy 18 / Win10..." - npx mocha tests/edge18.bs.runner.js - echo -e "\n\e[0;32mTesting on Firefox Legacy 56 / Win10..." - npx mocha tests/firefox56.bs.runner.js - echo -e "\n\e[0;32mTesting on Firefox 61 / Win10..." - npx mocha tests/firefox61.bs.runner.js - echo -e "\n\e[0;32mTesting on Chrome 58 / Mojave..." - npx mocha tests/chrome58.bs.runner.js - echo -e "\n\e[0;32mTesting on Safari 14 / Big Sur..." - npx mocha tests/safari14.bs.runner.js + run: npx http-server --silent -p 8099 & + + - name: Run BrowserStack tests on Firefox Legacy 56 / Win10 + if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository + env: + BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} + BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + run: npx mocha tests/e2e/runners/firefox/firefox56.bs.runner.js + + - name: Run BrowserStack tests on Firefox 70 / Win10 [Gutenberg] + if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository + env: + BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} + BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + run: npx mocha tests/e2e/runners/firefox/firefox70.bs.runner.js + + - name: Run BrowserStack tests on Chrome 58 / Mojave + if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository + env: + BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} + BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + run: npx mocha tests/e2e/runners/chrome/chrome58.bs.runner.js + + - name: Run BrowserStack tests on Chrome 60 / Mojave + if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository + env: + BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} + BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + run: npx mocha tests/e2e/runners/chrome/chrome60.bs.runner.js + + - name: Run BrowserStack tests on Safari 14 / Big Sur + if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository + env: + BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} + BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + run: npx mocha tests/e2e/runners/safari/safari14.bs.runner.js + + # [DEV] Test on Edge18 are bit flaky, so we are retrying 2 times + - name: Run BrowserStack tests on Edge Legacy 18 / Win10 + if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository + env: + BROWSERSTACK_USERNAME: ${{ secrets.BROWSERSTACK_USERNAME }} + BROWSERSTACK_ACCESS_KEY: ${{ secrets.BROWSERSTACK_ACCESS_KEY }} + run: npx mocha tests/e2e/runners/edge/edge18.bs.runner.js --retries 2 + - name: Stop BrowserStackLocal if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name == github.repository uses: browserstack/github-actions/setup-local@master with: local-testing: stop - + tests-windows: if: github.event_name == 'push' || github.event.pull_request.head.repo.full_name != github.repository runs-on: windows-latest diff --git a/package.json b/package.json index e0f48597..f63dbeb6 100644 --- a/package.json +++ b/package.json @@ -10,18 +10,18 @@ "prebuild-src": "del-cli dist", "build-src": "rollup --config --file dist/www/js/bundle.js", "del-dist": "del-cli dist", - "test": "testcafe all ./tests/initTestCafe.js --app \"http-server --silent -p 8080 .\"", - "test-unit-browsers": "testcafe firefox:headless,chrome:headless,edge:headless ./tests/initTestCafe.js --app \"http-server --silent -p 8080 .\"", - "test-unit-firefox": "testcafe firefox:headless ./tests/initTestCafe.js --app \"http-server --silent -p 8080 .\"", - "test-unit-chrome": "testcafe chrome:headless ./tests/initTestCafe.js --app \"http-server --silent -p 8080 .\"", - "test-unit-edge": "testcafe edge:headless ./tests/initTestCafe.js --app \"http-server --silent -p 8080 .\"", - "test-unit-mac": "testcafe safari ./tests/initTestCafe.js --app \"http-server --silent -p 8080 .\"", + "test": "testcafe all ./tests/unit/initTestCafe.js --app \"http-server --silent -p 8080 .\"", + "test-unit-browsers": "testcafe firefox:headless,chrome:headless,edge:headless ./tests/unit/initTestCafe.js --app \"http-server --silent -p 8080 .\"", + "test-unit-firefox": "testcafe firefox:headless ./tests/unit/initTestCafe.js --app \"http-server --silent -p 8080 .\"", + "test-unit-chrome": "testcafe chrome:headless ./tests/unit/initTestCafe.js --app \"http-server --silent -p 8080 .\"", + "test-unit-edge": "testcafe edge:headless ./tests/unit/initTestCafe.js --app \"http-server --silent -p 8080 .\"", + "test-unit-mac": "testcafe safari ./tests/unit/initTestCafe.js --app \"http-server --silent -p 8080 .\"", "web-server": "http-server -p 8080 .", "test-e2e": "npm run test-e2e-firefox && npm run test-e2e-chrome && npm run test-e2e-edge && npm run test-e2e-iemode", - "test-e2e-firefox": "npx start-server-and-test 'http-server --silent' 8080 'npx mocha ./tests/firefox.e2e.runner.js'", - "test-e2e-chrome": "npx start-server-and-test 'http-server --silent' 8080 'npx mocha ./tests/chromium.e2e.runner.js'", - "test-e2e-edge": "npx start-server-and-test 'http-server --silent' 8080 'npx mocha ./tests/microsoftEdge.e2e.runner.js'", - "test-e2e-iemode": "npx start-server-and-test 'http-server --silent' 8080 'npx mocha ./tests/ieMode.e2e.runner.js'" + "test-e2e-firefox": "npx start-server-and-test 'http-server --silent' 8080 'npx mocha ./tests/e2e/runners/firefox/firefox.e2e.runner.js'", + "test-e2e-chrome": "npx start-server-and-test 'http-server --silent' 8080 'npx mocha ./tests/e2e/runners/chrome/chromium.e2e.runner.js'", + "test-e2e-edge": "npx start-server-and-test 'http-server --silent' 8080 'npx mocha ./tests/e2e/runners/edge/microsoftEdge.e2e.runner.js'", + "test-e2e-iemode": "npx start-server-and-test 'http-server --silent' 8080 'npx mocha ./tests/e2e/runners/edge/ieMode.e2e.runner.js'" }, "engines": { "node": ">=10" diff --git a/tests/paths.js b/tests/e2e/paths.js similarity index 58% rename from tests/paths.js rename to tests/e2e/paths.js index 8059152f..6ba8e0e4 100644 --- a/tests/paths.js +++ b/tests/e2e/paths.js @@ -4,8 +4,8 @@ import path from 'path'; -const rayCharlesBaseFile = path.resolve('./tests/wikipedia_en_ray_charles_2015-06.zimaa'); -const gutenbergRoBaseFile = path.resolve('./tests/gutenberg_ro_all_2023-08.zim'); +const rayCharlesBaseFile = path.resolve('./tests/zims/legacy-ray-charles/wikipedia_en_ray_charles_2015-06.zimaa'); +const gutenbergRoBaseFile = path.resolve('./tests/zims/gutenberg-ro/gutenberg_ro_all_2023-08.zim'); const downloadDir = path.resolve('./tests/'); export default { diff --git a/tests/chrome58.bs.runner.js b/tests/e2e/runners/chrome/chrome58.bs.runner.js similarity index 82% rename from tests/chrome58.bs.runner.js rename to tests/e2e/runners/chrome/chrome58.bs.runner.js index 535aecb9..8880e143 100644 --- a/tests/chrome58.bs.runner.js +++ b/tests/e2e/runners/chrome/chrome58.bs.runner.js @@ -1,5 +1,5 @@ import { Builder } from 'selenium-webdriver'; -import legacyRayCharles from './legacy-ray_charles.e2e.spec.js'; +import legacyRayCharles from '../../spec/legacy-ray_charles.e2e.spec.js'; /* eslint-disable camelcase */ @@ -29,9 +29,8 @@ async function loadChromeDriver () { return driver; }; -const driver_chrome = await loadChromeDriver(); - // Maximize the window so that full browser state is visible in the screenshots // await driver_chrome.manage().window().maximize(); // Not supported in this version / Selenium -legacyRayCharles.runTests(driver_chrome); +// make sure to use await running tests or we are charged unnecessarily on Browserstack +await legacyRayCharles.runTests(await loadChromeDriver()); diff --git a/tests/e2e/runners/chrome/chrome60.bs.runner.js b/tests/e2e/runners/chrome/chrome60.bs.runner.js new file mode 100644 index 00000000..fcb04890 --- /dev/null +++ b/tests/e2e/runners/chrome/chrome60.bs.runner.js @@ -0,0 +1,41 @@ +import { Builder } from 'selenium-webdriver'; +import { Options } from 'selenium-webdriver/chrome.js'; +import gutenbergRo from '../../spec/gutenberg_ro.e2e.spec.js'; +import paths from '../../paths.js'; + +/* eslint-disable camelcase */ + +// Input capabilities +const capabilities = { + 'bstack:options': { + os: 'OS X', + osVersion: 'Mojave', + browserVersion: '60.0', + projectName: 'BStack Project Name: Kiwix JS e2e tests', + buildName: 'BStack Build Name: Chrome 58 on Mojave', + local: true, + localIdentifier: process.env.BROWSERSTACK_LOCAL_IDENTIFIER, + userName: process.env.BROWSERSTACK_USERNAME, + accessKey: process.env.BROWSERSTACK_ACCESS_KEY, + seleniumVersion: '3.141.59' + }, + browserName: 'Chrome' +}; + +async function loadChromeDriver () { + const options = new Options() + options.setUserPreferences({ 'download.default_directory': paths.downloadDir }); + + const driver = await new Builder() + // .forBrowser('edge') + .usingServer('https://hub-cloud.browserstack.com/wd/hub') + .withCapabilities(capabilities) + .build(); + return driver; +}; + +// Maximize the window so that full browser state is visible in the screenshots +// await driver_chrome.manage().window().maximize(); // Not supported in this version / Selenium + +// make sure to use await running tests or we are charged unnecessarily on Browserstack +await gutenbergRo.runTests(await loadChromeDriver()); diff --git a/tests/chromium.e2e.runner.js b/tests/e2e/runners/chrome/chromium.e2e.runner.js similarity index 80% rename from tests/chromium.e2e.runner.js rename to tests/e2e/runners/chrome/chromium.e2e.runner.js index aa3834ae..5f72d434 100644 --- a/tests/chromium.e2e.runner.js +++ b/tests/e2e/runners/chrome/chromium.e2e.runner.js @@ -1,8 +1,8 @@ import { Builder } from 'selenium-webdriver'; import { Options } from 'selenium-webdriver/chrome.js'; -import legacyRayCharles from './legacy-ray_charles.e2e.spec.js'; -import gutenbergRo from './gutenberg_ro.e2e.spec.js'; -import paths from './paths.js'; +import legacyRayCharles from '../../spec/legacy-ray_charles.e2e.spec.js'; +import gutenbergRo from '../../spec/gutenberg_ro.e2e.spec.js'; +import paths from '../../paths.js'; /* eslint-disable camelcase */ diff --git a/tests/edge18.bs.runner.js b/tests/e2e/runners/edge/edge18.bs.runner.js similarity index 69% rename from tests/edge18.bs.runner.js rename to tests/e2e/runners/edge/edge18.bs.runner.js index a37f6517..47590146 100644 --- a/tests/edge18.bs.runner.js +++ b/tests/e2e/runners/edge/edge18.bs.runner.js @@ -1,5 +1,6 @@ import { Builder } from 'selenium-webdriver'; -import legacyRayCharles from './legacy-ray_charles.e2e.spec.js'; +import legacyRayCharles from '../../spec/legacy-ray_charles.e2e.spec.js'; +import gutenbergRo from '../../spec/gutenberg_ro.e2e.spec.js'; /* eslint-disable camelcase */ @@ -29,12 +30,13 @@ async function loadEdgeLegacyDriver () { .usingServer('https://hub-cloud.browserstack.com/wd/hub') .withCapabilities(capabilities) .build(); + // Maximize the window so that full browser state is visible in the screenshots + await driver.manage().window().maximize(); return driver; }; const driver_edge_legacy = await loadEdgeLegacyDriver(); +await legacyRayCharles.runTests(driver_edge_legacy); -// Maximize the window so that full browser state is visible in the screenshots -await driver_edge_legacy.manage().window().maximize(); - -legacyRayCharles.runTests(driver_edge_legacy); +const driver_edge_gutenberg = await loadEdgeLegacyDriver(); +await gutenbergRo.runTests(driver_edge_gutenberg); diff --git a/tests/ieMode.e2e.runner.js b/tests/e2e/runners/edge/ieMode.e2e.runner.js similarity index 81% rename from tests/ieMode.e2e.runner.js rename to tests/e2e/runners/edge/ieMode.e2e.runner.js index 40db13a0..672722f8 100644 --- a/tests/ieMode.e2e.runner.js +++ b/tests/e2e/runners/edge/ieMode.e2e.runner.js @@ -1,7 +1,7 @@ import { Builder } from 'selenium-webdriver'; import { Options } from 'selenium-webdriver/ie.js'; -import legacyRayCharles from './legacy-ray_charles.e2e.spec.js'; -import gutenbergRo from './gutenberg_ro.e2e.spec.js'; +import legacyRayCharles from '../../spec/legacy-ray_charles.e2e.spec.js'; +import gutenbergRo from '../../spec/gutenberg_ro.e2e.spec.js'; /* eslint-disable camelcase */ diff --git a/tests/microsoftEdge.e2e.runner.js b/tests/e2e/runners/edge/microsoftEdge.e2e.runner.js similarity index 82% rename from tests/microsoftEdge.e2e.runner.js rename to tests/e2e/runners/edge/microsoftEdge.e2e.runner.js index f36f2167..94644b18 100644 --- a/tests/microsoftEdge.e2e.runner.js +++ b/tests/e2e/runners/edge/microsoftEdge.e2e.runner.js @@ -1,7 +1,7 @@ import { Builder } from 'selenium-webdriver'; import { Options } from 'selenium-webdriver/edge.js'; -import legacyRayCharles from './legacy-ray_charles.e2e.spec.js'; -import gutenbergRo from './gutenberg_ro.e2e.spec.js'; +import legacyRayCharles from '../../spec/legacy-ray_charles.e2e.spec.js'; +import gutenbergRo from '../../spec/gutenberg_ro.e2e.spec.js'; /* eslint-disable camelcase */ async function loadMSEdgeDriver () { diff --git a/tests/firefox.e2e.runner.js b/tests/e2e/runners/firefox/firefox.e2e.runner.js similarity index 84% rename from tests/firefox.e2e.runner.js rename to tests/e2e/runners/firefox/firefox.e2e.runner.js index a2472886..b26def02 100644 --- a/tests/firefox.e2e.runner.js +++ b/tests/e2e/runners/firefox/firefox.e2e.runner.js @@ -1,8 +1,8 @@ import { Builder } from 'selenium-webdriver'; import firefox from 'selenium-webdriver/firefox.js'; -import legacyRayCharles from './legacy-ray_charles.e2e.spec.js'; -import gutenbergRo from './gutenberg_ro.e2e.spec.js'; -import paths from './paths.js'; +import legacyRayCharles from '../../spec/legacy-ray_charles.e2e.spec.js'; +import gutenbergRo from '../../spec/gutenberg_ro.e2e.spec.js'; +import paths from '../../paths.js'; /* eslint-disable camelcase */ diff --git a/tests/firefox56.bs.runner.js b/tests/e2e/runners/firefox/firefox56.bs.runner.js similarity index 94% rename from tests/firefox56.bs.runner.js rename to tests/e2e/runners/firefox/firefox56.bs.runner.js index 6374ae2e..0354ae25 100644 --- a/tests/firefox56.bs.runner.js +++ b/tests/e2e/runners/firefox/firefox56.bs.runner.js @@ -1,5 +1,5 @@ import { Builder } from 'selenium-webdriver'; -import legacyRayCharles from './legacy-ray_charles.e2e.spec.js'; +import legacyRayCharles from '../../spec/legacy-ray_charles.e2e.spec.js'; /* eslint-disable camelcase */ diff --git a/tests/firefox61.bs.runner.js b/tests/e2e/runners/firefox/firefox70.bs.runner.js similarity index 74% rename from tests/firefox61.bs.runner.js rename to tests/e2e/runners/firefox/firefox70.bs.runner.js index 057c6e65..06c71f88 100644 --- a/tests/firefox61.bs.runner.js +++ b/tests/e2e/runners/firefox/firefox70.bs.runner.js @@ -1,6 +1,5 @@ import { Builder } from 'selenium-webdriver'; -import legacyRayCharles from './legacy-ray_charles.e2e.spec.js'; - +import gutenbergRo from '../../spec/gutenberg_ro.e2e.spec.js'; /* eslint-disable camelcase */ // Input capabilities @@ -8,7 +7,7 @@ const capabilities = { 'bstack:options': { os: 'Windows', osVersion: '10', - browserVersion: '61.0', + browserVersion: '70.0', projectName: 'BStack Project Name: Kiwix JS e2e tests', buildName: 'BStack Build Name: Firefox 61', local: true, @@ -26,14 +25,13 @@ async function loadFirefoxDriver () { .usingServer('https://hub-cloud.browserstack.com/wd/hub') .withCapabilities(capabilities) .build(); + // Maximize the window so that full browser state is visible in the screenshots + await driver.manage().window().maximize(); return driver; }; -const driver_fx = await loadFirefoxDriver(); - -// Maximize the window so that full browser state is visible in the screenshots -await driver_fx.manage().window().maximize(); +const driver_gutenberg_fx = await loadFirefoxDriver(); // Run test in SW mode only console.log('Running tests in Service Worker mode only for this browser version'); -legacyRayCharles.runTests(driver_fx, ['serviceworker']); +await gutenbergRo.runTests(driver_gutenberg_fx); diff --git a/tests/safari14.bs.runner.js b/tests/e2e/runners/safari/safari14.bs.runner.js similarity index 66% rename from tests/safari14.bs.runner.js rename to tests/e2e/runners/safari/safari14.bs.runner.js index 25df40d6..76afced7 100644 --- a/tests/safari14.bs.runner.js +++ b/tests/e2e/runners/safari/safari14.bs.runner.js @@ -1,5 +1,6 @@ import { Builder } from 'selenium-webdriver'; -import legacyRayCharles from './legacy-ray_charles.e2e.spec.js'; +import legacyRayCharles from '../../spec/legacy-ray_charles.e2e.spec.js'; +import gutenbergRo from '../../spec/gutenberg_ro.e2e.spec.js'; /* eslint-disable camelcase */ @@ -26,13 +27,16 @@ async function loadSafariDriver () { .usingServer('https://hub-cloud.browserstack.com/wd/hub') .withCapabilities(capabilities) .build(); + // Maximize the window so that full browser state is visible in the screenshots + await driver.manage().window().maximize(); return driver; }; -const driver_safari = await loadSafariDriver(); +const driver_legacy_safari = await loadSafariDriver(); -// Maximize the window so that full browser state is visible in the screenshots -await driver_safari.manage().window().maximize(); // Browserstack Safari does not support Service Workers console.log('Running tests in jQuery mode only for this browser version') -legacyRayCharles.runTests(driver_safari, ['jquery']); +await legacyRayCharles.runTests(driver_legacy_safari, ['jquery']); + +const driver_gutenberg_safari = await loadSafariDriver(); +await gutenbergRo.runTests(driver_gutenberg_safari, ['jquery']); diff --git a/tests/gutenberg_ro.e2e.spec.js b/tests/e2e/spec/gutenberg_ro.e2e.spec.js similarity index 89% rename from tests/gutenberg_ro.e2e.spec.js rename to tests/e2e/spec/gutenberg_ro.e2e.spec.js index 97cfcc6d..4232085d 100644 --- a/tests/gutenberg_ro.e2e.spec.js +++ b/tests/e2e/spec/gutenberg_ro.e2e.spec.js @@ -23,13 +23,19 @@ // eslint-disable-next-line no-unused-vars import { By, Key, until, WebDriver } from 'selenium-webdriver'; import assert from 'assert'; -import paths from './paths.js'; +import paths from '../paths.js'; import fs from 'fs'; /* eslint-disable camelcase */ /* global describe, it */ -const port = process.env.BROWSERSTACK_LOCAL_IDENTIFIER ? '8099' : '8080'; +// Get the BrowserStack environment variable +const BROWSERSTACK = !!process.env.BROWSERSTACK_LOCAL_IDENTIFIER; +// DEV: For local testing, use line below instead +// const BROWSERSTACK = true; + +const port = BROWSERSTACK ? '8099' : '8080'; +const gutenbergRoBaseFile = BROWSERSTACK ? '/tests/zims/gutenberg-ro/gutenberg_ro_all_2023-08.zim' : paths.gutenbergRoBaseFile /** * Run the tests @@ -100,7 +106,7 @@ function runTests (driver, modes) { this.slow(10000); // Run tests twice, once in serviceworker mode and once in jquery mode it('Load Kiwix JS and check title', async function () { - await driver.get('http://localhost:8080/dist/www/index.html'); + await driver.get('http://localhost:' + port + '/dist/www/index.html'); const title = await driver.getTitle(); assert.equal('Kiwix', title); }); @@ -175,17 +181,24 @@ function runTests (driver, modes) { console.log('\x1b[33m%s\x1b[0m', ' Test skipped.'); return; } - const archiveFiles = await driver.findElement(By.id('archiveFiles')); - await archiveFiles.sendKeys(paths.gutenbergRoBaseFile); // Wait until files have loaded var filesLength; - await driver.wait(async function () { + const isFileLoaded = await driver.wait(async function () { // check if file has been loaded filesLength = await driver.executeScript('return document.getElementById("archiveFiles").files.length'); return filesLength === 1; - }, 5000); - // Check that we loaded 1 file - assert.equal(1, filesLength); + }, 2000).catch(() => false); + if (!BROWSERSTACK) { + const archiveFiles = await driver.findElement(By.id('archiveFiles')); + if (!isFileLoaded) await archiveFiles.sendKeys(gutenbergRoBaseFile); + filesLength = await driver.executeScript('return document.getElementById("archiveFiles").files.length'); + // Check that we loaded 1 file + assert.equal(1, filesLength); + } else { + // We are running tests on BrowserStack, so create files as blobs and use the setRemoteArchives function to initiate the app + await driver.executeScript('var files = arguments[0]; window.setRemoteArchives.apply(this, files);', [gutenbergRoBaseFile]); + await driver.sleep('1300'); + } }); // In JQuery mode, the app warns the user that there is active content it cannot run, so we test for this and dismiss @@ -210,9 +223,8 @@ function runTests (driver, modes) { await driver.wait(until.elementIsVisible(driver.findElement(By.id('popularity_sort')))).click(); await driver.sleep(500); // get the text of first result and check if it is the same as expected - const firstBookName = await driver.wait(async function () { - return await driver.findElement(By.xpath('//*[@id="books_table"]/tbody/tr[1]/td[1]/div[2]/div/div/span[2]')).getText(); - }) + const firstBookName = await driver.wait(until.elementLocated(By.xpath('//*[@id="books_table"]/tbody/tr[1]/td[1]/div[2]/div/div/span[2]')), 4000).getText(); + assert.equal(firstBookName, 'Poezii'); }); @@ -221,11 +233,16 @@ function runTests (driver, modes) { console.log('\x1b[33m%s\x1b[0m', ' Test skipped.'); return; } + // We switch to default Content and back to Iframe because the If we are retrying the test + // It will make sure reset the iframe + await driver.switchTo().defaultContent(); + await driver.switchTo().frame('articleContent'); + let firstBookName = ''; await driver.wait(until.elementIsVisible(driver.findElement(By.id('alpha_sort')))).click(); - await driver.sleep(1500); - const firstBookName = await driver.wait(async function () { - return await driver.findElement(By.xpath('//*[@id="books_table"]/tbody/tr[1]/td[1]/div[2]/div/div/span[2]')).getText(); - }, 3000); + await driver.sleep(4000); + + const bookList = await driver.wait(until.elementsLocated(By.className('table-title')), 1500) + firstBookName = await bookList[0].getText(); // get the text of first result and check if it is the same as expected assert.equal(firstBookName, 'Creierul, O Enigma Descifrata'); }); @@ -294,6 +311,7 @@ function runTests (driver, modes) { await btnBack.click(); await btnBack.click(); await btnBack.click(); + if (browserName === 'internet explorer') await btnBack.click(); // Title lies in iframe so we need to switch to it await driver.switchTo().frame('articleContent'); // in some browsers the title is loaded slowly so we need to wait for it @@ -349,8 +367,8 @@ function runTests (driver, modes) { // await downloadButton.click(); const downloadFileStatus = await driver.wait(async function () { // We can only check if the file exist in firefox and chrome (IE and Edge not supported) - if (!['firefox', 'chrome'].includes(browserName)) { - // will skip if any other browser and pass test + if (!['firefox', 'chrome'].includes(browserName) || BROWSERSTACK) { + // will skip if any other browser or Running in browserstack and pass test return true; } const downloadFileStatus = fs.readdirSync(paths.downloadDir).includes(downloadFileName); diff --git a/tests/legacy-ray_charles.e2e.spec.js b/tests/e2e/spec/legacy-ray_charles.e2e.spec.js similarity index 98% rename from tests/legacy-ray_charles.e2e.spec.js rename to tests/e2e/spec/legacy-ray_charles.e2e.spec.js index e258b93d..16249728 100644 --- a/tests/legacy-ray_charles.e2e.spec.js +++ b/tests/e2e/spec/legacy-ray_charles.e2e.spec.js @@ -23,7 +23,7 @@ import { By, Key, WebDriver, until } from 'selenium-webdriver'; // import firefox from 'selenium-webdriver/firefox.js'; import assert from 'assert'; -import paths from './paths.js'; +import paths from '../paths.js'; /* eslint-disable camelcase, one-var, prefer-const */ /* global describe, it */ @@ -34,13 +34,13 @@ const BROWSERSTACK = !!process.env.BROWSERSTACK_LOCAL_IDENTIFIER; // const BROWSERSTACK = true; // Select the correct port according to the environment -const port = process.env.BROWSERSTACK_LOCAL_IDENTIFIER ? '8099' : '8080'; +const port = BROWSERSTACK ? '8099' : '8080'; // Set the archives to load let rayCharlesBaseFile = paths.rayCharlesBaseFile; // For BrowserStack, we have to construct the file blops with XHR instead if (BROWSERSTACK) { - rayCharlesBaseFile = '/tests/wikipedia_en_ray_charles_2015-06.zimaa'; + rayCharlesBaseFile = '/tests/zims/legacy-ray-charles/wikipedia_en_ray_charles_2015-06.zimaa'; } let rayCharlesAllParts = '', rayCharlesFileArray = []; for (let i = 0; i < 15; i++) { diff --git a/tests/index.html b/tests/unit/index.html similarity index 91% rename from tests/index.html rename to tests/unit/index.html index 6748caee..f720c108 100644 --- a/tests/index.html +++ b/tests/unit/index.html @@ -2,7 +2,7 @@ - + Kiwix-js Unit tests