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