Files
brain/tools/tdd-real-test-verifier.test.mjs
T

94 lines
4.1 KiB
JavaScript

import { describe, it, expect } from 'vitest';
import {
extractImportsAndStrings, verifyRealTestContent, verifyRealTest,
} from './tdd-real-test-verifier.mjs';
describe('verifyRealTestContent', () => {
it('rejects empty test body (no expect)', () => {
const r = verifyRealTestContent('test("x", () => {})', ['app/Foo.mjs']);
expect(r).toEqual({ valid: false, reason: 'no_expect_call' });
});
it('rejects content with no expect call (bare expect identifier)', () => {
expect(verifyRealTestContent('const x = expect;', ['app/Foo.mjs'])).toEqual({ valid: false, reason: 'no_expect_call' });
});
it('rejects content with expect() but no test/it block', () => {
expect(verifyRealTestContent('const r = expect(1);', ['app/Foo.mjs'])).toEqual({ valid: false, reason: 'no_test_block' });
});
it('rejects no coverage of edited files', () => {
const content = `import { bar } from './bar.mjs'; test('t', () => { expect(bar()).toBe(1); });`;
const r = verifyRealTestContent(content, ['app/Models/User.php']);
expect(r).toEqual({ valid: false, reason: 'no_coverage_of_edited_files' });
});
it('accepts real test importing an edited file', () => {
const content = `import { foo } from './foo.mjs'; test('t', () => { expect(foo()).toBe(1); });`;
const r = verifyRealTestContent(content, ['tools/foo.mjs']);
expect(r).toEqual({ valid: true });
});
});
describe('extractImportsAndStrings', () => {
it("includes import from path", () => {
const result = extractImportsAndStrings("import {a} from './x.mjs'");
expect(result).toContain('./x.mjs');
});
it("includes require path", () => {
const result = extractImportsAndStrings("require('./y.mjs')");
expect(result).toContain('./y.mjs');
});
it("includes string literal path", () => {
const result = extractImportsAndStrings("const p = 'app/Models/User'");
expect(result).toContain('app/Models/User');
});
});
describe('verifyRealTestContent — coverage variants', () => {
it('matches via string literal path not import', () => {
const content = `test('t',()=>{ const p='tools/foo.mjs'; expect(p).toBeTruthy(); });`;
const r = verifyRealTestContent(content, ['tools/foo.mjs']);
expect(r).toEqual({ valid: true });
});
it('matches basename across extensions', () => {
// import string './Foo.test.mjs' includes substring 'Foo' -> matches edited 'app/Foo.php'
const content = `import './Foo.test.mjs'; test('t',()=>{ expect(1).toBe(1); });`;
const r = verifyRealTestContent(content, ['app/Foo.php']);
expect(r).toEqual({ valid: true });
});
it('empty editedFilesList → valid if expect+test', () => {
const content = `test('t',()=>{ expect(1).toBe(1); });`;
const r = verifyRealTestContent(content, []);
expect(r).toEqual({ valid: true });
});
it('it() block also accepted', () => {
const r = verifyRealTestContent(`it('x',()=>{expect(1).toBe(1)})`, []);
expect(r).toEqual({ valid: true });
});
it('trivial expect(true).toBe(true) with import passes — acceptable residual', () => {
const content = `import './foo.mjs'; test('t',()=>{expect(true).toBe(true)});`;
const r = verifyRealTestContent(content, ['tools/foo.mjs']);
expect(r).toEqual({ valid: true });
});
});
describe('verifyRealTest — fs wrapper', () => {
it('returns valid:true for good test content via readFile', () => {
const r = verifyRealTest(
'/x',
['tools/foo.mjs'],
{ readFile: () => "import './foo.mjs'; test('t',()=>{expect(1).toBe(1)})" },
);
expect(r).toEqual({ valid: true });
});
it('returns test_file_not_found on ENOENT', () => {
const err = new Error('ENOENT: no such file');
err.code = 'ENOENT';
const r = verifyRealTest('/missing', [], { readFile: () => { throw err; } });
expect(r).toEqual({ valid: false, reason: 'test_file_not_found' });
});
it('returns test_file_read_error on non-ENOENT errors (e.g. EACCES)', () => {
const err = new Error('EACCES: permission denied');
err.code = 'EACCES';
const r = verifyRealTest('/forbidden', [], { readFile: () => { throw err; } });
expect(r).toEqual({ valid: false, reason: 'test_file_read_error' });
});
});