main
1package config
2
3import (
4 "errors"
5 "os"
6 "path/filepath"
7 "testing"
8 "time"
9)
10
11func TestValidate(t *testing.T) {
12 validCfg := &Config{
13 Host: "https://protect.local",
14 Username: "admin",
15 Password: "secret",
16 Camera: "front-door",
17 Date: time.Now(),
18 OutDir: "/tmp/out",
19 }
20
21 err := validCfg.Validate()
22 if err != nil {
23 t.Errorf("expected valid config, got error: %v", err)
24 }
25}
26
27func TestValidate_MissingFields(t *testing.T) {
28 tests := []struct {
29 name string
30 modify func(*Config)
31 expected error
32 }{
33 {
34 name: "missing host",
35 modify: func(c *Config) { c.Host = "" },
36 expected: ErrMissingHost,
37 },
38 {
39 name: "missing username",
40 modify: func(c *Config) { c.Username = "" },
41 expected: ErrMissingCredentials,
42 },
43 {
44 name: "missing password",
45 modify: func(c *Config) { c.Password = "" },
46 expected: ErrMissingCredentials,
47 },
48 {
49 name: "missing camera",
50 modify: func(c *Config) { c.Camera = "" },
51 expected: ErrMissingCamera,
52 },
53 {
54 name: "missing date",
55 modify: func(c *Config) { c.Date = time.Time{} },
56 expected: ErrMissingDate,
57 },
58 {
59 name: "missing out dir",
60 modify: func(c *Config) { c.OutDir = "" },
61 expected: ErrMissingOutDir,
62 },
63 }
64
65 for _, tc := range tests {
66 t.Run(tc.name, func(t *testing.T) {
67 cfg := &Config{
68 Host: "https://protect.local",
69 Username: "admin",
70 Password: "secret",
71 Camera: "front-door",
72 Date: time.Now(),
73 OutDir: "/tmp/out",
74 }
75 tc.modify(cfg)
76
77 err := cfg.Validate()
78 if !errors.Is(err, tc.expected) {
79 t.Errorf("expected %v, got %v", tc.expected, err)
80 }
81 })
82 }
83}
84
85func TestParseDate(t *testing.T) {
86 tests := []struct {
87 input string
88 valid bool
89 expected string
90 }{
91 {"2024-01-15", true, "2024-01-15"},
92 {"2024-12-31", true, "2024-12-31"},
93 {"invalid", false, ""},
94 {"01-15-2024", false, ""},
95 {"2024/01/15", false, ""},
96 }
97
98 for _, tc := range tests {
99 result, err := ParseDate(tc.input)
100 if tc.valid {
101 if err != nil {
102 t.Errorf("ParseDate(%q) unexpected error: %v", tc.input, err)
103 }
104 if result.Format("2006-01-02") != tc.expected {
105 t.Errorf("ParseDate(%q) = %v, want %v", tc.input, result.Format("2006-01-02"), tc.expected)
106 }
107 } else {
108 if err == nil {
109 t.Errorf("ParseDate(%q) expected error, got nil", tc.input)
110 }
111 }
112 }
113}
114
115func TestLoadPasswordFromFile(t *testing.T) {
116 // Create temp file with password
117 dir := t.TempDir()
118 passFile := filepath.Join(dir, "password")
119 err := os.WriteFile(passFile, []byte(" my-secret-pass \n"), 0600)
120 if err != nil {
121 t.Fatal(err)
122 }
123
124 cfg := New()
125 err = cfg.LoadPasswordFromFile(passFile)
126 if err != nil {
127 t.Errorf("LoadPasswordFromFile error: %v", err)
128 }
129 if cfg.Password != "my-secret-pass" {
130 t.Errorf("expected 'my-secret-pass', got %q", cfg.Password)
131 }
132}