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.Save(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.Save(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 // Create default preset with unique name
88 preset := &models.Preset{
89 Name: "TestDefault",
90 IsDefault: true,
91 }
92 if err := repo.Save(preset); err != nil {
93 t.Fatalf("failed to create preset: %v", err)
94 }
95
96 // Test GetDefault
97 found, err := repo.GetDefault()
98 if err != nil {
99 t.Fatalf("failed to get default preset: %v", err)
100 }
101 if found.Name != "TestDefault" {
102 t.Errorf("expected default preset name 'TestDefault', got %q", found.Name)
103 }
104 if !found.IsDefault {
105 t.Error("expected preset to be default")
106 }
107}
108
109// Save must keep "default" exclusive within a single transaction: promoting a
110// new default demotes the previous one, and there is never more than one.
111func TestPresetRepositorySaveExclusiveDefault(t *testing.T) {
112 db := setupTestDB(t)
113 defer db.Close()
114
115 repo := NewPresetRepository(db)
116
117 a := &models.Preset{Name: "A", IsDefault: true}
118 if err := repo.Save(a); err != nil {
119 t.Fatalf("save A: %v", err)
120 }
121 if a.ID == 0 {
122 t.Error("expected ID to be set by Save")
123 }
124 b := &models.Preset{Name: "B", IsDefault: true}
125 if err := repo.Save(b); err != nil {
126 t.Fatalf("save B: %v", err)
127 }
128
129 assertSoleDefault := func(want string) {
130 t.Helper()
131 def, err := repo.GetDefault()
132 if err != nil {
133 t.Fatalf("get default: %v", err)
134 }
135 if def.Name != want {
136 t.Errorf("expected %q to be the default, got %q", want, def.Name)
137 }
138 all, err := repo.GetAll()
139 if err != nil {
140 t.Fatalf("get all: %v", err)
141 }
142 n := 0
143 for _, p := range all {
144 if p.IsDefault {
145 n++
146 }
147 }
148 if n != 1 {
149 t.Errorf("expected exactly one default, got %d", n)
150 }
151 }
152
153 // B was created as default last, so it wins.
154 assertSoleDefault("B")
155
156 // Updating A to default flips it back, still exclusively (a.ID is set, so Save
157 // routes to an update).
158 a.IsDefault = true
159 if err := repo.Save(a); err != nil {
160 t.Fatalf("save A update: %v", err)
161 }
162 assertSoleDefault("A")
163}
164