preset_test.go
⎇
Raw
1package repository
2
3import (
4 "database/sql"
5 "testing"
6
7 "vidarchive/internal/config"
8 "vidarchive/internal/database"
9 "vidarchive/internal/models"
10)
11
12func setupTestDB(t *testing.T) *sql.DB {
13 cfg := &config.Config{
14 DBPath: ":memory:",
15 }
16 db, err := database.New(cfg)
17 if err != nil {
18 t.Fatalf("failed to create test db: %v", err)
19 }
20 return db
21}
22
23func TestPresetRepository(t *testing.T) {
24 db := setupTestDB(t)
25 defer db.Close()
26
27 repo := NewPresetRepository(db)
28
29 // Test Create
30 preset := &models.Preset{
31 Name: "Test Preset",
32 Description: "Test description",
33 Format: "best",
34 Quality: "1080",
35 }
36 if err := repo.Create(preset); err != nil {
37 t.Fatalf("failed to create preset: %v", err)
38 }
39 if preset.ID == 0 {
40 t.Error("expected preset ID to be set after create")
41 }
42
43 // Test GetByID
44 found, err := repo.GetByID(preset.ID)
45 if err != nil {
46 t.Fatalf("failed to get preset by ID: %v", err)
47 }
48 if found.Name != "Test Preset" {
49 t.Errorf("expected name 'Test Preset', got %q", found.Name)
50 }
51
52 // Test GetAll
53 all, err := repo.GetAll()
54 if err != nil {
55 t.Fatalf("failed to get all presets: %v", err)
56 }
57 if len(all) < 1 {
58 t.Errorf("expected at least 1 preset, got %d", len(all))
59 }
60
61 // Test Update
62 preset.Name = "Updated Preset"
63 if err := repo.Update(preset); err != nil {
64 t.Fatalf("failed to update preset: %v", err)
65 }
66 updated, _ := repo.GetByID(preset.ID)
67 if updated.Name != "Updated Preset" {
68 t.Errorf("expected updated name 'Updated Preset', got %q", updated.Name)
69 }
70
71 // Test Delete
72 if err := repo.Delete(preset.ID); err != nil {
73 t.Fatalf("failed to delete preset: %v", err)
74 }
75 _, err = repo.GetByID(preset.ID)
76 if err == nil {
77 t.Error("expected error when getting deleted preset")
78 }
79}
80
81func TestPresetRepositoryDefault(t *testing.T) {
82 db := setupTestDB(t)
83 defer db.Close()
84
85 repo := NewPresetRepository(db)
86
87 // Clear existing default from migration
88 repo.ClearDefault()
89
90 // Create default preset with unique name
91 preset := &models.Preset{
92 Name: "TestDefault",
93 IsDefault: true,
94 }
95 if err := repo.Create(preset); err != nil {
96 t.Fatalf("failed to create preset: %v", err)
97 }
98
99 // Test GetDefault
100 found, err := repo.GetDefault()
101 if err != nil {
102 t.Fatalf("failed to get default preset: %v", err)
103 }
104 if found.Name != "TestDefault" {
105 t.Errorf("expected default preset name 'TestDefault', got %q", found.Name)
106 }
107 if !found.IsDefault {
108 t.Error("expected preset to be default")
109 }
110
111 // Test ClearDefault
112 if err := repo.ClearDefault(); err != nil {
113 t.Fatalf("failed to clear default: %v", err)
114 }
115 _, err = repo.GetDefault()
116 if err == nil {
117 t.Error("expected no default preset after clearing")
118 }
119}
120
121// Save must keep "default" exclusive within a single transaction: promoting a
122// new default demotes the previous one, and there is never more than one.
123func TestPresetRepositorySaveExclusiveDefault(t *testing.T) {
124 db := setupTestDB(t)
125 defer db.Close()
126
127 repo := NewPresetRepository(db)
128 if err := repo.ClearDefault(); err != nil { // drop the migration-seeded default
129 t.Fatalf("clear default: %v", err)
130 }
131
132 a := &models.Preset{Name: "A", IsDefault: true}
133 if err := repo.Save(a); err != nil {
134 t.Fatalf("save A: %v", err)
135 }
136 if a.ID == 0 {
137 t.Error("expected ID to be set by Save")
138 }
139 b := &models.Preset{Name: "B", IsDefault: true}
140 if err := repo.Save(b); err != nil {
141 t.Fatalf("save B: %v", err)
142 }
143
144 assertSoleDefault := func(want string) {
145 t.Helper()
146 def, err := repo.GetDefault()
147 if err != nil {
148 t.Fatalf("get default: %v", err)
149 }
150 if def.Name != want {
151 t.Errorf("expected %q to be the default, got %q", want, def.Name)
152 }
153 all, err := repo.GetAll()
154 if err != nil {
155 t.Fatalf("get all: %v", err)
156 }
157 n := 0
158 for _, p := range all {
159 if p.IsDefault {
160 n++
161 }
162 }
163 if n != 1 {
164 t.Errorf("expected exactly one default, got %d", n)
165 }
166 }
167
168 // B was created as default last, so it wins.
169 assertSoleDefault("B")
170
171 // Updating A to default flips it back, still exclusively (a.ID is set, so Save
172 // routes to an update).
173 a.IsDefault = true
174 if err := repo.Save(a); err != nil {
175 t.Fatalf("save A update: %v", err)
176 }
177 assertSoleDefault("A")
178}
179