diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index fcf272f63..c017365f4 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -55,16 +55,10 @@ jobs: jlpm jlpm run eslint:check jlpm run prettier:check - - uses: microsoft/playwright-github-action@v1 - name: Test run: | jlpm run build:test - jlpm run test:ci - - uses: actions/upload-artifact@v2 - if: ${{ always() }} - with: - name: test-artifacts - path: app/artifacts + jlpm run test build: needs: [integrity] @@ -158,3 +152,40 @@ jobs: jupyter server extension list 2>&1 | grep -ie "jupyterlab_classic.*enabled" - jupyter classic --version jupyter classic --help + + end2end: + needs: [build] + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + browser: [firefox, chromium] + steps: + - name: Install Python + uses: actions/setup-python@v2 + with: + python-version: '3.9' + architecture: 'x64' + - uses: actions/download-artifact@v2 + with: + name: dist ${{ github.run_number }} + path: ./dist + - name: Install the prerequisites + run: | + python -m pip install pip wheel + - name: Install the package + run: | + cd dist + python -m pip install -vv jupyterlab_classic*.whl + - uses: microsoft/playwright-github-action@v1 + - name: Test + run: | + jlpm run build:test + jlpm run test:e2e + env: + BROWSER: ${{ matrix.browser }} + - uses: actions/upload-artifact@v2 + if: ${{ always() }} + with: + name: test-artifacts + path: app/artifacts diff --git a/.github/workflows/release.yml b/.github/workflows/release.yml index 7a292bcb9..38e8af42a 100644 --- a/.github/workflows/release.yml +++ b/.github/workflows/release.yml @@ -55,16 +55,10 @@ jobs: jlpm jlpm run eslint:check jlpm run prettier:check - - uses: microsoft/playwright-github-action@v1 - name: Test run: | jlpm run build:test - jlpm run test:ci - - uses: actions/upload-artifact@v2 - if: ${{ always() }} - with: - name: test-artifacts - path: app/artifacts + jlpm run test build: needs: [integrity] diff --git a/app/package.json b/app/package.json index d9947cabc..6cfd49c8f 100644 --- a/app/package.json +++ b/app/package.json @@ -9,8 +9,8 @@ "clean": "rimraf build", "clean:artifacts": "rimraf artifacts", "prepublishOnly": "yarn run build", - "test": "jlpm run clean:artifacts && jest", - "test:pwdebug": "jlpm run clean:artifacts && PWDEBUG=1 jlpm run test", + "test:e2e": "jlpm run clean:artifacts && jest", + "test:e2e:pwdebug": "jlpm run clean:artifacts && PWDEBUG=1 jlpm run test:e2e", "test:cov": "jest --collect-coverage", "test:debug": "node --inspect-brk node_modules/.bin/jest --runInBand", "test:debug:watch": "node --inspect-brk node_modules/.bin/jest --runInBand --watch", diff --git a/app/test/notebook.spec.ts b/app/test/notebook.spec.ts index 051fdda0f..800f8f78a 100644 --- a/app/test/notebook.spec.ts +++ b/app/test/notebook.spec.ts @@ -1,7 +1,9 @@ // Copyright (c) Jupyter Development Team. // Distributed under the terms of the Modified BSD License. -import { chromium, Browser } from 'playwright'; +import { chromium, firefox, Browser } from 'playwright'; + +import { BrowserName } from './utils'; const JUPYTERLAB_CLASSIC = 'http://localhost:8889/classic/notebooks/app/test/data/example.ipynb'; @@ -10,7 +12,8 @@ describe('Notebook', () => { let browser: Browser; beforeEach(async () => { - browser = await chromium.launch({ slowMo: 100 }); + const browserName = (process.env.BROWSER as BrowserName) || 'chromium'; + browser = await { chromium, firefox }[browserName].launch({ slowMo: 100 }); }); afterEach(() => { diff --git a/app/test/smoke.spec.ts b/app/test/smoke.spec.ts index f9fdfa0d8..9f326feab 100644 --- a/app/test/smoke.spec.ts +++ b/app/test/smoke.spec.ts @@ -1,4 +1,6 @@ -import { firefox, Browser, BrowserContext } from 'playwright'; +import { chromium, firefox, Browser, BrowserContext } from 'playwright'; + +import { BrowserName } from './utils'; describe('Smoke', () => { let browser: Browser; @@ -6,7 +8,8 @@ describe('Smoke', () => { beforeAll(async () => { jest.setTimeout(200000); - browser = await firefox.launch({ slowMo: 1000 }); + const browserName = (process.env.BROWSER as BrowserName) || 'chromium'; + browser = await { chromium, firefox }[browserName].launch({ slowMo: 100 }); context = await browser.newContext({ recordVideo: { dir: 'artifacts/videos/' } }); diff --git a/app/test/tree.spec.ts b/app/test/tree.spec.ts index cdc1866cb..0d07db24a 100644 --- a/app/test/tree.spec.ts +++ b/app/test/tree.spec.ts @@ -1,15 +1,16 @@ -import { chromium, Browser } from 'playwright'; +import { chromium, firefox, Browser } from 'playwright'; -const JUPYTERLAB_CLASSIC = 'http://localhost:8889/classic/tree'; +import { BrowserName } from './utils'; -const NEW_NOTEBOOK = - '#filebrowser > div.lm-Widget.p-Widget.jp-Toolbar.jp-scrollbar-tiny.jp-FileBrowser-toolbar > div:nth-child(1) > button'; +const JUPYTERLAB_CLASSIC = 'http://localhost:8889/classic/tree'; describe('Tree', () => { let browser: Browser; beforeEach(async () => { - browser = await chromium.launch({ slowMo: 100 }); + const browserName: BrowserName = + (process.env.BROWSER as BrowserName) || 'chromium'; + browser = await { chromium, firefox }[browserName].launch({ slowMo: 100 }); }); afterEach(() => { @@ -17,12 +18,11 @@ describe('Tree', () => { }); describe('File Browser', () => { - it('should be rendered', async () => { + it('should render a New Notebook button', async () => { const page = await browser.newPage(); await page.goto(JUPYTERLAB_CLASSIC); - await page.waitForSelector(NEW_NOTEBOOK); - const button = await page.$(NEW_NOTEBOOK); + const button = await page.$('text="New Notebook"'); expect(button).toBeDefined(); }); }); diff --git a/app/test/utils.ts b/app/test/utils.ts new file mode 100644 index 000000000..41d8bb460 --- /dev/null +++ b/app/test/utils.ts @@ -0,0 +1 @@ +export type BrowserName = 'chromium' | 'firefox'; diff --git a/package.json b/package.json index a1a1864a1..3a38ab15c 100644 --- a/package.json +++ b/package.json @@ -33,7 +33,7 @@ "release:patch": "node ./buildutils/lib/release-patch.js", "start": "jupyter classic --config ./app/test/jupyter_server_config.py --no-browser", "test": "lerna run test", - "test:ci": "(jlpm run start&) && jlpm run test", + "test:e2e": "(jlpm run start&) && jlpm run test:e2e", "update:dependency": "node ./node_modules/@jupyterlab/buildutils/lib/update-dependency.js --lerna" }, "husky": {