From ba1671553e9e51373fbc48f0a644cfe65d91a2c2 Mon Sep 17 00:00:00 2001 From: "Maarten A. Breddels" Date: Fri, 11 Oct 2024 08:40:17 +0200 Subject: [PATCH] refactor: replace galata with ipywidgets-text --- .github/workflows/ci_tests.yml | 34 +---- tests/ui/image_test.py | 35 ++--- ...-jupyter_lab-chromium-darwin-reference.png | Bin 0 -> 12149 bytes ...e-jupyter_lab-chromium-linux-reference.png | Bin 0 -> 19146 bytes ...ter_notebook-chromium-darwin-reference.png | Bin 0 -> 12010 bytes ...yter_notebook-chromium-linux-reference.png | Bin 0 -> 10055 bytes ...mage-solara-chromium-darwin-reference.png} | Bin ...image-solara-chromium-linux-reference.png} | Bin ..._image-voila-chromium-darwin-reference.png | Bin 0 -> 11851 bytes ...t_image-voila-chromium-linux-reference.png | Bin 0 -> 10260 bytes ui-tests/README.md | 41 ------ ui-tests/jupyter_server_config.py | 11 -- ui-tests/package.json | 21 --- ui-tests/playwright.config.js | 7 - ui-tests/tests/bqplot-image-gl.test.ts | 134 ------------------ .../light-image-ipynb-cell-0-linux.png | Bin 8611 -> 0 bytes ui-tests/tests/notebooks/image.ipynb | 56 -------- 17 files changed, 21 insertions(+), 318 deletions(-) create mode 100644 tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-jupyter_lab-chromium-darwin-reference.png create mode 100644 tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-jupyter_lab-chromium-linux-reference.png create mode 100644 tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-jupyter_notebook-chromium-darwin-reference.png create mode 100644 tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-jupyter_notebook-chromium-linux-reference.png rename tests/ui/snapshots/tests/ui/image_test.py/{test_widget_image-chromium-darwin-reference.png => test_widget_image-solara-chromium-darwin-reference.png} (100%) rename tests/ui/snapshots/tests/ui/image_test.py/{test_widget_image-chromium-linux-reference.png => test_widget_image-solara-chromium-linux-reference.png} (100%) create mode 100644 tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-voila-chromium-darwin-reference.png create mode 100644 tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-voila-chromium-linux-reference.png delete mode 100644 ui-tests/README.md delete mode 100644 ui-tests/jupyter_server_config.py delete mode 100644 ui-tests/package.json delete mode 100644 ui-tests/playwright.config.js delete mode 100644 ui-tests/tests/bqplot-image-gl.test.ts delete mode 100644 ui-tests/tests/bqplot-image-gl.test.ts-snapshots/light-image-ipynb-cell-0-linux.png delete mode 100644 ui-tests/tests/notebooks/image.ipynb diff --git a/.github/workflows/ci_tests.yml b/.github/workflows/ci_tests.yml index af788d4..e5f6566 100644 --- a/.github/workflows/ci_tests.yml +++ b/.github/workflows/ci_tests.yml @@ -50,12 +50,6 @@ jobs: name: bqplot-image-gl-dist-${{ github.run_number }} path: ./dist - - name: Install node - uses: actions/setup-node@v2 - with: - node-version: '18.x' - registry-url: 'https://registry.npmjs.org' - - name: Install Python uses: actions/setup-python@v2 with: @@ -66,7 +60,7 @@ jobs: echo $PWD ls -al . ls -al dist/ - pip install dist/bqplot_image_gl*.whl "jupyterlab<4" "pytest-ipywidgets[solara]" + pip install dist/bqplot_image_gl*.whl "pytest-ipywidgets[all]" - name: Install playwright run: | @@ -76,36 +70,12 @@ jobs: run: | pytest tests/ui - - name: Install Galata - run: | - yarn install - yarn playwright install chromium - working-directory: ui-tests - - - name: Launch JupyterLab - run: yarn run start:detached - working-directory: ui-tests - - - name: Wait for JupyterLab - uses: ifaxity/wait-on-action@v1 - with: - resource: http-get://localhost:8988/api - timeout: 20000 - - - name: Run UI Tests - env: - TARGET_URL: http://127.0.0.1:8988 - run: yarn run test - working-directory: ui-tests - - name: Upload UI Test artifacts if: always() uses: actions/upload-artifact@v3 with: - name: ui-test-output + name: bqplot-image-gl-ui-test-output path: | - ui-tests/playwright-report - ui-tests/test-results test-results tests: diff --git a/tests/ui/image_test.py b/tests/ui/image_test.py index 71b99e3..fbd79d0 100644 --- a/tests/ui/image_test.py +++ b/tests/ui/image_test.py @@ -1,32 +1,35 @@ import ipywidgets as widgets import playwright.sync_api from IPython.display import display -import numpy as np -from bqplot import Figure, LinearScale, Axis, ColorScale -from bqplot_image_gl import ImageGL -def test_widget_image(solara_test, page_session: playwright.sync_api.Page, assert_solara_snapshot): - scale_x = LinearScale(min=0, max=1) - scale_y = LinearScale(min=0, max=1) - scales = {"x": scale_x, "y": scale_y} - axis_x = Axis(scale=scale_x, label="x") - axis_y = Axis(scale=scale_y, label="y", orientation="vertical") +def test_widget_image(ipywidgets_runner, page_session: playwright.sync_api.Page, assert_solara_snapshot): - figure = Figure(scales=scales, axes=[axis_x, axis_y]) + def kernel_code(): + import numpy as np + from bqplot import Figure, LinearScale, Axis, ColorScale + from bqplot_image_gl import ImageGL + scale_x = LinearScale(min=0, max=1) + scale_y = LinearScale(min=0, max=1) + scales = {"x": scale_x, "y": scale_y} + axis_x = Axis(scale=scale_x, label="x") + axis_y = Axis(scale=scale_y, label="y", orientation="vertical") - scales_image = {"x": scale_x, "y": scale_y, "image": ColorScale(min=0, max=2)} + figure = Figure(scales=scales, axes=[axis_x, axis_y]) - data = np.array([[0., 1.], [2., 3.]]) - image = ImageGL(image=data, scales=scales_image) + scales_image = {"x": scale_x, "y": scale_y, "image": ColorScale(min=0, max=2)} - figure.marks = (image,) + data = np.array([[0., 1.], [2., 3.]]) + image = ImageGL(image=data, scales=scales_image) - display(figure) + figure.marks = (image,) + display(figure) + ipywidgets_runner(kernel_code) svg = page_session.locator(".bqplot") svg.wait_for() - # page_session.wait_for_timeout(1000) + # make sure the image is rendered + page_session.wait_for_timeout(100) assert_solara_snapshot(svg.screenshot()) diff --git a/tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-jupyter_lab-chromium-darwin-reference.png b/tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-jupyter_lab-chromium-darwin-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..9f2ea9dd3e3a0cc6e9691ee63201e5ddc8fa1729 GIT binary patch literal 12149 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 literal 0 HcmV?d00001 diff --git a/tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-jupyter_lab-chromium-linux-reference.png b/tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-jupyter_lab-chromium-linux-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..3616fb842d225f76a12b8cfd38c6c46b3d2d5b07 GIT binary patch literal 19146 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 z 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 OI78FJng4z6yZ-^BO?Nl| literal 0 HcmV?d00001 diff --git a/tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-jupyter_notebook-chromium-linux-reference.png b/tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-jupyter_notebook-chromium-linux-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..0d69b69ecbf56f1851742630b35825576755920f GIT binary patch literal 10055 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 J^)sJu{s+AtsjUD2 literal 0 HcmV?d00001 diff --git a/tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-voila-chromium-linux-reference.png b/tests/ui/snapshots/tests/ui/image_test.py/test_widget_image-voila-chromium-linux-reference.png new file mode 100644 index 0000000000000000000000000000000000000000..e84a424cdedb8974c5426855850b911666cf00d0 GIT binary patch literal 10260 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 bxwxx|kGAwq+N;1*3!FQxe=7Tg)t&zWhvS7$ literal 0 HcmV?d00001 diff --git a/ui-tests/README.md b/ui-tests/README.md deleted file mode 100644 index 2c40e62..0000000 --- a/ui-tests/README.md +++ /dev/null @@ -1,41 +0,0 @@ -# Visual regression tests using Galata - -This directory contains visual regression tests for bqplot-image-gl, using Galata. - -In order to run them, you need to install dependencies: - -```bash -$ conda install -c conda-forge "yarn<2" jupyterlab=3.5.3 -$ yarn install$ -$ npx playwright install chromium -``` - -Then start JupyterLab in one terminal (you need to check that it properly starts on port 8988): -```bash -$ yarn run start-jlab -``` - -Finally, run the galata tests: -```bash -TARGET_URL=http://127.0.0.1:8988 yarn run test -``` - -If bqplot-image-gl visuals change, you can re-generate reference images by running: -```bash -yarn test:update -``` - -## Notebooks directory - -The `tests/notebooks` directory contains the test notebooks. For most notebooks (*e.g.* `bars.ipynb`, `scatter.ipynb`) Galata will run them cell by cell and take a screenshot of each output, comparing with the reference images. - -When running notebooks named `*_update.ipynb`, Galata will always take the first cell output as reference which must contain the plot, later cells will only be used to update the plot, those notebooks are checking that bqplot-image-gl is properly taking updates into account on already-created plots. - -## Add a new test - -You can add a new test by simply adding a new notebook to the `tests/notebooks` directory and updating the references. If you want to test updating plots, create notebook named `*_update.ipynb`, create a plot in your first cell then update the plot in later cells. - - -## Updating reference images - -In CI, just say 'update galata' (without quotes) in a message to trigger the update of the reference images. \ No newline at end of file diff --git a/ui-tests/jupyter_server_config.py b/ui-tests/jupyter_server_config.py deleted file mode 100644 index 0fba6a7..0000000 --- a/ui-tests/jupyter_server_config.py +++ /dev/null @@ -1,11 +0,0 @@ -from tempfile import mkdtemp - -c.ServerApp.port = 8988 -c.ServerApp.token = "" -c.ServerApp.port_retries = 0 -c.ServerApp.password = "" -c.ServerApp.disable_check_xsrf = True -c.ServerApp.open_browser = False -c.ServerApp.root_dir = mkdtemp(prefix='galata-test-') - -c.LabApp.expose_app_in_browser = True diff --git a/ui-tests/package.json b/ui-tests/package.json deleted file mode 100644 index 6385809..0000000 --- a/ui-tests/package.json +++ /dev/null @@ -1,21 +0,0 @@ -{ - "name": "bqplot-image-gl-ui-tests", - "version": "1.0.0", - "description": "bqplot-image-gl UI Tests", - "private": true, - "scripts": { - "start": "jupyter lab --config ./jupyter_server_config.py", - "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" - }, - "author": "bqplot-image-gl", - "license": "Apache-2.0", - "dependencies": { - "@jupyterlab/galata": "~4.5.0", - "klaw-sync": "^6.0.0", - "rimraf": "^3.0.2" - } -} diff --git a/ui-tests/playwright.config.js b/ui-tests/playwright.config.js deleted file mode 100644 index 6cf25a6..0000000 --- a/ui-tests/playwright.config.js +++ /dev/null @@ -1,7 +0,0 @@ -const baseConfig = require('@jupyterlab/galata/lib/playwright-config'); - -module.exports = { - ...baseConfig, - timeout: 600000, - retries: 1, -}; diff --git a/ui-tests/tests/bqplot-image-gl.test.ts b/ui-tests/tests/bqplot-image-gl.test.ts deleted file mode 100644 index fb5774b..0000000 --- a/ui-tests/tests/bqplot-image-gl.test.ts +++ /dev/null @@ -1,134 +0,0 @@ -// Copyright (c) Jupyter Development Team. -// Distributed under the terms of the Modified BSD License. - -import { IJupyterLabPageFixture, test } from '@jupyterlab/galata'; -import { expect } from '@playwright/test'; -import * as path from 'path'; -const klaw = require('klaw-sync'); - - -const filterUpdateNotebooks = item => { - const basename = path.basename(item.path); - return basename.includes('_update'); -} - -const testCellOutputs = async (page: IJupyterLabPageFixture, tmpPath: string, theme: 'JupyterLab Light' | 'JupyterLab Dark') => { - const paths = klaw(path.resolve(__dirname, './notebooks'), {filter: item => !filterUpdateNotebooks(item), nodir: true}); - const notebooks = paths.map(item => path.basename(item.path)); - - const contextPrefix = theme == 'JupyterLab Light' ? 'light' : 'dark'; - page.theme.setTheme(theme); - - for (const notebook of notebooks) { - let results = []; - - await page.notebook.openByPath(`${tmpPath}/${notebook}`); - await page.notebook.activate(notebook); - - let numCellImages = 0; - - const getCaptureImageName = (contextPrefix: string, notebook: string, id: number): string => { - return `${contextPrefix}-${notebook}-cell-${id}.png`; - }; - - await page.notebook.runCellByCell({ - onAfterCellRun: async (cellIndex: number) => { - const cell = await page.notebook.getCellOutput(cellIndex); - if (cell) { - results.push(await cell.screenshot()); - numCellImages++; - } - } - }); - - await page.notebook.save(); - - for (let c = 0; c < numCellImages; ++c) { - expect(results[c]).toMatchSnapshot(getCaptureImageName(contextPrefix, notebook, c)); - } - - await page.notebook.close(true); - } -} - -const testPlotUpdates = async (page: IJupyterLabPageFixture, tmpPath: string, theme: 'JupyterLab Light' | 'JupyterLab Dark') => { - const paths = klaw(path.resolve(__dirname, './notebooks'), {filter: item => filterUpdateNotebooks(item), nodir: true}); - const notebooks = paths.map(item => path.basename(item.path)); - - const contextPrefix = theme == 'JupyterLab Light' ? 'light' : 'dark'; - page.theme.setTheme(theme); - - for (const notebook of notebooks) { - let results = []; - - await page.notebook.openByPath(`${tmpPath}/${notebook}`); - await page.notebook.activate(notebook); - - const getCaptureImageName = (contextPrefix: string, notebook: string, id: number): string => { - return `${contextPrefix}-${notebook}-cell-${id}.png`; - }; - - let cellCount = 0; - await page.notebook.runCellByCell({ - onAfterCellRun: async (cellIndex: number) => { - // Always get first cell output which must contain the plot - const cell = await page.notebook.getCellOutput(0); - if (cell) { - results.push(await cell.screenshot()); - cellCount++; - } - } - }); - - await page.notebook.save(); - - for (let i = 0; i < cellCount; i++) { - expect(results[i]).toMatchSnapshot(getCaptureImageName(contextPrefix, notebook, i)); - } - - await page.notebook.close(true); - } -}; - -test.describe('bqplot Visual Regression', () => { - test.beforeEach(async ({ page, tmpPath }) => { - page.on("console", (message) => { - console.log('CONSOLE MSG ---', message.text()); - }); - - await page.contents.uploadDirectory( - path.resolve(__dirname, './notebooks'), - tmpPath - ); - await page.filebrowser.openDirectory(tmpPath); - }); - - test('Light theme: Check bqplot-image-gl first renders', async ({ - page, - tmpPath, - }) => { - await testCellOutputs(page, tmpPath, 'JupyterLab Light'); - }); - - // For now we do not test with the dark theme - // test('Dark theme: Check bqplot-image-gl first renders', async ({ - // page, - // tmpPath, - // }) => { - // await testCellOutputs(page, tmpPath, 'JupyterLab Dark'); - // }); - - test('Light theme: Check bqplot-image-gl update plot properties', async ({ - page, - tmpPath, - }) => { - await testPlotUpdates(page, tmpPath, 'JupyterLab Light'); - }); - - // test('Dark theme: Check bqplot-image-gl update plot properties', async ({ - // page, - // tmpPath, - // }) => { - // await testPlotUpdates(page, tmpPath, 'JupyterLab Dark'); - // }); -}); diff --git a/ui-tests/tests/bqplot-image-gl.test.ts-snapshots/light-image-ipynb-cell-0-linux.png b/ui-tests/tests/bqplot-image-gl.test.ts-snapshots/light-image-ipynb-cell-0-linux.png deleted file mode 100644 index 1365285c25757f2335274756b14ee8e2e2e409a8..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8611 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