From 1908dafe6a663738d62ca0815a9f05bd0c1ceb29 Mon Sep 17 00:00:00 2001 From: martinRenou Date: Tue, 9 Jan 2024 14:51:24 +0100 Subject: [PATCH] Add a simple UI-test --- .github/workflows/build.yml | 17 ++++++- .gitignore | 7 +-- environment-dev.yaml | 4 +- ui-tests/build.py | 13 +++++ ui-tests/environment.yml | 9 ++++ ui-tests/jupyter-lite.json | 7 +++ ui-tests/jupyter_lite_config.json | 5 ++ ui-tests/jupyter_server_test_config.py | 12 ----- ui-tests/package.json | 18 +++++-- ui-tests/playwright.config.js | 32 ++++++++---- ui-tests/tests/jupyterlite_xeus.spec.ts | 47 +++++++++++++----- .../jupyter-xeus-launcher-linux.png | Bin 0 -> 46808 bytes ui-tests/yarn.lock | 18 +++++-- 13 files changed, 141 insertions(+), 48 deletions(-) create mode 100644 ui-tests/build.py create mode 100644 ui-tests/environment.yml create mode 100644 ui-tests/jupyter-lite.json create mode 100644 ui-tests/jupyter_lite_config.json delete mode 100644 ui-tests/jupyter_server_test_config.py create mode 100644 ui-tests/tests/jupyterlite_xeus.spec.ts-snapshots/jupyter-xeus-launcher-linux.png diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index e5cae2e..5fd1f2f 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -6,6 +6,10 @@ on: pull_request: branches: '*' +defaults: + run: + shell: bash -l {0} + jobs: build: runs-on: ubuntu-latest @@ -103,17 +107,26 @@ jobs: with: name: extension-artifacts + - name: Install Conda environment with Micromamba + uses: mamba-org/setup-micromamba@v1 + with: + environment-name: test-env + create-args: >- + pip + - name: Install the extension run: | set -eux - python -m pip install "jupyterlab>=4.0.0,<5" jupyterlite_xeus*.whl + python -m pip install "jupyterlab>=4.0.0,<5" jupyterlite jupyterlite_xeus*.whl - name: Install dependencies working-directory: ui-tests env: YARN_ENABLE_IMMUTABLE_INSTALLS: 0 PLAYWRIGHT_SKIP_BROWSER_DOWNLOAD: 1 - run: jlpm install + run: | + jlpm install + jlpm run build - name: Set up browser cache uses: actions/cache@v3 diff --git a/.gitignore b/.gitignore index df4d4f4..c080c6f 100644 --- a/.gitignore +++ b/.gitignore @@ -124,8 +124,9 @@ dmypy.json # Yarn cache .yarn/ - - # experiments experiment.sh -env.yml \ No newline at end of file +env.yml + +# Jupyterlite cache +.jupyterlite.doit.db diff --git a/environment-dev.yaml b/environment-dev.yaml index 5c819f5..da603fe 100644 --- a/environment-dev.yaml +++ b/environment-dev.yaml @@ -4,7 +4,7 @@ channels: dependencies: - black - build - - empack >=3.3 + - empack >=3.3 - hatch-jupyter-builder - hatch-nodejs-version - jupyterlab >=4.0 @@ -18,4 +18,4 @@ dependencies: - ruff - traitlets - typer - - yarn \ No newline at end of file + - yarn diff --git a/ui-tests/build.py b/ui-tests/build.py new file mode 100644 index 0000000..780e0aa --- /dev/null +++ b/ui-tests/build.py @@ -0,0 +1,13 @@ +from pathlib import Path +from subprocess import run + +import jupyterlab + +extra_labextensions_path = str(Path(jupyterlab.__file__).parent / "galata") +cmd = f"jupyter lite build --FederatedExtensionAddon.extra_labextensions_path={extra_labextensions_path}" + +run( + cmd, + check=True, + shell=True, +) diff --git a/ui-tests/environment.yml b/ui-tests/environment.yml new file mode 100644 index 0000000..dd8cf5d --- /dev/null +++ b/ui-tests/environment.yml @@ -0,0 +1,9 @@ +name: jupyterlite-xeus-tests +channels: + - https://repo.mamba.pm/emscripten-forge + - https://repo.mamba.pm/conda-forge +dependencies: + - xeus-python + - xeus-lua + - pandas + - bqplot diff --git a/ui-tests/jupyter-lite.json b/ui-tests/jupyter-lite.json new file mode 100644 index 0000000..6d73c21 --- /dev/null +++ b/ui-tests/jupyter-lite.json @@ -0,0 +1,7 @@ +{ + "jupyter-lite-schema-version": 0, + "jupyter-config-data": { + "appName": "JupyterLite UI Tests", + "exposeAppInBrowser": true + } +} diff --git a/ui-tests/jupyter_lite_config.json b/ui-tests/jupyter_lite_config.json new file mode 100644 index 0000000..11bf946 --- /dev/null +++ b/ui-tests/jupyter_lite_config.json @@ -0,0 +1,5 @@ +{ + "LiteBuildConfig": { + "output_dir": "dist" + } +} diff --git a/ui-tests/jupyter_server_test_config.py b/ui-tests/jupyter_server_test_config.py deleted file mode 100644 index f2a9478..0000000 --- a/ui-tests/jupyter_server_test_config.py +++ /dev/null @@ -1,12 +0,0 @@ -"""Server configuration for integration tests. - -!! Never use this configuration in production because it -opens the server to the world and provide access to JupyterLab -JavaScript objects through the global window variable. -""" -from jupyterlab.galata import configure_jupyter_server - -configure_jupyter_server(c) - -# Uncomment to set server log level to debug level -# c.ServerApp.log_level = "DEBUG" diff --git a/ui-tests/package.json b/ui-tests/package.json index 0b09167..dc00b9a 100644 --- a/ui-tests/package.json +++ b/ui-tests/package.json @@ -4,12 +4,20 @@ "description": "JupyterLab @jupyterlite/xeus Integration Tests", "private": true, "scripts": { - "start": "jupyter lab --config jupyter_server_test_config.py", - "test": "jlpm playwright test", - "test:update": "jlpm playwright test --update-snapshots" + "build": "yarn run clean && python build.py", + "clean": "rimraf dist", + "start": "cd dist && python -m http.server -b 127.0.0.1 8000", + "start:detached": "yarn run start&", + "test": "playwright test", + "test:debug": "PWDEBUG=1 playwright test", + "test:report": "http-server ./playwright-report -a localhost -o", + "test:update": "playwright test --update-snapshots" }, "devDependencies": { - "@jupyterlab/galata": "^5.0.5", - "@playwright/test": "^1.37.0" + "@playwright/test": "^1.37.0", + "rimraf": "^5.0.5" + }, + "dependencies": { + "@jupyterlab/galata": "~5.0.5" } } diff --git a/ui-tests/playwright.config.js b/ui-tests/playwright.config.js index 9ece6fa..e6f28f9 100644 --- a/ui-tests/playwright.config.js +++ b/ui-tests/playwright.config.js @@ -1,14 +1,28 @@ -/** - * Configuration for Playwright using default from @jupyterlab/galata - */ const baseConfig = require('@jupyterlab/galata/lib/playwright-config'); module.exports = { ...baseConfig, - webServer: { - command: 'jlpm start', - url: 'http://localhost:8888/lab', - timeout: 120 * 1000, - reuseExistingServer: !process.env.CI - } + reporter: [[process.env.CI ? 'dot' : 'list'], ['html']], + use: { + acceptDownloads: true, + appPath: '', + autoGoto: false, + baseURL: 'http://localhost:8000', + trace: 'on-first-retry', + video: 'retain-on-failure' + }, + retries: 1, + expect: { + toMatchSnapshot: { + maxDiffPixelRatio: 0.05 + } + }, + webServer: [ + { + command: 'yarn start', + port: 8000, + timeout: 120 * 1000, + reuseExistingServer: true + } + ] }; diff --git a/ui-tests/tests/jupyterlite_xeus.spec.ts b/ui-tests/tests/jupyterlite_xeus.spec.ts index bef0b61..e4b70eb 100644 --- a/ui-tests/tests/jupyterlite_xeus.spec.ts +++ b/ui-tests/tests/jupyterlite_xeus.spec.ts @@ -1,19 +1,42 @@ -import { expect, test } from '@jupyterlab/galata'; +import { test } from '@jupyterlab/galata'; -/** - * Don't load JupyterLab webpage before running the tests. - * This is required to ensure we capture all log messages. - */ -test.use({ autoGoto: false }); +import { expect } from '@playwright/test'; -test('should emit an activation console message', async ({ page }) => { - const logs: string[] = []; +test.describe('General Tests', () => { + test.beforeEach(({ page }) => { + page.setDefaultTimeout(600000); - page.on('console', message => { - logs.push(message.text()); + page.on('console', message => { + console.log('CONSOLE MSG ---', message.text()); + }); }); - await page.goto(); + test('Launcher should contain xeus-python and xeus-lua kernels', async ({ + page + }) => { + await page.goto('lab/index.html'); - expect(1).toEqual(1); + expect(await page.screenshot()).toMatchSnapshot( + 'jupyter-xeus-launcher.png' + ); + }); + + test('xeus-python should execute some code', async ({ page }) => { + await page.goto('lab/index.html'); + + // Launch a Python notebook + const xpython = page.locator('[title="Python 3.12 (XPython)"]').first(); + await xpython.click(); + + // Wait for kernel to be idle + await page.locator('#jp-main-statusbar').getByText('Idle').waitFor(); + + await page.notebook.addCell('code', 'import bqplot'); + await page.notebook.runCellByCell(); + + // Wait for kernel to be idle + await page.locator('#jp-main-statusbar').getByText('Idle').waitFor(); + + expect(await page.screenshot()).toMatchSnapshot('jupyter-xeus-execute.png'); + }); }); diff --git a/ui-tests/tests/jupyterlite_xeus.spec.ts-snapshots/jupyter-xeus-launcher-linux.png b/ui-tests/tests/jupyterlite_xeus.spec.ts-snapshots/jupyter-xeus-launcher-linux.png new file mode 100644 index 0000000000000000000000000000000000000000..e18b914f1d7c514055fd182444d9c0242314b306 GIT binary patch literal 46808 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 literal 0 HcmV?d00001 diff --git a/ui-tests/yarn.lock b/ui-tests/yarn.lock index 2ecba77..ea63c1c 100644 --- a/ui-tests/yarn.lock +++ b/ui-tests/yarn.lock @@ -665,7 +665,7 @@ __metadata: languageName: node linkType: hard -"@jupyterlab/galata@npm:^5.0.5": +"@jupyterlab/galata@npm:~5.0.5": version: 5.0.10 resolution: "@jupyterlab/galata@npm:5.0.10" dependencies: @@ -957,8 +957,9 @@ __metadata: version: 0.0.0-use.local resolution: "@jupyterlite/xeus-ui-tests@workspace:." dependencies: - "@jupyterlab/galata": ^5.0.5 + "@jupyterlab/galata": ~5.0.5 "@playwright/test": ^1.37.0 + rimraf: ^5.0.5 languageName: unknown linkType: soft @@ -2425,7 +2426,7 @@ __metadata: languageName: node linkType: hard -"glob@npm:^10.2.2, glob@npm:^10.3.10": +"glob@npm:^10.2.2, glob@npm:^10.3.10, glob@npm:^10.3.7": version: 10.3.10 resolution: "glob@npm:10.3.10" dependencies: @@ -3199,6 +3200,17 @@ __metadata: languageName: node linkType: hard +"rimraf@npm:^5.0.5": + version: 5.0.5 + resolution: "rimraf@npm:5.0.5" + dependencies: + glob: ^10.3.7 + bin: + rimraf: dist/esm/bin.mjs + checksum: d66eef829b2e23b16445f34e73d75c7b7cf4cbc8834b04720def1c8f298eb0753c3d76df77325fad79d0a2c60470525d95f89c2475283ad985fd7441c32732d1 + languageName: node + linkType: hard + "robust-predicates@npm:^3.0.0": version: 3.0.2 resolution: "robust-predicates@npm:3.0.2"