- api/route-roots.ts: the symbol a route runs (references-edge handler, exported page component, or the route itself for an inline handler), shared by steps and screens; the bare Steps tab lists an API's endpoints by router file - api/effects.ts: database / response / queue / email / payments / cache / auth / process / network / storage / device / telemetry, matched on the call as written per language family, with model + read/write and the literal status on a response site - graph/branch-guards.ts: callSitesForFile (the whole member chain), memberTypesInTree, decoratorsForFile, request/decorator triggers with the middleware/guard chain; guard + argument rules for Python, Java, Kotlin, C#, Go and C - steps.ts: classify on the chain before trusting a name match, retarget this.x.y() by declared type, skip test doubles after the effect pre-check, project kind on the wire - viewer: kindWord/kindWords per project kind, endpoint chooser, response boxes labelled by status codes - python.ts: FastAPI detected from a monorepo sub-directory; is-test-file: samples/examples package paths are not tests - tests: ui-steps-api-servers, ui-effects, branch-guards-languages; spec §3.13 Servers paragraph, CHANGELOG, plan doc Co-Authored-By: Claude Fable 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01REFyW9hmNrxhwN5wxRoAkC
74 lines
3.9 KiB
TypeScript
74 lines
3.9 KiB
TypeScript
/**
|
|
* isTestFile heuristic — test-file detection used to deprioritize test code in
|
|
* search/explore ranking.
|
|
*
|
|
* Regression coverage for the cold-query fix: the heuristic previously only
|
|
* knew Java/JS/Python conventions, so Kotlin (`*Test.kt`, `jvmTest/`), Swift
|
|
* (`*Tests.swift`), and camelCase test source-set dirs slipped through — which
|
|
* let OkHttp's tests flood `codegraph_explore` results on a plain-language
|
|
* query. The false-positive guards matter just as much: `latest.kt` /
|
|
* `manifest.kt` / a `RealCall.kt` production file must NOT be flagged.
|
|
*/
|
|
import { describe, it, expect } from 'vitest';
|
|
import { isTestFile } from '../src/search/query-utils';
|
|
|
|
describe('isTestFile', () => {
|
|
it('flags test-support modules and doubles by directory name', () => {
|
|
expect(isTestFile('core/data-test/src/main/kotlin/com/example/FakeUserDataRepository.kt')).toBe(true);
|
|
expect(isTestFile('core/datastore-test/src/main/kotlin/com/example/InMemoryDataStore.kt')).toBe(true);
|
|
expect(isTestFile('core/testing/src/main/kotlin/com/example/TestUserDataRepository.kt')).toBe(true);
|
|
expect(isTestFile('pkg/testdata/fixture.go')).toBe(true);
|
|
expect(isTestFile('src/__mocks__/api.ts')).toBe(true);
|
|
expect(isTestFile('internal/testutil/helpers.go')).toBe(true);
|
|
});
|
|
|
|
it('does NOT flag production code whose package path runs through a samples or examples segment', () => {
|
|
// Only the project layout above `src/` decides; the package path below it never does.
|
|
expect(isTestFile('core/data/src/main/kotlin/com/google/samples/apps/nowinandroid/core/data/SyncUtilities.kt')).toBe(false);
|
|
expect(isTestFile('feature/foryou/impl/src/main/kotlin/com/google/samples/apps/ForYouViewModel.kt')).toBe(false);
|
|
expect(isTestFile('src/samples/demo.ts')).toBe(false);
|
|
// …while a real examples folder in the layout still counts.
|
|
expect(isTestFile('examples/basic/src/index.ts')).toBe(true);
|
|
expect(isTestFile('packages/x/examples/basic.ts')).toBe(true);
|
|
expect(isTestFile('benchmarks/run.py')).toBe(true);
|
|
});
|
|
|
|
it('flags Kotlin test files and source sets', () => {
|
|
expect(isTestFile('okhttp/src/jvmTest/kotlin/okhttp3/CallTest.kt')).toBe(true);
|
|
expect(isTestFile('okhttp/src/commonTest/kotlin/okhttp3/CompressionInterceptorTest.kt')).toBe(true);
|
|
expect(isTestFile('app/src/androidTest/java/com/example/FooTest.kt')).toBe(true);
|
|
expect(isTestFile('module/src/integrationTest/kotlin/BarSpec.kt')).toBe(true);
|
|
});
|
|
|
|
it('flags Swift test files', () => {
|
|
expect(isTestFile('Tests/SessionTests.swift')).toBe(true);
|
|
expect(isTestFile('Sources/FooTest.swift')).toBe(true);
|
|
});
|
|
|
|
it('still flags the previously-supported conventions', () => {
|
|
expect(isTestFile('foo/test_bar.py')).toBe(true);
|
|
expect(isTestFile('pkg/bar_test.go')).toBe(true);
|
|
expect(isTestFile('src/foo.test.ts')).toBe(true);
|
|
expect(isTestFile('src/foo.spec.ts')).toBe(true);
|
|
expect(isTestFile('com/example/FooTest.java')).toBe(true);
|
|
expect(isTestFile('com/example/FooTestCase.java')).toBe(true);
|
|
expect(isTestFile('project/__tests__/foo.ts')).toBe(true);
|
|
expect(isTestFile('project/tests/foo.rb')).toBe(true);
|
|
});
|
|
|
|
it('does NOT flag production files that merely contain "test" lowercase', () => {
|
|
// The fix is capital-led so camelCase boundaries distinguish these.
|
|
expect(isTestFile('src/latest/loader.kt')).toBe(false);
|
|
expect(isTestFile('lib/manifest.kt')).toBe(false);
|
|
expect(isTestFile('okhttp/src/jvmMain/kotlin/okhttp3/internal/connection/RealCall.kt')).toBe(false);
|
|
expect(isTestFile('src/contestEntry.ts')).toBe(false);
|
|
expect(isTestFile('pkg/greatest.go')).toBe(false);
|
|
});
|
|
|
|
it('does NOT flag ordinary production source', () => {
|
|
expect(isTestFile('src/flask/app.py')).toBe(false);
|
|
expect(isTestFile('src/vs/workbench/api/common/extensionHostMain.ts')).toBe(false);
|
|
expect(isTestFile('okhttp/src/commonJvmAndroid/kotlin/okhttp3/OkHttpClient.kt')).toBe(false);
|
|
});
|
|
});
|