diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml index 7d245cd025..e7ecbf217b 100644 --- a/.github/workflows/build.yml +++ b/.github/workflows/build.yml @@ -353,17 +353,35 @@ jobs: if: ${{ matrix.spec.test && matrix.spec.os == 'ubuntu-latest' }} run: xvfb-run --auto-servernum --server-args="-screen 0 1280x960x24" -- yarn test working-directory: apps/electron + env: + COVERAGE: true - name: Run desktop tests if: ${{ matrix.spec.test && matrix.spec.os != 'ubuntu-latest' }} run: yarn test working-directory: apps/electron + env: + COVERAGE: true + + - name: Collect code coverage report + if: ${{ matrix.spec.test }} + run: yarn exec nyc report -t .nyc_output --report-dir .coverage --reporter=lcov + + - name: Upload e2e test coverage results + if: ${{ matrix.spec.test }} + uses: codecov/codecov-action@v3 + with: + token: ${{ secrets.CODECOV_TOKEN }} + files: ./.coverage/lcov.info + flags: e2etest-${{ matrix.spec.os }}-${{ matrix.spec.arch }} + name: affine + fail_ci_if_error: true - name: Upload test results if: ${{ failure() }} uses: actions/upload-artifact@v3 with: - name: test-results-e2e-${{ matrix.shard }} + name: test-results-e2e-${{ matrix.spec.os }}-${{ matrix.spec.arch }} path: ./test-results if-no-files-found: ignore diff --git a/apps/electron/tests/fixture.ts b/apps/electron/tests/fixture.ts index ed600e6e2d..6de57cf43c 100644 --- a/apps/electron/tests/fixture.ts +++ b/apps/electron/tests/fixture.ts @@ -3,9 +3,13 @@ /* eslint-disable no-empty-pattern */ import crypto from 'node:crypto'; -import { resolve } from 'node:path'; +import { join, resolve } from 'node:path'; -import { test as base } from '@affine-test/kit/playwright'; +import { + enableCoverage, + istanbulTempDir, + test as base, +} from '@affine-test/kit/playwright'; import fs from 'fs-extra'; import type { ElectronApplication, Page } from 'playwright'; import { _electron as electron } from 'playwright'; @@ -44,7 +48,29 @@ export const test = base.extend<{ }); // wat for blocksuite to be loaded await page.waitForSelector('v-line'); + if (enableCoverage) { + await fs.promises.mkdir(istanbulTempDir, { recursive: true }); + await page.exposeFunction( + 'collectIstanbulCoverage', + (coverageJSON?: string) => { + if (coverageJSON) + fs.writeFileSync( + join( + istanbulTempDir, + `playwright_coverage_${generateUUID()}.json` + ), + coverageJSON + ); + } + ); + } await use(page); + if (enableCoverage) { + await page.evaluate(() => + // @ts-expect-error + window.collectIstanbulCoverage(JSON.stringify(window.__coverage__)) + ); + } await page.close(); if (logFilePath) { const logs = await fs.readFile(logFilePath, 'utf-8'); diff --git a/apps/electron/tests/setup.ts b/apps/electron/tests/setup.ts index c069a995c8..55ee73db6d 100644 --- a/apps/electron/tests/setup.ts +++ b/apps/electron/tests/setup.ts @@ -1,7 +1,8 @@ import { execSync } from 'node:child_process'; +import { join } from 'node:path'; export default async function () { execSync('yarn ts-node-esm scripts/', { - cwd: path.join(__dirname, '..'), + cwd: join(__dirname, '..'), }); } diff --git a/tests/kit/playwright.ts b/tests/kit/playwright.ts index 4dc840ca15..39438d79c4 100644 --- a/tests/kit/playwright.ts +++ b/tests/kit/playwright.ts @@ -13,15 +13,15 @@ ok(require(resolve(rootDir, 'package.json')).name.toLowerCase() === 'affine'); export const testResultDir = resolve(rootDir, 'test-results'); -const istanbulTempDir = process.env.ISTANBUL_TEMP_DIR +export const istanbulTempDir = process.env.ISTANBUL_TEMP_DIR ? path.resolve(process.env.ISTANBUL_TEMP_DIR) - : path.join(process.cwd(), '.nyc_output'); + : path.join(rootDir, '.nyc_output'); function generateUUID() { return crypto.randomUUID(); } -const enableCoverage = !!process.env.CI || !!process.env.COVERAGE; +export const enableCoverage = !!process.env.CI || !!process.env.COVERAGE; export const test = baseTest.extend({ context: async ({ context }, use) => { diff --git a/tests/parallels/all-page.spec.ts b/tests/parallels/all-page.spec.ts index 6b48bd62d5..42ad63af51 100644 --- a/tests/parallels/all-page.spec.ts +++ b/tests/parallels/all-page.spec.ts @@ -1,4 +1,4 @@ -import { test } from '@playwright/test'; +import { test } from '@affine-test/kit/playwright'; import { openHomePage } from '../libs/load-page'; import { waitMarkdownImported } from '../libs/page-logic';