package tui import ( "os" "path/filepath" "testing" "gitgud.io/mike/mpv-manager/pkg/config" "gitgud.io/mike/mpv-manager/pkg/constants" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" ) func isolateLanguageConfig(t *testing.T) string { t.Helper() // Register this before Setenv so it reloads from the original environment // after Setenv's cleanup restores it. t.Cleanup(func() { _, _ = config.Reload() }) home := t.TempDir() for _, key := range []string{"HOME", "USERPROFILE", "APPDATA", "LOCALAPPDATA"} { t.Setenv(key, home) } t.Setenv("XDG_CONFIG_HOME", filepath.Join(home, ".config")) _, err := config.Reload() require.NoError(t, err) return config.GetConfigPath() } func TestApplyLanguagePreferencesCopiesBackupAndPreservesLiveConfig(t *testing.T) { configPath := isolateLanguageConfig(t) require.NoError(t, os.MkdirAll(filepath.Dir(configPath), constants.DirPermission)) original := "profile=high-quality\nalang=en\nslang=fr\n" require.NoError(t, os.WriteFile(configPath, []byte(original), constants.FilePermission)) m := NewModel() m.langPreferenceType = "audio" m.selectedLanguageCodes = []string{"ja", "en"} require.NoError(t, m.applyLanguagePreferences()) live, err := os.ReadFile(configPath) require.NoError(t, err) assert.Contains(t, string(live), "profile=high-quality") assert.Contains(t, string(live), "alang=ja,en") assert.Contains(t, string(live), "slang=fr") backupDir, err := config.GetMPVConfigBackupDir() require.NoError(t, err) entries, err := os.ReadDir(backupDir) require.NoError(t, err) require.Len(t, entries, 1) backup, err := os.ReadFile(filepath.Join(backupDir, entries[0].Name())) require.NoError(t, err) assert.Equal(t, original, string(backup)) } func TestApplyLanguagePreferencesAbortsWhenBackupFails(t *testing.T) { configPath := isolateLanguageConfig(t) configDir := filepath.Dir(configPath) require.NoError(t, os.MkdirAll(configDir, constants.DirPermission)) original := "profile=high-quality\nalang=en\n" require.NoError(t, os.WriteFile(configPath, []byte(original), constants.FilePermission)) require.NoError(t, os.WriteFile(filepath.Join(configDir, constants.ConfigBackupsDir), []byte("block"), 0600)) m := NewModel() m.langPreferenceType = "audio" m.selectedLanguageCodes = []string{"ja"} require.Error(t, m.applyLanguagePreferences()) live, err := os.ReadFile(configPath) require.NoError(t, err) assert.Equal(t, original, string(live)) }