From 12228f968775e1f5bc07851da63f2765e361af45 Mon Sep 17 00:00:00 2001 From: Wednesday Date: Sat, 22 Aug 2026 13:31:15 +0800 Subject: [PATCH] test(paths): make path assertions cross-platform for win32 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit paths.ts builds paths with path.join, which emits the platform-native separator (backslashes on win32), so the hardcoded forward-slash string assertions failed on Windows (26 of 30 tests). Normalize the actual value to forward slashes before comparing — the assertions describe path structure, not separator style. Source is unchanged; helpers keep emitting native separators for real fs/ffmpeg consumers. Co-Authored-By: Claude Opus 4.8 (1M context) Claude-Session: https://claude.ai/code/session_017apBXb1xwSg1g9VshnJ7qK --- scripts/config/paths.test.ts | 58 ++++++++++++++++++++---------------- 1 file changed, 32 insertions(+), 26 deletions(-) diff --git a/scripts/config/paths.test.ts b/scripts/config/paths.test.ts index d0f32c2..74e8801 100644 --- a/scripts/config/paths.test.ts +++ b/scripts/config/paths.test.ts @@ -27,67 +27,73 @@ import { const ROOT = '/project/root'; +// The path helpers use path.join, which emits the platform-native separator +// (backslashes on win32). These assertions describe the path *structure*, not +// its separator style, so normalize the actual value to forward slashes before +// comparing. Keeps the expected strings readable and the suite green on Windows. +const norm = (p: string): string => p.replace(/\\/g, '/'); + describe('project / artifact', () => { it('projectFile', () => { - expect(projectFile(ROOT)).toBe('/project/root/.ragtech/project.json'); + expect(norm(projectFile(ROOT))).toBe('/project/root/.ragtech/project.json'); }); it('artifactDir', () => { - expect(artifactDir(ROOT)).toBe('/project/root/.ragtech/artifacts'); + expect(norm(artifactDir(ROOT))).toBe('/project/root/.ragtech/artifacts'); }); }); describe('transcribe pipeline', () => { it('transcribeInput', () => { - expect(transcribeInput(ROOT)).toBe('/project/root/public/transcribe/input'); + expect(norm(transcribeInput(ROOT))).toBe('/project/root/public/transcribe/input'); }); it('transcriptRaw', () => { - expect(transcriptRaw(ROOT)).toBe('/project/root/public/transcribe/output/raw/transcript.raw.json'); + expect(norm(transcriptRaw(ROOT))).toBe('/project/root/public/transcribe/output/raw/transcript.raw.json'); }); it('diarizationOutput', () => { - expect(diarizationOutput(ROOT)).toBe('/project/root/public/transcribe/output/raw/diarization.json'); + expect(norm(diarizationOutput(ROOT))).toBe('/project/root/public/transcribe/output/raw/diarization.json'); }); it('hookQaDir', () => { - expect(hookQaDir(ROOT)).toBe('/project/root/public/transcribe/output/hook-qa'); + expect(norm(hookQaDir(ROOT))).toBe('/project/root/public/transcribe/output/hook-qa'); }); }); describe('edit / longform output', () => { it('transcriptOutput', () => { - expect(transcriptOutput(ROOT)).toBe('/project/root/public/edit/transcript.json'); + expect(norm(transcriptOutput(ROOT))).toBe('/project/root/public/edit/transcript.json'); }); it('transcriptDoc', () => { - expect(transcriptDoc(ROOT)).toBe('/project/root/public/edit/transcript.doc.txt'); + expect(norm(transcriptDoc(ROOT))).toBe('/project/root/public/edit/transcript.doc.txt'); }); }); describe('sync pipeline', () => { it('syncVideoDir', () => { - expect(syncVideoDir(ROOT)).toBe('/project/root/public/sync/video'); + expect(norm(syncVideoDir(ROOT))).toBe('/project/root/public/sync/video'); }); it('syncAudioDir', () => { - expect(syncAudioDir(ROOT)).toBe('/project/root/public/sync/audio'); + expect(norm(syncAudioDir(ROOT))).toBe('/project/root/public/sync/audio'); }); it('syncOutputDir', () => { - expect(syncOutputDir(ROOT)).toBe('/project/root/public/sync/output'); + expect(norm(syncOutputDir(ROOT))).toBe('/project/root/public/sync/output'); }); it('syncedVideo', () => { - expect(syncedVideo(ROOT)).toBe('/project/root/public/sync/output/synced-output.mp4'); + expect(norm(syncedVideo(ROOT))).toBe('/project/root/public/sync/output/synced-output.mp4'); }); it('syncedVideoAngle — index 1', () => { - expect(syncedVideoAngle(1, ROOT)).toBe('/project/root/public/sync/output/synced-output-1.mp4'); + expect(norm(syncedVideoAngle(1, ROOT))).toBe('/project/root/public/sync/output/synced-output-1.mp4'); }); it('syncedVideoAngle — index 2', () => { - expect(syncedVideoAngle(2, ROOT)).toBe('/project/root/public/sync/output/synced-output-2.mp4'); + expect(norm(syncedVideoAngle(2, ROOT))).toBe('/project/root/public/sync/output/synced-output-2.mp4'); }); it('syncedVideoAngle — index 0 throws', () => { @@ -101,33 +107,33 @@ describe('sync pipeline', () => { describe('camera', () => { it('cameraProfiles', () => { - expect(cameraProfiles(ROOT)).toBe('/project/root/public/camera/camera-profiles.json'); + expect(norm(cameraProfiles(ROOT))).toBe('/project/root/public/camera/camera-profiles.json'); }); }); describe('shorts pipeline', () => { it('shortsDir', () => { - expect(shortsDir(ROOT)).toBe('/project/root/public/shorts'); + expect(norm(shortsDir(ROOT))).toBe('/project/root/public/shorts'); }); it('shortClipDir', () => { - expect(shortClipDir('clip-01', ROOT)).toBe('/project/root/public/shorts/clip-01'); + expect(norm(shortClipDir('clip-01', ROOT))).toBe('/project/root/public/shorts/clip-01'); }); it('shortTranscript', () => { - expect(shortTranscript('clip-01', ROOT)).toBe('/project/root/public/shorts/clip-01/transcript.json'); + expect(norm(shortTranscript('clip-01', ROOT))).toBe('/project/root/public/shorts/clip-01/transcript.json'); }); it('shortDoc', () => { - expect(shortDoc('clip-01', ROOT)).toBe('/project/root/public/shorts/clip-01/transcript.doc.txt'); + expect(norm(shortDoc('clip-01', ROOT))).toBe('/project/root/public/shorts/clip-01/transcript.doc.txt'); }); it('shortsCameraProfiles', () => { - expect(shortsCameraProfiles(ROOT)).toBe('/project/root/public/shorts/camera-profiles.json'); + expect(norm(shortsCameraProfiles(ROOT))).toBe('/project/root/public/shorts/camera-profiles.json'); }); it('shortsTranscriptRaw', () => { - expect(shortsTranscriptRaw(ROOT)).toBe( + expect(norm(shortsTranscriptRaw(ROOT))).toBe( '/project/root/public/shorts/transcribe/output/raw/transcript.raw.json', ); }); @@ -135,21 +141,21 @@ describe('shorts pipeline', () => { describe('carousel pipeline', () => { it('carouselClipDir', () => { - expect(carouselClipDir('ep-42', ROOT)).toBe('/project/root/public/carousel/ep-42'); + expect(norm(carouselClipDir('ep-42', ROOT))).toBe('/project/root/public/carousel/ep-42'); }); it('carouselTranscript', () => { - expect(carouselTranscript('ep-42', ROOT)).toBe('/project/root/public/carousel/ep-42/transcript.json'); + expect(norm(carouselTranscript('ep-42', ROOT))).toBe('/project/root/public/carousel/ep-42/transcript.json'); }); it('carouselDoc', () => { - expect(carouselDoc('ep-42', ROOT)).toBe('/project/root/public/carousel/ep-42/transcript.doc.txt'); + expect(norm(carouselDoc('ep-42', ROOT))).toBe('/project/root/public/carousel/ep-42/transcript.doc.txt'); }); }); describe('thumbnail pipeline', () => { it('thumbnailCameraProfiles', () => { - expect(thumbnailCameraProfiles(ROOT)).toBe('/project/root/public/thumbnail/camera-profiles.json'); + expect(norm(thumbnailCameraProfiles(ROOT))).toBe('/project/root/public/thumbnail/camera-profiles.json'); }); }); @@ -157,7 +163,7 @@ describe('cwd defaults', () => { it('uses process.cwd() as root when cwd is omitted', () => { const result = transcriptOutput(); expect(result.startsWith(process.cwd())).toBe(true); - expect(result.endsWith('/public/edit/transcript.json')).toBe(true); + expect(norm(result).endsWith('/public/edit/transcript.json')).toBe(true); }); });