main
Raw Download raw file
  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}