package config import ( "os" "path/filepath" "testing" ) func TestMigrateLegacyFile(t *testing.T) { dir := t.TempDir() legacy := filepath.Join(dir, "legacy", "config.json") target := filepath.Join(dir, "internal", "config.json") content := []byte(`{"activity":"xiaodian"}`) if err := os.MkdirAll(filepath.Dir(legacy), 0700); err != nil { t.Fatal(err) } if err := os.WriteFile(legacy, content, 0600); err != nil { t.Fatal(err) } migrated, err := MigrateLegacyFile(target, legacy) if err != nil { t.Fatalf("迁移失败: %v", err) } if !migrated { t.Fatal("应迁移旧文件") } got, err := os.ReadFile(target) if err != nil { t.Fatal(err) } if string(got) != string(content) { t.Fatalf("迁移内容 = %q, want %q", got, content) } if _, err := os.Stat(legacy); err != nil { t.Fatalf("旧文件不应被删除: %v", err) } if err := os.WriteFile(legacy, []byte(`{"activity":"other"}`), 0600); err != nil { t.Fatal(err) } migrated, err = MigrateLegacyFile(target, legacy) if err != nil { t.Fatalf("重复迁移失败: %v", err) } if migrated { t.Fatal("目标已存在时不应覆盖迁移") } got, err = os.ReadFile(target) if err != nil { t.Fatal(err) } if string(got) != string(content) { t.Fatalf("目标文件被意外覆盖: %q", got) } } func TestDefaultAppPathsUseInternalDataDir(t *testing.T) { dir := t.TempDir() t.Setenv("DOUYU_DATA_DIR", dir) t.Setenv("DOUYU_CONFIG", "") t.Setenv("DOUYU_USERS", "") t.Setenv("DOUYU_LOG_DIR", "") t.Setenv("DOUYU_SUCCESS_DIR", "") paths := DefaultAppPaths() if paths.DataDir != dir { t.Fatalf("DataDir = %q, want %q", paths.DataDir, dir) } if paths.ConfigFile != filepath.Join(dir, "config.json") { t.Fatalf("ConfigFile = %q", paths.ConfigFile) } if paths.AccountFile != filepath.Join(dir, "accounts.txt") { t.Fatalf("AccountFile = %q", paths.AccountFile) } if paths.LogDir != filepath.Join(dir, "logs") || paths.SuccessDir != filepath.Join(dir, "success_images") { t.Fatalf("应用数据子目录异常: logs=%q success=%q", paths.LogDir, paths.SuccessDir) } }