Files
orca/config/scripts/check-flaky-test-pattern-ratchet.test.mjs
T
Blue DaydreamingandNeil b3089eef1d fix(scripts): preserve Git-quoted paths in ratchet checks (#34397)
Read git ls-files and git diff --name-only with -z so non-ASCII paths are
not C-quoted and still match ast-grep's real filenames; otherwise new
flaky-test findings in such files were silently dropped.

Fixes #34395

Co-authored-by: Neil <neil@stably.ai>
2026-10-27 09:48:41 -07:00

108 lines
3.5 KiB
JavaScript

import { execFileSync } from 'node:child_process'
import { mkdirSync, mkdtempSync, rmSync, writeFileSync } from 'node:fs'
import { tmpdir } from 'node:os'
import { join } from 'node:path'
import { afterEach, describe, expect, it, vi } from 'vitest'
import {
changedFileScope,
countFindings,
listChangedFiles,
main
} from './check-flaky-test-pattern-ratchet.mjs'
describe('countFindings', () => {
it('counts each rule per file, folding TSX twins and Windows separators', () => {
const counts = countFindings(
[
{ ruleId: 'test-no-wall-clock', file: 'src/a.test.ts' },
{ ruleId: 'test-no-wall-clock', file: 'src\\a.test.ts' },
{ ruleId: 'test-no-wall-clock-tsx', file: 'src/b.test.tsx' },
{ ruleId: 'test-no-real-time-wait', file: 'src/a.test.ts' },
{ ruleId: 'test-no-real-time-wait', file: 'scratch.test.ts' }
],
(file) => file !== 'scratch.test.ts'
)
expect([...counts]).toEqual([
['test-no-wall-clock:src/a.test.ts', 2],
['test-no-wall-clock:src/b.test.tsx', 1],
['test-no-real-time-wait:src/a.test.ts', 1]
])
})
})
describe('changedFileScope', () => {
it('limits enforcement to findings in changed files', () => {
const inScope = changedFileScope(new Set(['src/a.test.ts']))
expect(inScope('test-no-wall-clock:src/a.test.ts')).toBe(true)
expect(inScope('test-no-wall-clock:src/b.test.ts')).toBe(false)
expect(changedFileScope(null)).toBeUndefined()
})
})
describe('listChangedFiles', () => {
let fixture
const git = (...args) =>
execFileSync(
'git',
[
'-c',
'user.name=t',
'-c',
'user.email=t@example.com',
'-c',
'commit.gpgsign=false',
...args
],
{ cwd: fixture, encoding: 'utf8' }
).trim()
afterEach(() => {
vi.unstubAllEnvs()
vi.restoreAllMocks()
rmSync(fixture, { recursive: true, force: true })
})
it('enforces findings in tracked files whose names Git quotes', () => {
fixture = mkdtempSync(join(tmpdir(), 'flaky-ratchet-path-'))
git('init', '-q')
git('config', 'core.quotePath', 'true')
git('commit', '--allow-empty', '-qm', 'base')
vi.stubEnv('ORCA_CODE_QUALITY_BASE', git('rev-parse', 'HEAD'))
vi.stubEnv('ORCA_FLAKY_TEST_RATCHET_ALL', '')
const file = '測試.test.ts'
writeFileSync(join(fixture, file), 'Date.now()\n')
git('add', '--', file)
mkdirSync(join(fixture, 'config'))
writeFileSync(join(fixture, 'config/flaky-test-pattern-baseline.txt'), '')
const error = vi.spyOn(console, 'error').mockImplementation(() => {})
expect(main(fixture, undefined, [{ file, ruleId: 'test-no-wall-clock' }])).toBe(1)
expect(error.mock.calls.join('\n')).toContain(file)
})
it('scopes to the base check:changed forwards instead of a stale origin/main', () => {
fixture = mkdtempSync(join(tmpdir(), 'flaky-ratchet-base-'))
const commit = (file) => {
writeFileSync(join(fixture, file), file)
git('add', file)
git('commit', '-qm', file)
return git('rev-parse', 'HEAD')
}
git('init', '-q')
git('update-ref', 'refs/remotes/origin/main', commit('fork-base.txt'))
const upstream = commit('upstream-drift.txt')
commit('contribution.txt')
vi.stubEnv('ORCA_FLAKY_TEST_RATCHET_ALL', '')
vi.stubEnv('ORCA_CODE_QUALITY_BASE', '')
expect([...listChangedFiles(fixture)].sort()).toEqual([
'contribution.txt',
'upstream-drift.txt'
])
vi.stubEnv('ORCA_CODE_QUALITY_BASE', upstream)
expect([...listChangedFiles(fixture)]).toEqual(['contribution.txt'])
})
})