.agent/skills/s2-unit-test/SKILL.md
Guidelines for writing and maintaining unit tests in the S2 project. Use when modifying source code to ensure proper test coverage.
npx skillsauth add antvis/s2 s2-unit-testInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Use this skill when you:
packages/*/src/By default, all code changes require corresponding unit tests.
Search for __tests__ directories to find where tests for the modified file already exist:
packages/s2-core/__tests__/unit/ # Unit tests organized by module
packages/s2-core/__tests__/bugs/ # Bug regression tests with issue numbers
packages/s2-core/__tests__/spreadsheet/ # Integration-level spreadsheet tests
packages/s2-react/__tests__/ # React component tests
packages/s2-vue/__tests__/ # Vue component tests
| Scenario | Location | File Naming |
|----------|----------|-------------|
| Modifying existing function | Add to existing test file for that function | N/A |
| Bug fix with issue number | packages/s2-core/__tests__/bugs/ | issue-{number}-spec.ts |
| New utility function | packages/s2-core/__tests__/unit/utils/ | {function-name}-spec.ts |
| New cell logic | packages/s2-core/__tests__/unit/cell/ | {cell-type}-spec.ts |
| New interaction | packages/s2-core/__tests__/unit/interaction/ | {interaction-name}-spec.ts |
Prefer adding tests to existing files over creating new ones. Reuse existing helper functions and test utilities.
src directory - Tests must exercise actual source code:// Good: Import functions/classes from src
import { getCellWidth, getDisplayText } from '@/utils/text';
import { PivotSheet } from '@/sheet-type';
// Good: Use path aliases
import { createPivotSheet } from 'tests/util/helpers';
// Good: Create real S2 instance and test behavior
const s2 = createPivotSheet(options);
await s2.render();
expect(s2.facet.getColCells()[0].getMeta().width).toBe(expectedWidth);
// Good: Bug reproduction that exercises src code
describe('issue #3212', () => {
test('should keep column width after hiding value', async () => {
const s2 = createPivotSheet({ style: { layoutWidthType: 'compact' } });
await s2.render();
const originalWidth = s2.facet.getColCells()[0].getMeta().width;
s2.setOptions({ style: { colCell: { hideValue: true } } });
await s2.render();
expect(s2.facet.getColCells()[0].getMeta().width).toBe(originalWidth);
});
});
// BAD: Reimplementing the logic defeats the purpose
function myLocalCalculation(a, b) {
return a + b; // This is useless! If src is broken, test still passes
}
expect(myLocalCalculation(1, 2)).toBe(3);
// BAD: Only importing types doesn't test any actual code
import type { S2Options, SpreadSheet } from '@/common';
// No actual code is being tested!
// BAD: Testing your own mock, not the actual source
const mockFn = jest.fn().mockReturnValue(42);
expect(mockFn()).toBe(42); // This tests nothing useful
/**
* @description spec for issue #XXXX (if applicable)
* https://github.com/antvis/S2/issues/XXXX
*/
import { SomeFunction, SomeClass } from '@/path/to/src';
import { createPivotSheet } from 'tests/util/helpers';
describe('FeatureName', () => {
test('should do expected behavior', () => {
// Arrange
const input = { /* ... */ };
// Act
const result = SomeFunction(input);
// Assert
expect(result).toEqual(expectedOutput);
});
});
# Run all tests for a package
pnpm --filter @antv/s2 test
# Run specific test file
pnpm --filter @antv/s2 test -- --testPathPattern="issue-3212"
# Run with coverage
pnpm --filter @antv/s2 test:coverage
The primary goal of unit tests is to:
Tests that don't import and exercise actual src code provide no coverage benefit.
development
After modifying S2 project code, you must run lint to ensure there are no errors, avoiding issues when pushing to git.
development
Maintainer-only workflow for handling GitHub Secret Scanning alerts on OpenClaw. Use when Codex needs to triage, redact, clean up, and resolve secret leakage found in issue comments, issue bodies, PR comments, or other GitHub content.
development
Maintainer workflow for OpenClaw releases, prereleases, changelog release notes, and publish validation. Use when Codex needs to prepare or verify stable or beta release steps, align version naming, assemble release notes, check release auth requirements, or validate publish-time commands and artifacts.
development
Run, watch, debug, and extend OpenClaw QA testing with qa-lab and qa-channel. Use when Codex needs to execute the repo-backed QA suite, inspect live QA artifacts, debug failing scenarios, add new QA scenarios, or explain the OpenClaw QA workflow. Prefer the live OpenAI lane with regular openai/gpt-5.4 in fast mode; do not use gpt-5.4-pro or gpt-5.4-mini unless the user explicitly overrides that policy.