Add code quality gates
Add ESLint/quality gates, per-file ratchet budgets, and regression tests for code quality checks.
This commit is contained in:
64
scripts/quality/code-quality.test.ts
Normal file
64
scripts/quality/code-quality.test.ts
Normal file
@@ -0,0 +1,64 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
|
||||
import { analyzeCodeQuality, evaluateCodeQuality } from './code-quality.js';
|
||||
|
||||
describe('code quality evaluator', () => {
|
||||
it('measures line count and function metrics from TypeScript source', () => {
|
||||
const metrics = analyzeCodeQuality(
|
||||
'sample.ts',
|
||||
[
|
||||
'export function choose(value: number) {',
|
||||
' if (value > 10) {',
|
||||
' return value;',
|
||||
' }',
|
||||
' return value > 0 ? value : 0;',
|
||||
'}',
|
||||
].join('\n'),
|
||||
);
|
||||
|
||||
expect(metrics.lineCount).toBe(6);
|
||||
expect(metrics.nonEmptyLineCount).toBe(6);
|
||||
expect(metrics.maxFunctionLines).toBe(6);
|
||||
expect(metrics.maxComplexity).toBeGreaterThanOrEqual(3);
|
||||
expect(metrics.maxNesting).toBeGreaterThanOrEqual(1);
|
||||
});
|
||||
|
||||
it('does not let nested functions inflate the parent function budget', () => {
|
||||
const metrics = analyzeCodeQuality(
|
||||
'nested.ts',
|
||||
[
|
||||
'export function outer() {',
|
||||
' const inner = () => {',
|
||||
' if (true) return 1;',
|
||||
' return 0;',
|
||||
' };',
|
||||
' return inner();',
|
||||
'}',
|
||||
].join('\n'),
|
||||
);
|
||||
|
||||
expect(metrics.maxComplexity).toBe(2);
|
||||
});
|
||||
|
||||
it('returns budget findings for metrics over the configured limit', () => {
|
||||
const metrics = analyzeCodeQuality(
|
||||
'oversized.ts',
|
||||
['export function f() {', ' return 1;', '}'].join('\n'),
|
||||
);
|
||||
|
||||
expect(
|
||||
evaluateCodeQuality(metrics, {
|
||||
maxComplexity: 1,
|
||||
maxFunctionLines: 2,
|
||||
maxLines: 2,
|
||||
maxNesting: 0,
|
||||
owner: 'test',
|
||||
}),
|
||||
).toEqual(
|
||||
expect.arrayContaining([
|
||||
expect.objectContaining({ metric: 'lineCount' }),
|
||||
expect.objectContaining({ metric: 'maxFunctionLines' }),
|
||||
]),
|
||||
);
|
||||
});
|
||||
});
|
||||
Reference in New Issue
Block a user