]> git.giacomolli.uk - onechat/blobdiff - voice_transcriber_test.go
Separate commands from the entry point
[onechat] / voice_transcriber_test.go
index 58df9ea1cfb5bb235a69050515d71ac54875c8cc..c9e24bc5903c51fdd12fbcb670917952da010fe8 100644 (file)
@@ -57,9 +57,18 @@ func TestVoiceFailuresKeepStoredAudioAndSafeMarkers(t *testing.T) {
                name   string
                script string
        }{
                name   string
                script string
        }{
-               {name: "failed process does not expose its errors", script: "echo secret-speech >&2; exit 1"},
-               {name: "missing transcript gets a marker", script: "exit 0"},
-               {name: "empty transcript gets a marker", script: "while [ \"$1\" != --output-file ]; do shift; done; shift; touch \"$1.txt\""},
+               {
+                       name:   "failed process does not expose its errors",
+                       script: "echo secret-speech >&2; exit 1",
+               },
+               {
+                       name:   "missing transcript gets a marker",
+                       script: "exit 0",
+               },
+               {
+                       name:   "empty transcript gets a marker",
+                       script: "while [ \"$1\" != --output-file ]; do shift; done; shift; touch \"$1.txt\"",
+               },
        }
        for _, tc := range testCases {
                t.Run(tc.name, func(t *testing.T) {
        }
        for _, tc := range testCases {
                t.Run(tc.name, func(t *testing.T) {
@@ -107,6 +116,49 @@ func TestVoiceUnavailableAndStorageFailuresDoNotStopIntake(t *testing.T) {
        require.Equal(t, "(voice not stored)", transcriber.Text(t.Context(), store, []byte("audio")))
 }
 
        require.Equal(t, "(voice not stored)", transcriber.Text(t.Context(), store, []byte("audio")))
 }
 
+func TestVoiceBackupsKeepAudioButNotTemporaryTranscripts(t *testing.T) {
+       root := t.TempDir()
+       store := &VoiceStore{dir: filepath.Join(root, voiceDirName)}
+       name, err := store.Save([]byte("made-up backed-up audio"))
+       require.NoError(t, err)
+
+       temp := filepath.Join(store.dir, ".transcript-in-progress")
+       require.NoError(t, os.Mkdir(temp, 0o700))
+       require.NoError(t, os.WriteFile(filepath.Join(temp, "text.txt"), []byte("private temporary text"), 0o600))
+
+       target := t.TempDir()
+       require.NoError(t, backupCopy(t.Context(), root, target, filepath.Join(t.TempDir(), "backup.tar.gz")))
+       require.FileExists(t, filepath.Join(target, voiceDirName, name))
+       require.NoDirExists(t, filepath.Join(target, voiceDirName, ".transcript-in-progress"))
+
+       archive := filepath.Join(t.TempDir(), "voice.tar.gz")
+       _, err = backupArchive(t.Context(), target, archive)
+       require.NoError(t, err)
+
+       restored := t.TempDir()
+       require.NoError(t, backupExtract(t.Context(), archive, restored))
+
+       audio, err := os.ReadFile(filepath.Join(restored, voiceDirName, name))
+       require.NoError(t, err)
+       require.Equal(t, []byte("made-up backed-up audio"), audio)
+
+       info, err := os.Stat(filepath.Join(restored, voiceDirName, name))
+       require.NoError(t, err)
+       require.Equal(t, os.FileMode(0o600), info.Mode().Perm())
+}
+
+func TestVoiceConfigReadsExplicitLocalPaths(t *testing.T) {
+       dir := t.TempDir()
+       configWriteTest(t, dir, `{"voice":{"transcriber":"local-whisper","model":"model.bin"}}`)
+
+       config, err := loadConfig(dir)
+       require.NoError(t, err)
+       require.Equal(t, VoiceConfig{
+               Transcriber: "local-whisper",
+               Model:       "model.bin",
+       }, config.Voice)
+}
+
 func TestVoiceLookupHonorsExplicitThenNixThenPath(t *testing.T) {
        _, transcriber := voiceTestInput(t, "exit 0")
        valid := transcriber.config
 func TestVoiceLookupHonorsExplicitThenNixThenPath(t *testing.T) {
        _, transcriber := voiceTestInput(t, "exit 0")
        valid := transcriber.config
@@ -138,8 +190,11 @@ func TestVoiceLookupHonorsExplicitThenNixThenPath(t *testing.T) {
                        available: true,
                },
                {
                        available: true,
                },
                {
-                       name:    "invalid explicit executable does not fall back",
-                       config:  VoiceConfig{Transcriber: "missing", Model: valid.Model},
+                       name: "invalid explicit executable does not fall back",
+                       config: VoiceConfig{
+                               Transcriber: "missing",
+                               Model:       valid.Model,
+                       },
                        program: valid.Transcriber,
                },
                {
                        program: valid.Transcriber,
                },
                {