node-apis
Version:
๐ Advanced TypeScript API generator with clean architecture, comprehensive testing, and automatic formatting. Generate production-ready Node.js APIs with complete integration test suites.
267 lines (243 loc) โข 6.95 kB
JavaScript
"use strict";
/**
* Test configuration templates
*/
Object.defineProperty(exports, "__esModule", { value: true });
exports.generateVSCodeSettings = exports.generateGitHubWorkflow = exports.generateTestGitignore = exports.generateTestDependencies = exports.generateTestScripts = exports.generateTestSetup = exports.generateVitestConfig = void 0;
/**
* Generates vitest configuration file
*/
const generateVitestConfig = () => {
return `import { defineConfig } from 'vitest/config';
export default defineConfig({
test: {
globals: true,
environment: 'node',
root: './tests',
testTimeout: 10000,
hookTimeout: 10000,
teardownTimeout: 5000,
coverage: {
reporter: ['text', 'json', 'html'],
exclude: [
'tests/**',
'dist/**',
'node_modules/**',
'**/*.d.ts',
'**/*.config.*',
'**/coverage/**'
],
thresholds: {
global: {
branches: 80,
functions: 80,
lines: 80,
statements: 80
}
}
},
setupFiles: ['./setup.ts'],
reporters: ['verbose'],
outputFile: {
json: './coverage/test-results.json',
junit: './coverage/junit.xml'
}
},
resolve: {
alias: {
'@': './src',
'@tests': './tests'
}
}
});
`;
};
exports.generateVitestConfig = generateVitestConfig;
/**
* Generates test setup file
*/
const generateTestSetup = () => {
return `/**
* Global test setup
*/
import { beforeAll, afterAll, beforeEach, afterEach } from 'vitest';
// Global test configuration
beforeAll(async () => {
// Global setup before all tests
console.log('๐งช Starting test suite...');
// Setup test database connection if needed
// await setupTestDatabase();
// Setup global mocks
setupGlobalMocks();
});
afterAll(async () => {
// Global cleanup after all tests
console.log('โ
Test suite completed');
// Cleanup test database if needed
// await cleanupTestDatabase();
});
beforeEach(() => {
// Setup before each test
// Reset mocks, clear caches, etc.
});
afterEach(() => {
// Cleanup after each test
// Clear any test data, reset state, etc.
});
/**
* Setup global mocks
*/
function setupGlobalMocks() {
// Mock console methods in test environment
if (process.env.NODE_ENV === 'test') {
// Optionally suppress console.log in tests
// vi.spyOn(console, 'log').mockImplementation(() => {});
}
// Mock Date.now for consistent timestamps in tests
// vi.spyOn(Date, 'now').mockReturnValue(1640995200000); // 2022-01-01
// Mock process.env if needed
process.env.NODE_ENV = 'test';
process.env.LOG_LEVEL = 'error';
}
/**
* Test database setup (if using database)
*/
// async function setupTestDatabase() {
// // Initialize test database
// // Run migrations
// // Seed test data
// }
/**
* Test database cleanup (if using database)
*/
// async function cleanupTestDatabase() {
// // Clear test data
// // Close database connections
// }
// Export test utilities
export const testUtils = {
generateId: () => \`test-\${Date.now()}-\${Math.random().toString(36).substr(2, 9)}\`,
sleep: (ms: number) => new Promise(resolve => setTimeout(resolve, ms)),
mockTimestamp: '2024-01-01T00:00:00.000Z'
};
`;
};
exports.generateTestSetup = generateTestSetup;
/**
* Generates package.json test scripts
*/
const generateTestScripts = () => {
return {
test: 'vitest',
'test:run': 'vitest run',
'test:watch': 'vitest --watch',
'test:ui': 'vitest --ui',
'test:coverage': 'vitest --coverage',
'test:unit': 'vitest tests/**/*.test.ts',
'test:integration': 'vitest tests/**/integration.test.ts',
'test:module': 'vitest tests/{module-name}/**/*.test.ts',
'test:operation': 'vitest tests/{module-name}/{operation-name}/*.test.ts',
'test:success': 'vitest tests/**/success.test.ts',
'test:validation': 'vitest tests/**/validation.test.ts',
'test:errors': 'vitest tests/**/duplicate.test.ts tests/**/unauthorized.test.ts tests/**/not-found.test.ts tests/**/invalid-id.test.ts',
'test:auth': 'vitest tests/**/unauthorized.test.ts',
'test:duplicate': 'vitest tests/**/duplicate.test.ts',
'test:not-found': 'vitest tests/**/not-found.test.ts',
'test:invalid-id': 'vitest tests/**/invalid-id.test.ts',
'test:ci': 'vitest run --coverage --reporter=junit --outputFile=coverage/junit.xml',
};
};
exports.generateTestScripts = generateTestScripts;
/**
* Generates test dependencies for package.json
*/
const generateTestDependencies = () => {
return {
vitest: '^1.0.0',
'@vitest/ui': '^1.0.0',
supertest: '^6.3.3',
'@types/supertest': '^6.0.2',
c8: '^8.0.1',
};
};
exports.generateTestDependencies = generateTestDependencies;
/**
* Generates .gitignore entries for tests
*/
const generateTestGitignore = () => {
return [
'# Test coverage',
'coverage/',
'*.lcov',
'',
'# Test results',
'test-results/',
'junit.xml',
'',
'# Test artifacts',
'.nyc_output',
'*.tgz',
'*.tar.gz',
];
};
exports.generateTestGitignore = generateTestGitignore;
/**
* Generates GitHub Actions workflow for tests
*/
const generateGitHubWorkflow = () => {
return `name: Tests
on:
push:
branches: [ main, develop ]
pull_request:
branches: [ main, develop ]
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
node-version: [18.x, 20.x]
steps:
- uses: actions/checkout@v4
- name: Use Node.js \${{ matrix.node-version }}
uses: actions/setup-node@v4
with:
node-version: \${{ matrix.node-version }}
cache: 'npm'
- name: Install dependencies
run: npm ci
- name: Build project
run: npm run build
- name: Run tests
run: npm run test:ci
- name: Upload coverage reports
uses: codecov/codecov-action@v3
with:
file: ./coverage/lcov.info
flags: unittests
name: codecov-umbrella
fail_ci_if_error: false
`;
};
exports.generateGitHubWorkflow = generateGitHubWorkflow;
/**
* Generates VSCode settings for tests
*/
const generateVSCodeSettings = () => {
return {
'vitest.enable': true,
'vitest.commandLine': 'npm run test',
'testing.automaticallyOpenPeekView': 'never',
'testing.followRunningTest': false,
'testing.openTesting': 'neverOpen',
'files.associations': {
'*.test.ts': 'typescript',
},
'typescript.preferences.includePackageJsonAutoImports': 'auto',
'editor.codeActionsOnSave': {
'source.organizeImports': true,
},
};
};
exports.generateVSCodeSettings = generateVSCodeSettings;
//# sourceMappingURL=test.config.js.map