Skip to content
This repository was archived by the owner on Jan 12, 2024. It is now read-only.

Commit 49250ad

Browse files
authored
chore: fix CI workflows (#527)
* chore: tmp testing to see if changes in #517 break CI workflows, or if they're already broken * chore: attempt to fix ci runs see https://playwright.dev/docs/cli\#install-system-dependencies * fix: github workflow syntax * chore: ensure concurrency on branch name * chore: update actions * fix: don't fail-fast for matrix failures * chore: attempt to remove GabrielBB/xvfb-action some steps are showing the following failure on github: Node.js 12 actions are deprecated. For more information see: https://github.blog/changelog/2022-09-22-github-actions-all-actions-will-begin-running-on-node16-instead-of-node12/. Please update the following actions to use Node.js 16: GabrielBB/xvfb-action see https://github.com/SgtPooki/js-ipfs-examples/actions/runs/3245100955 * chore: remove gabriel/xvfb-action for good * chore: add xvfb-maybe to run-in-electron * chore: move xvfb-maybe to devDeps * fix: don't overwrite promises that are being awaited * chore(tmp): disable all but browser-service-worker tests * fix(browser-service-worker): move initial page.goto inside test * fix(browser-service-worker): increase test timeout * fix(test-util-ipfs-example.servers): stop instead of close * fix(test-util-ipfs-example.servers): allow server stop from tests remove waitForSelectors and ensure service worker response is done before checking for text debugging: query /view directly this removes the need for playwright navigating iframes and still utilizes the serviceWorker in the test * chore: cleanup browser-service-worker test * Revert "chore(tmp): disable all but browser-service-worker tests" This reverts commit 76a94cc. * chore: remove test-pr-workflows from push target
1 parent f17ca82 commit 49250ad

File tree

5 files changed

+94
-42
lines changed

5 files changed

+94
-42
lines changed

.github/workflows/ci.yml

+24-14
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,22 @@
11
name: CI
22

33
on:
4+
workflow_dispatch:
45
push:
56
branches: [master]
67
pull_request:
78
branches: [master]
89

10+
concurrency:
11+
group: ${{ github.head_ref || github.ref_name }}
12+
cancel-in-progress: true
13+
914
jobs:
1015
examples:
1116
runs-on: ubuntu-latest
1217
name: Test ${{ matrix.project }}
1318
strategy:
19+
fail-fast: false
1420
matrix:
1521
project:
1622
- browser-add-readable-stream
@@ -49,28 +55,32 @@ jobs:
4955
run:
5056
working-directory: examples/${{ matrix.project }}
5157
steps:
52-
- uses: actions/checkout@v2
53-
- uses: actions/setup-node@v2
58+
- uses: actions/checkout@v3
59+
- uses: actions/setup-node@v3
5460
with:
5561
node-version: lts/*
56-
- run: npm install
57-
- uses: GabrielBB/xvfb-action@v1
58-
name: Run tests
59-
with:
60-
run: npm test
61-
working-directory: examples/${{ matrix.project }}
62+
- name: Install dependencies
63+
run: npm install
64+
- name: Install Playwright
65+
run: npx -y playwright install --with-deps
66+
- name: Run tests
67+
run: npm run test
68+
env:
69+
CI: true
6270

6371
monorepo:
6472
runs-on: ubuntu-latest
6573
name: Test monorepo
6674
steps:
67-
- uses: actions/checkout@v2
68-
- uses: actions/setup-node@v2
75+
- uses: actions/checkout@v3
76+
- uses: actions/setup-node@v3
6977
with:
7078
node-version: lts/*
7179
- name: Install dependencies
7280
run: npm install
73-
- uses: GabrielBB/xvfb-action@v1
74-
name: Run test:examples
75-
with:
76-
run: npm run test:examples
81+
- name: Install Playwright
82+
run: npx -y playwright install --with-deps
83+
- name: Run test:examples
84+
run: npm run test:examples
85+
env:
86+
CI: true

No-real-changes.tmp

Whitespace-only changes.
+41-13
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
// @ts-check
12
import { test, expect } from '@playwright/test';
23
import { playwright } from 'test-util-ipfs-example';
34

@@ -10,30 +11,57 @@ play.describe('browser service worker:', () => {
1011
// DOM
1112
const linkDOM = "a"
1213
const textDOM = "body"
13-
const debugDOM = "#debug"
1414

1515
play.beforeEach(async ({servers, page}) => {
1616
await page.goto(`http://localhost:${servers[0].port}/`);
1717
})
1818

19-
play('should properly load the content of an IPFS hash', async ({ page }) => {
20-
await page.waitForSelector(textDOM)
21-
await page.waitForSelector(linkDOM)
19+
play('should properly load the content of an IPFS hash', async ({ servers, page, context }) => {
20+
page.on('console', msg => console.log('PAGE LOG:', msg.text()));
21+
page.on("pageerror", (err) => {
22+
console.trace(`pageerror: ${err.message}`)
23+
})
2224

2325
expect(await page.textContent(textDOM)).toContain("Load content by adding IPFS path to the URL")
2426
expect(await page.textContent(linkDOM)).toContain("/ipfs/bafy")
2527

26-
await page.waitForSelector(`${debugDOM}:has-text("SW is ready")`, {
27-
state: 'attached'
28-
})
28+
/**
29+
* Request /view path directly, as this is still handled by the service worker but doesn't break tests in github CI.
30+
* @see https://github.com/ipfs-examples/js-ipfs-examples/blob/master/examples/browser-service-worker/src/service.js#L48-L52
31+
* @see https://github.com/ipfs-examples/js-ipfs-examples/pull/527
32+
*/
33+
const ipfsRequestUrl = `http://localhost:${servers[0].port}/view/ipfs/Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD`
2934

30-
const currentURL = await page.url();
31-
await page.goto(`${currentURL}ipfs/Qmf412jQZiuVUtdgnB36FXFX7xg5V6KEbSJ4dpQuhkLyfD`);
32-
await page.waitForSelector(textDOM)
35+
/**
36+
* Wait for the service worker to be ready
37+
* @see https://playwright.dev/docs/service-workers-experimental#accessing-service-workers-and-waiting-for-activation
38+
*/
39+
await page.evaluate(async () => {
40+
const registration = await window.navigator.serviceWorker.getRegistration();
41+
if (registration?.active?.state === 'activated') {
42+
console.log('Service worker is already activated')
43+
return;
44+
}
45+
await /** @type {Promise<void>} */(new Promise(res => {
46+
window.navigator.serviceWorker.addEventListener('controllerchange', () => {
47+
console.log('Service worker is activated')
48+
res()
49+
})
50+
}));
51+
});
52+
53+
const serviceWorkerResponsePromise = new Promise((resolve) => {
54+
context.on('response', async (response) => {
55+
if (response.url() === ipfsRequestUrl && response.fromServiceWorker()) {
56+
resolve(response);
57+
}
58+
})
59+
})
3360

34-
const elementFrame = await page.waitForSelector("iframe")
35-
const frame = await elementFrame.contentFrame()
61+
await page.goto(ipfsRequestUrl, {waitUntil: 'commit'});
62+
const serviceWorkerResponse = await serviceWorkerResponsePromise
3663

37-
expect(await frame.textContent('pre')).toContain("hello world")
64+
expect(await serviceWorkerResponse.status()).toBe(200)
65+
expect(await serviceWorkerResponse.text()).toContain("hello world")
3866
});
3967
});

examples/run-in-electron/package.json

+3-2
Original file line numberDiff line numberDiff line change
@@ -15,15 +15,16 @@
1515
"clean": "echo 'Nothing to clean...'",
1616
"start": "electron .",
1717
"serve": "npm run start",
18-
"test": "node test.mjs"
18+
"test": "xvfb-maybe node test.mjs"
1919
},
2020
"dependencies": {
2121
"ipfs-core": "^0.16.0"
2222
},
2323
"devDependencies": {
2424
"electron": "^20.1.1",
2525
"electron-rebuild": "^3.1.1",
26-
"test-util-ipfs-example": "^1.0.2"
26+
"test-util-ipfs-example": "^1.0.2",
27+
"xvfb-maybe": "^0.2.1"
2728
},
2829
"greenkeeper": {
2930
"ignore": [

lib/test-util-ipfs-example/playwright/servers.js

+26-13
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,19 @@ import sirv from 'sirv'
22
import polka from 'polka'
33
import stoppable from 'stoppable'
44

5-
const servers = (serverConfiguration = []) => {
5+
/**
6+
* @template T
7+
* @template W
8+
* @template PT
9+
* @template PW
10+
* @return {import('@playwright/test').Fixtures<T, W, PT, PW>}
11+
*/
12+
const servers = (serverConfiguration = [], explicitStop = false) => {
613
return {
714
// We pass a tuple to specify fixtures options.
815
// In this case, we mark this fixture as worker-scoped.
916
servers: [ async ({}, use, workerInfo) => {
10-
let promiseServers = [];
17+
const promiseServers = [];
1118
const servers = [];
1219
const configurations = [...serverConfiguration]
1320

@@ -32,35 +39,41 @@ const servers = (serverConfiguration = []) => {
3239

3340
const app = polka();
3441

35-
promiseServers.push(new Promise((resolve, reject) => {
42+
promiseServers.push(/** @type {Promise<void>} */(new Promise((resolve, reject) => {
3643
app
3744
.use(staticFiles)
3845
.listen(port, err => {
3946
if (err) throw err;
4047

48+
const server = stoppable(app.server)
4149
servers.push({
42-
server: stoppable(app.server),
43-
port: port
50+
server,
51+
port: port,
52+
stop: async () => {
53+
console.log(`Stopping server on port ${port}...`)
54+
await new Promise(r => server.stop(r))
55+
console.log(`Server on port ${port} stopped`)
56+
}
4457
})
4558
console.log(`> Ready on localhost:${port}!`);
4659

4760
resolve();
4861
});
49-
}))
62+
})))
5063
}
5164

5265
await Promise.all(promiseServers)
5366

5467
// Use the server in the tests.
55-
await use(servers);
68+
await use(servers)
5669

70+
if (!explicitStop) {
71+
// Cleanup.
72+
console.log('Stopping servers...');
5773

58-
// Cleanup.
59-
console.log('Stopping servers...');
60-
promiseServers = servers.map(m => new Promise(f => m.server.close(f)));
61-
62-
await Promise.all(promiseServers)
63-
console.log('Servers stopped');
74+
await Promise.all(servers.map(s => s.stop()))
75+
console.log('Servers stopped');
76+
}
6477
}, { scope: 'worker', auto: true } ],
6578
}
6679
}

0 commit comments

Comments
 (0)