mirror of
https://github.com/stablyai/orca.git
synced 2026-11-02 10:08:13 +00:00
* perf(ci): reduce test overhead and reuse expensive build work * test(ci): keep worker startup outside failure-case deadlines * test: isolate push fixture advisory locks * test(ci): preserve fixed drain retry allowance * Align CI contracts with current triggers and guide content * Stabilize consolidated reveal scenarios and retain behavioral CI contracts * Fix upstream lint blockers while retaining behavior and assertions * Classify global Jira preferences in the WSL migration inventory * Align Jira test fixtures with startup and build safety checks * Include package-test routing dependency in CI checkouts and fixtures * Keep native stream classes intact in transcript dependency tests
115 lines
4.7 KiB
JavaScript
115 lines
4.7 KiB
JavaScript
import { readFileSync } from 'node:fs'
|
|
import { matchesGlob } from 'node:path'
|
|
import { parse } from 'yaml'
|
|
import { expect, it } from 'vitest'
|
|
import { shouldRunMobileTests } from './mobile-test-change-scope.mjs'
|
|
|
|
it.each([
|
|
'docs/ci.md',
|
|
'mobile/docs/release.md',
|
|
'mobile/README.md',
|
|
'mobile/Gemfile.lock',
|
|
'mobile/fastlane/Fastfile',
|
|
'.github/workflows/mobile-ios-release.yml',
|
|
'config/scripts/pr-code-change-scope.mjs',
|
|
'config/scripts/pr-package-test-paths.mjs',
|
|
'config/scripts/mobile-release-check-scope.test.mjs'
|
|
])('skips only known non-test inputs: %s', (file) => {
|
|
expect(shouldRunMobileTests([file])).toBe(false)
|
|
expect(shouldRunMobileTests([file, 'mobile/src/changed.ts'])).toBe(true)
|
|
})
|
|
|
|
it.each([
|
|
'mobile/src/view.tsx',
|
|
'mobile/app/_layout.tsx',
|
|
'mobile/scripts/check.ts',
|
|
'mobile/rpc-foundation/goldens/recording.json',
|
|
'mobile/vitest.config.ts',
|
|
'mobile/vitest.setup.ts',
|
|
'mobile/pnpm-lock.yaml',
|
|
'pnpm-lock.yaml',
|
|
'src/main/runtime/runtime-rpc.ts',
|
|
'src/shared/protocol-version.ts',
|
|
'src/packages/process-host/src/run-process.ts',
|
|
'.github/workflows/mobile.yml',
|
|
'.github/actions/install-node-dependencies/action.yml',
|
|
'config/scripts/mobile-test-change-scope.mjs',
|
|
'unknown-input',
|
|
'mobile/docs/../../src/source.ts'
|
|
])('retains source, fixtures, toolchain, selector and unknown changes: %s', (file) => {
|
|
expect(shouldRunMobileTests([file])).toBe(true)
|
|
})
|
|
|
|
it('retains tests on missing evidence and a move out of the source tree', () => {
|
|
expect(shouldRunMobileTests([])).toBe(true)
|
|
expect(shouldRunMobileTests(['mobile/src/deleted.ts', 'mobile/docs/moved.ts'])).toBe(true)
|
|
})
|
|
|
|
it('runs Mobile Checks for shared modules, process-host tooling and the root lockfile on PRs and main', () => {
|
|
const workflow = parse(
|
|
readFileSync(new URL('../../.github/workflows/mobile.yml', import.meta.url), 'utf8')
|
|
)
|
|
for (const paths of [workflow.on.pull_request.paths, workflow.on.push.paths]) {
|
|
for (const file of [
|
|
'src/shared/any/module.ts',
|
|
'src/packages/process-host/src/run-process.ts',
|
|
'src/packages/process-host/package.json',
|
|
'pnpm-lock.yaml'
|
|
]) {
|
|
expect(paths.some((pattern) => matchesGlob(file, pattern))).toBe(true)
|
|
}
|
|
expect(
|
|
paths.some((pattern) => matchesGlob('src/packages/unrelated/src/index.ts', pattern))
|
|
).toBe(false)
|
|
}
|
|
})
|
|
|
|
it('skips only tests, after successful detection, and retains all other mobile gates', () => {
|
|
const workflow = parse(
|
|
readFileSync(new URL('../../.github/workflows/mobile.yml', import.meta.url), 'utf8')
|
|
)
|
|
const steps = workflow.jobs.verify.steps
|
|
expect(workflow.on.pull_request.paths).toContain('config/scripts/mobile-test-change-scope*')
|
|
const detector = steps.find((step) => step.id === 'test-scope')
|
|
expect(detector.run).toContain('git diff --name-only --no-renames -z HEAD^1 HEAD')
|
|
expect(detector.run.match(/should_run=true/g)).toHaveLength(2)
|
|
expect(steps.find((step) => step.name === 'Test').if).toBe(
|
|
"steps.test-scope.outputs.should_run != 'false'"
|
|
)
|
|
for (const name of ['Typecheck', 'Typecheck tests (ratchet)', 'Lint', 'Check formatting']) {
|
|
expect(steps.find((step) => step.name === name).if).toBeUndefined()
|
|
}
|
|
})
|
|
|
|
it('overlaps both typechecks with tests and collects their failures before the summary', () => {
|
|
const workflow = parse(
|
|
readFileSync(new URL('../../.github/workflows/mobile.yml', import.meta.url), 'utf8')
|
|
)
|
|
const steps = workflow.jobs.verify.steps
|
|
const install = steps.findIndex((step) => step.name === 'Install dependencies')
|
|
const test = steps.findIndex((step) => step.name === 'Test')
|
|
const summary = steps.findIndex((step) => step.name === 'Summarize RPC recording changes')
|
|
const waits = steps.filter((step) => step.wait !== undefined)
|
|
expect(waits).toHaveLength(1)
|
|
const [wait] = waits
|
|
expect(wait.wait).toEqual(['production-types', 'test-types', 'ruby-tools'])
|
|
expect(wait.if).toBeUndefined()
|
|
expect(steps.indexOf(wait)).toBeGreaterThan(test)
|
|
expect(steps.indexOf(wait)).toBeLessThan(summary)
|
|
for (const id of ['production-types', 'test-types']) {
|
|
const step = steps.find((candidate) => candidate.id === id)
|
|
expect(step.background).toBe(true)
|
|
expect(step['continue-on-error']).toBeUndefined()
|
|
expect(step.if).toBeUndefined()
|
|
expect(steps.indexOf(step)).toBeGreaterThan(install)
|
|
expect(steps.indexOf(step)).toBeLessThan(test)
|
|
expect(step.run).toMatch(/^node /)
|
|
}
|
|
const ruby = steps.find((step) => step.id === 'ruby-tools')
|
|
expect(ruby.uses).toBe('ruby/setup-ruby@v1')
|
|
expect(ruby.background).toBe(true)
|
|
expect(ruby.if).toBe("steps.ruby-scope.outputs.should_run != 'false'")
|
|
expect(ruby['continue-on-error']).toBeUndefined()
|
|
expect(steps.indexOf(ruby)).toBeLessThan(install)
|
|
})
|