Skip to content

Commit 350d990

Browse files
committed
Add code coverage
1 parent 5a9320f commit 350d990

File tree

9 files changed

+668
-25
lines changed

9 files changed

+668
-25
lines changed

.github/workflows/e2e.yml

Lines changed: 23 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@ on:
55
paths:
66
- 'packages/mcp-server/**'
77
- 'packages/mcp-cloudflare/**'
8-
- 'packages/e2e/**'
8+
- 'packages/mcp-cloudflare-e2e/**'
99
push:
1010
branches: [main]
1111
paths:
1212
- 'packages/mcp-server/**'
1313
- 'packages/mcp-cloudflare/**'
14-
- 'packages/e2e/**'
14+
- 'packages/mcp-cloudflare-e2e/**'
1515

1616
permissions:
1717
contents: read
@@ -54,12 +54,29 @@ jobs:
5454
- name: Build packages
5555
run: pnpm build
5656

57-
- name: Run E2E tests
58-
run: pnpm test:e2e
57+
- name: Run E2E tests with coverage
58+
run: pnpm --filter=@sentry/mcp-cloudflare-e2e test:ci
59+
60+
- name: Upload coverage to Codecov
61+
uses: codecov/codecov-action@v4
62+
env:
63+
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
64+
with:
65+
directory: packages/mcp-cloudflare-e2e/coverage/
66+
flags: e2e
67+
name: codecov-e2e
68+
fail_ci_if_error: false
5969

6070
- uses: actions/upload-artifact@v4
6171
if: always()
6272
with:
6373
name: playwright-report
64-
path: packages/e2e/playwright-report/
65-
retention-days: 30
74+
path: packages/mcp-cloudflare-e2e/playwright-report/
75+
retention-days: 30
76+
77+
- uses: actions/upload-artifact@v4
78+
if: always()
79+
with:
80+
name: e2e-test-results
81+
path: packages/mcp-cloudflare-e2e/test-results.xml
82+
retention-days: 30

biome.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,9 @@
2727
},
2828
"security": {
2929
"noDangerouslySetInnerHtml": "off"
30+
},
31+
"a11y": {
32+
"useSemanticElements": "off"
3033
}
3134
}
3235
},

packages/mcp-cloudflare-e2e/package.json

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,8 @@
55
"description": "End-to-end tests for Sentry MCP",
66
"scripts": {
77
"test": "playwright test",
8+
"test:coverage": "mkdir -p coverage && playwright test && nyc report --reporter=lcov --reporter=json --reporter=text",
9+
"test:ci": "mkdir -p coverage && playwright test --reporter=junit",
810
"test:headed": "playwright test --headed",
911
"test:ui": "playwright test --ui",
1012
"test:debug": "playwright test --debug",
@@ -13,6 +15,8 @@
1315
},
1416
"devDependencies": {
1517
"@playwright/test": "^1.43.0",
16-
"typescript": "^5.4.5"
18+
"typescript": "^5.4.5",
19+
"nyc": "^17.1.0",
20+
"@types/node": "^22.10.6"
1721
}
1822
}

packages/mcp-cloudflare-e2e/playwright.config.ts

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,9 @@ export default defineConfig({
1414
/* Opt out of parallel tests on CI. */
1515
workers: process.env.CI ? 1 : undefined,
1616
/* Reporter to use. See https://playwright.dev/docs/test-reporters */
17-
reporter: "html",
17+
reporter: process.env.CI
18+
? [["junit", { outputFile: "test-results.xml" }], ["html"]]
19+
: "html",
1820
/* Shared settings for all the projects below. See https://playwright.dev/docs/api/class-testoptions. */
1921
use: {
2022
/* Base URL to use in actions like `await page.goto('/')`. */
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
import { test as setup } from "@playwright/test";
2+
3+
setup("collect coverage", async ({ page }) => {
4+
// Enable coverage collection
5+
await page.coverage.startJSCoverage({
6+
resetOnNavigation: false,
7+
});
8+
9+
// Enable CSS coverage as well
10+
await page.coverage.startCSSCoverage({
11+
resetOnNavigation: false,
12+
});
13+
});

packages/mcp-cloudflare-e2e/tests/simple.spec.ts

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,42 @@
11
import { test, expect } from "@playwright/test";
2+
import fs from "node:fs";
23

34
test.describe("Simple Application Tests", () => {
5+
const jsCoverage: any[] = [];
6+
const cssCoverage: any[] = [];
7+
8+
test.beforeEach(async ({ page }) => {
9+
// Start coverage collection for each test
10+
await page.coverage.startJSCoverage();
11+
await page.coverage.startCSSCoverage();
12+
});
13+
14+
test.afterEach(async ({ page }) => {
15+
// Collect coverage after each test
16+
const jsResults = await page.coverage.stopJSCoverage();
17+
const cssResults = await page.coverage.stopCSSCoverage();
18+
19+
jsCoverage.push(...jsResults);
20+
cssCoverage.push(...cssResults);
21+
});
22+
23+
test.afterAll(async () => {
24+
// Write coverage data to files
25+
if (jsCoverage.length > 0) {
26+
fs.mkdirSync("coverage", { recursive: true });
27+
fs.writeFileSync(
28+
"coverage/js-coverage.json",
29+
JSON.stringify(jsCoverage, null, 2),
30+
);
31+
}
32+
if (cssCoverage.length > 0) {
33+
fs.mkdirSync("coverage", { recursive: true });
34+
fs.writeFileSync(
35+
"coverage/css-coverage.json",
36+
JSON.stringify(cssCoverage, null, 2),
37+
);
38+
}
39+
});
440
test("should load without errors", async ({ page }) => {
541
await page.goto("/");
642

packages/mcp-cloudflare/src/client/components/ui/sliding-panel.tsx

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -47,25 +47,29 @@ export function SlidingPanel({
4747
/>
4848

4949
{/* Panel */}
50-
<dialog
51-
open={isOpen}
50+
<div
5251
className={`fixed inset-y-0 right-0 w-full max-w-2xl bg-slate-950 border-l border-slate-800 z-50 shadow-2xl flex flex-col transition-transform duration-500 ease-in-out ${
5352
isOpen ? "translate-x-0" : "translate-x-full"
5453
} ${className}`}
54+
role="dialog"
55+
aria-modal="true"
56+
aria-hidden={!isOpen}
5557
>
5658
{children}
57-
</dialog>
59+
</div>
5860
</div>
5961

6062
{/* Desktop: Fixed right half */}
61-
<dialog
62-
open={isOpen}
63+
<div
6364
className={`${
6465
isOpen ? "hidden md:flex" : "hidden"
6566
} fixed top-0 right-0 h-screen w-1/2 bg-slate-950 flex-col border-l border-slate-800 transition-opacity duration-300 ${className}`}
67+
role="dialog"
68+
aria-modal="true"
69+
aria-hidden={!isOpen}
6670
>
6771
{children}
68-
</dialog>
72+
</div>
6973
</>
7074
);
7175
}

packages/mcp-cloudflare/vite.config.ts

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ import { cloudflare } from "@cloudflare/vite-plugin";
55
import tailwindcss from "@tailwindcss/vite";
66
import path from "node:path";
77

8-
export default defineConfig({
8+
export default defineConfig(({ mode }) => ({
99
plugins: [
1010
react(),
1111
cloudflare(),
@@ -27,4 +27,11 @@ export default defineConfig({
2727
port: 5173,
2828
strictPort: true, // Fail if port is in use
2929
},
30-
});
30+
// Enable instrumentation for coverage in e2e test mode
31+
define:
32+
mode === "e2e-test"
33+
? {
34+
__COVERAGE__: true,
35+
}
36+
: {},
37+
}));

0 commit comments

Comments
 (0)