Skip to content

Commit b39dfff

Browse files
authored
feat(examples): add SDK source coverage collection for example tests (#259)
- Add test-with-sdk-coverage script to collect coverage from core SDK source - Copy SDK source to src/dur-sdk/ before tests via copy-sdk-source.js script - Configure Jest module mapper to resolve SDK imports to local source copy - Add coverage-to-csv script to export coverage data as CSV file - Update .gitignore to exclude dur-sdk folder and coverage-sdk directory - Add SDK_COVERAGE.md documentation for usage instructions
1 parent 66bffe8 commit b39dfff

File tree

6 files changed

+131
-0
lines changed

6 files changed

+131
-0
lines changed

packages/aws-durable-execution-sdk-js-examples/.gitignore

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,10 @@
33
/dist
44
/dist-cjs
55
/coverage
6+
/coverage-sdk
67
*.iml
78
.aws-sam/*
89
*.zip
910

1011
src/utils/examples-catalog.json
12+
src/dur-sdk/
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
# SDK Coverage in Examples Tests
2+
3+
This package is configured to collect code coverage for the core SDK (`aws-durable-execution-sdk-js`) when running example tests.
4+
5+
## How It Works
6+
7+
1. **Pre-test Copy**: Before tests run, `scripts/copy-sdk-source.js` copies the SDK source files into `src/dur-sdk/`
8+
2. **Module Mapping**: Jest is configured to resolve `@aws/durable-execution-sdk-js` imports to the local `src/dur-sdk/index.ts`
9+
3. **Coverage Collection**: Jest collects coverage from both example files and SDK source files
10+
11+
## Running Tests
12+
13+
**Regular tests (examples only):**
14+
15+
```bash
16+
npm test
17+
```
18+
19+
**Tests with SDK coverage:**
20+
21+
```bash
22+
npm run test-with-sdk-coverage
23+
```
24+
25+
This will:
26+
27+
- Copy SDK source to `src/dur-sdk/`
28+
- Run all example tests
29+
- Generate coverage report in `coverage-sdk/` directory
30+
31+
## Coverage Output
32+
33+
- **HTML Report**: `coverage-sdk/index.html`
34+
- **Cobertura XML**: `coverage-sdk/cobertura-coverage.xml`
35+
- **Console**: Summary printed after test run
36+
37+
## Files
38+
39+
- `scripts/copy-sdk-source.js` - Copies SDK source before tests
40+
- `jest.config.js` - Regular test configuration
41+
- `jest.config.sdk-coverage.js` - SDK coverage configuration
42+
- `src/dur-sdk/` - Temporary SDK source (gitignored)
43+
- `coverage-sdk/` - Coverage output directory (gitignored)
44+
45+
## Notes
46+
47+
- The `src/dur-sdk/` folder is automatically created and should not be committed
48+
- Coverage includes both example code and SDK code executed by the examples
49+
- The SDK source is copied fresh before each test run to ensure it's up-to-date
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
const { createDefaultPreset } = require("ts-jest");
2+
3+
const defaultPreset = createDefaultPreset();
4+
5+
/** @type {import('ts-jest').JestConfigWithTsJest} */
6+
module.exports = {
7+
...defaultPreset,
8+
testMatch: ["**/__tests__/**.test.ts", "**/src/examples/**/*.test.ts"],
9+
coverageReporters: ["cobertura", "html", "text"],
10+
coverageDirectory: "coverage-sdk",
11+
collectCoverageFrom: [
12+
"src/**/*.ts",
13+
"!src/dur-sdk/run-durable.ts",
14+
"!**/*.test.ts",
15+
"!**/*.d.ts",
16+
],
17+
moduleNameMapper: {
18+
"^@aws/durable-execution-sdk-js$": "<rootDir>/src/dur-sdk/index.ts",
19+
},
20+
};

packages/aws-durable-execution-sdk-js-examples/package.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,9 @@
3838
"generate-template": "node scripts/generate-template.js",
3939
"test": "npm run unit-test",
4040
"test:integration": "NODE_ENV=integration jest --config jest.config.integration.js --testNamePattern=cloud",
41+
"pretest-with-sdk-coverage": "node scripts/copy-sdk-source.js",
42+
"test-with-sdk-coverage": "jest --config jest.config.sdk-coverage.js --collectCoverage",
43+
"coverage-to-csv": "node scripts/coverage-to-csv.js",
4144
"unit-test": "jest --collectCoverage",
4245
"unit-test-watch": "jest --watch",
4346
"prettier": "prettier --write './src/**/*.*' && prettier --write './test/**/*.*'"
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
const fs = require("fs");
2+
const path = require("path");
3+
4+
const sdkSourcePath = path.resolve(
5+
__dirname,
6+
"../../aws-durable-execution-sdk-js/src",
7+
);
8+
const targetPath = path.resolve(__dirname, "../src/dur-sdk");
9+
10+
if (fs.existsSync(targetPath)) {
11+
fs.rmSync(targetPath, { recursive: true, force: true });
12+
}
13+
14+
fs.cpSync(sdkSourcePath, targetPath, { recursive: true });
15+
16+
console.log(`✓ Copied SDK source to ${targetPath}`);
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
const fs = require("fs");
2+
const path = require("path");
3+
const xml2js = require("xml2js");
4+
5+
const coverageFile = path.resolve(
6+
__dirname,
7+
"../coverage-sdk/cobertura-coverage.xml",
8+
);
9+
const outputFile = path.resolve(__dirname, "../coverage-sdk/coverage.csv");
10+
11+
if (!fs.existsSync(coverageFile)) {
12+
console.error(
13+
"Coverage file not found. Run 'npm run test-with-sdk-coverage' first.",
14+
);
15+
process.exit(1);
16+
}
17+
18+
const xml = fs.readFileSync(coverageFile, "utf8");
19+
20+
xml2js.parseString(xml, (err, result) => {
21+
if (err) {
22+
console.error("Error parsing XML:", err);
23+
process.exit(1);
24+
}
25+
26+
const packages = result.coverage.packages[0].package;
27+
const rows = [["File", "Line Coverage %"]];
28+
29+
packages.forEach((pkg) => {
30+
pkg.classes[0].class.forEach((cls) => {
31+
const filename = cls.$.filename;
32+
const lineRate = (parseFloat(cls.$["line-rate"]) * 100).toFixed(2);
33+
rows.push([filename, lineRate]);
34+
});
35+
});
36+
37+
const csv = rows.map((row) => row.join(",")).join("\n");
38+
fs.writeFileSync(outputFile, csv);
39+
console.log(`✓ Coverage CSV written to ${outputFile}`);
40+
console.log(` Total files: ${rows.length - 1}`);
41+
});

0 commit comments

Comments
 (0)