From asyrafhussin-agent-skills-1
Unit testing, integration testing, and test-driven development principles. Use when writing tests, reviewing test code, improving test coverage, or setting up testing strategy. Triggers on "write tests", "review tests", "testing best practices", or "TDD".
npx claudepluginhub joshuarweaver/cascade-code-languages-misc-1 --plugin asyrafhussin-agent-skills-1This skill uses the workspace's default tool permissions.
Unit testing, integration testing, and TDD principles for reliable, maintainable test suites. Contains 34 rules across 7 categories using TypeScript with Jest/Vitest.
AGENTS.mdREADME.mdmetadata.jsonrules/_sections.mdrules/_template.mdrules/assert-custom-matchers.mdrules/assert-expected-actual.mdrules/assert-meaningful-messages.mdrules/assert-no-magic-numbers.mdrules/assert-specific.mdrules/cov-edge-cases.mdrules/cov-meaningful.mdrules/cov-not-100-percent.mdrules/cov-unhappy-paths.mdrules/data-builders.mdrules/data-factories.mdrules/data-faker.mdrules/data-fixtures.mdrules/data-minimal.mdrules/data-realistic.mdSearches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Searches prompts.chat for AI prompt templates by keyword or category, retrieves by ID with variable handling, and improves prompts via AI. Use for discovering or enhancing prompts.
Checks Next.js compilation errors using a running Turbopack dev server after code edits. Fixes actionable issues before reporting complete. Replaces `next build`.
Unit testing, integration testing, and TDD principles for reliable, maintainable test suites. Contains 34 rules across 7 categories using TypeScript with Jest/Vitest.
Reference these guidelines when:
| Priority | Category | Impact | Prefix |
|---|---|---|---|
| 1 | Test Structure | CRITICAL | struct- |
| 2 | Test Isolation | CRITICAL | iso- |
| 3 | Assertions | HIGH | assert- |
| 4 | Test Data | HIGH | data- |
| 5 | Mocking | MEDIUM | mock- |
| 6 | Coverage | MEDIUM | cov- |
| 7 | Performance | LOW | perf- |
struct-aaa-pattern - Arrange, Act, Assert patternstruct-descriptive-names - Descriptive test namesstruct-one-assertion - One logical assertion per teststruct-describe-it - Organized test suites with describe/itstruct-given-when-then - BDD style when appropriatestruct-setup-teardown - Proper setup and teardowniso-independent-tests - Tests run independentlyiso-no-shared-state - No shared mutable stateiso-deterministic - Same result every runiso-no-order-dependency - Run in any orderiso-cleanup - Clean up after testsiso-test-doubles - Strategic use of test doublesassert-specific - Use specific assertionsassert-meaningful-messages - Helpful failure messagesassert-expected-actual - Expected value firstassert-no-magic-numbers - Use named constantsassert-custom-matchers - Custom matchers for domain logicdata-factories - Use factories for test datadata-builders - Builder pattern for complex objectsdata-faker - Generate realistic fake datadata-minimal - Minimal test datadata-realistic - Realistic edge casesdata-fixtures - Manage test fixturesmock-boundaries - Mock only at boundariesmock-verify-interactions - Verify important mock callsmock-minimal - Don't over-mockmock-realistic - Realistic mock behavior with MSWcov-meaningful - Focus on meaningful coveragecov-edge-cases - Cover edge cases and boundary valuescov-unhappy-paths - Test error scenarioscov-not-100-percent - 100% coverage isn't the goalperf-fast-unit - Keep unit tests fast (<50ms each)perf-parallel - Run tests in parallelperf-test-organization - Organize tests for fast feedbackit('calculates total with discount', () => {
// Arrange
const cart = new ShoppingCart();
cart.addItem({ name: 'Book', price: 20 });
cart.applyDiscount(0.1);
// Act
const total = cart.getTotal();
// Assert
expect(total).toBe(18);
});
// ✅ Describes behavior and scenario
describe('UserService.register', () => {
it('creates user with hashed password', () => {});
it('throws ValidationError when email is invalid', () => {});
it('sends welcome email after successful registration', () => {});
});
// ✅ Each test sets up its own data
beforeEach(() => {
mockRepository = { save: vi.fn(), find: vi.fn() };
service = new OrderService(mockRepository);
});
Read individual rule files for detailed explanations:
rules/struct-aaa-pattern.md
rules/iso-independent-tests.md
rules/mock-boundaries.md
rules/cov-meaningful.md
For the complete guide with all rules expanded: AGENTS.md