Files

117 lines
2.8 KiB
Go

package clientid
import (
"encoding/json"
"os"
"path/filepath"
"testing"
)
func TestResolveKeepsExplicitID(t *testing.T) {
id, persisted, err := Resolve("explicit", nil)
if err != nil || id != "explicit" || !persisted {
t.Fatalf("Resolve() = %q, %v, %v", id, persisted, err)
}
}
func TestResolveReadsFirstValidFile(t *testing.T) {
dir := t.TempDir()
broken := filepath.Join(dir, "broken.json")
good := filepath.Join(dir, fileName)
if err := os.WriteFile(broken, []byte("{not json"), 0o600); err != nil {
t.Fatal(err)
}
if err := os.WriteFile(good, []byte(`{"client_id":"stored"}`), 0o600); err != nil {
t.Fatal(err)
}
id, persisted, err := Resolve("", []string{broken, good})
if err != nil || id != "stored" || !persisted {
t.Fatalf("Resolve() = %q, %v, %v", id, persisted, err)
}
}
func TestResolveOverwritesFileWithEmptyID(t *testing.T) {
empty := filepath.Join(t.TempDir(), fileName)
if err := os.WriteFile(empty, []byte(`{"client_id":""}`), 0o600); err != nil {
t.Fatal(err)
}
id, persisted, err := Resolve("", []string{empty})
if err != nil || !persisted {
t.Fatalf("Resolve() = %q, %v, %v", id, persisted, err)
}
if len(id) != 32 {
t.Fatalf("generated id = %q, want 32 hex chars", id)
}
assertStoredID(t, empty, id)
}
func TestResolveCreatesMissingDirectory(t *testing.T) {
target := filepath.Join(t.TempDir(), "nested", "dir", fileName)
id, persisted, err := Resolve("", []string{target})
if err != nil || !persisted {
t.Fatalf("Resolve() = %q, %v, %v", id, persisted, err)
}
assertStoredID(t, target, id)
}
func assertStoredID(t *testing.T, path, want string) {
t.Helper()
b, err := os.ReadFile(path)
if err != nil {
t.Fatalf("id not persisted: %v", err)
}
var f fileFormat
if json.Unmarshal(b, &f) != nil || f.ClientID != want {
t.Fatalf("persisted file = %s, want client_id %q", b, want)
}
}
func TestResolveGeneratedIDIsStableAcrossCalls(t *testing.T) {
paths := []string{filepath.Join(t.TempDir(), fileName)}
first, _, err := Resolve("", paths)
if err != nil {
t.Fatal(err)
}
second, _, err := Resolve("", paths)
if err != nil {
t.Fatal(err)
}
if first != second {
t.Fatalf("id rotated between calls: %q != %q", first, second)
}
}
func TestResolveReportsUnpersistedID(t *testing.T) {
id, persisted, err := Resolve("", nil)
if err != nil {
t.Fatal(err)
}
if persisted {
t.Fatal("persisted = true without any writable path")
}
if len(id) != 32 {
t.Fatalf("generated id = %q, want 32 hex chars", id)
}
}
func TestDefaultPathsAreUniqueAndNamed(t *testing.T) {
paths := DefaultPaths()
if len(paths) == 0 {
t.Fatal("DefaultPaths() is empty")
}
seen := map[string]bool{}
for _, p := range paths {
if filepath.Base(p) != fileName {
t.Fatalf("path %q does not end with %q", p, fileName)
}
if seen[p] {
t.Fatalf("duplicate path %q", p)
}
seen[p] = true
}
}