preset_test.go
⎇
Raw
1package service
2
3import (
4 "testing"
5
6 "vidarchive/internal/models"
7)
8
9func TestPresetServiceBuildArgs(t *testing.T) {
10 // Create a mock preset
11 preset := &models.Preset{
12 FormatMode: "preset",
13 Format: "best",
14 Quality: "1080",
15 ExtractAudio: true,
16 AudioFormat: "mp3",
17 EmbedSubs: true,
18 SubLangs: "en,de",
19 EmbedThumbnail: true,
20 EmbedMetadata: true,
21 WriteInfoJSON: true,
22 CustomFlags: "--no-playlist",
23 }
24
25 svc := &PresetService{}
26 args := svc.BuildArgs(preset, "", "")
27
28 // Check that expected args are present
29 hasFormat := false
30 hasAudio := false
31 hasSubs := false
32 hasOutput := false
33
34 for i := 0; i < len(args); i++ {
35 switch args[i] {
36 case "-f":
37 if i+1 < len(args) {
38 if args[i+1] == "best[height<=1080]/best" {
39 hasFormat = true
40 }
41 }
42 case "--extract-audio":
43 hasAudio = true
44 case "--embed-subs":
45 hasSubs = true
46 case "-o":
47 if i+1 < len(args) {
48 if args[i+1] == "item-%(autonumber)05d/%(title)s.%(ext)s" {
49 hasOutput = true
50 }
51 }
52 }
53 }
54
55 if !hasFormat {
56 t.Error("expected format arg with quality limit")
57 }
58 if !hasAudio {
59 t.Error("expected --extract-audio flag")
60 }
61 if !hasSubs {
62 t.Error("expected --embed-subs flag")
63 }
64 if hasOutput {
65 t.Error("output template should not be added by BuildArgs; it is enforced by the download service")
66 }
67}
68
69func TestPresetServiceBuildArgsWithOverride(t *testing.T) {
70 preset := &models.Preset{
71 Format: "best",
72 }
73
74 svc := &PresetService{}
75 args := svc.BuildArgs(preset, "22", "--verbose")
76
77 // Format override should take precedence
78 hasOverride := false
79 hasCustom := false
80
81 for i := 0; i < len(args); i++ {
82 if args[i] == "-f" && i+1 < len(args) && args[i+1] == "22" {
83 hasOverride = true
84 }
85 if args[i] == "--verbose" {
86 hasCustom = true
87 }
88 }
89
90 if !hasOverride {
91 t.Error("expected format override to be present")
92 }
93 if !hasCustom {
94 t.Error("expected custom flags to be present")
95 }
96}
97
98func TestPresetServiceBuildArgsWithComments(t *testing.T) {
99 preset := &models.Preset{
100 WriteComments: true,
101 CommentSort: "top",
102 MaxComments: 25,
103 CommentExtractorArgs: "youtube:player_client=web",
104 }
105
106 args := (&PresetService{}).BuildArgs(preset, "", "")
107 want := []string{"--write-info-json", "--write-comments", "--extractor-args", "youtube:comment_sort=top,max_comments=25", "--extractor-args", "youtube:player_client=web"}
108 for _, value := range want {
109 found := false
110 for _, arg := range args {
111 if arg == value {
112 found = true
113 break
114 }
115 }
116 if !found {
117 t.Errorf("BuildArgs missing %q: %v", value, args)
118 }
119 }
120}
121
122func TestPresetServiceIgnoresWhitespaceCommentSort(t *testing.T) {
123 preset := &models.Preset{WriteComments: true, CommentSort: " "}
124 flags := (&PresetService{}).EffectiveFlags(preset, "", "")
125 if contains(flags, "comment_sort=") {
126 t.Fatalf("whitespace-only comment sort emitted an empty argument: %q", flags)
127 }
128}
129
130func TestPresetServiceEffectiveFlags(t *testing.T) {
131 preset := &models.Preset{
132 FormatMode: "preset",
133 Format: "best",
134 Quality: "720",
135 }
136
137 svc := &PresetService{}
138 flags := svc.EffectiveFlags(preset, "", "")
139
140 if flags == "" {
141 t.Error("expected non-empty flags string")
142 }
143 if flags != "-f best[height<=720]/best" {
144 t.Errorf("expected '-f best[height<=720]/best', got %q", flags)
145 }
146}
147
148func TestPresetServiceEffectiveFlagsWithCustom(t *testing.T) {
149 preset := &models.Preset{
150 FormatMode: "preset",
151 Format: "best",
152 CustomFlags: "--no-warnings",
153 }
154
155 svc := &PresetService{}
156 flags := svc.EffectiveFlags(preset, "", "--verbose")
157
158 if flags == "" {
159 t.Error("expected non-empty flags string")
160 }
161 // Should contain both preset custom flags and passed custom flags
162 if !contains(flags, "--no-warnings") {
163 t.Errorf("expected flags to contain '--no-warnings', got %q", flags)
164 }
165 if !contains(flags, "--verbose") {
166 t.Errorf("expected flags to contain '--verbose', got %q", flags)
167 }
168}
169
170func contains(s, substr string) bool {
171 return len(s) >= len(substr) && (s == substr || len(s) > 0 && containsHelper(s, substr))
172}
173
174func containsHelper(s, substr string) bool {
175 for i := 0; i <= len(s)-len(substr); i++ {
176 if s[i:i+len(substr)] == substr {
177 return true
178 }
179 }
180 return false
181}
182