diff --git a/internal/config/config_test.go b/internal/config/config_test.go new file mode 100644 index 0000000..c3c7f7c --- /dev/null +++ b/internal/config/config_test.go @@ -0,0 +1,113 @@ +package config + +import ( + "os" + "path/filepath" + "testing" + + "git.eeqj.de/sneak/smartconfig" +) + +func TestGetStringSlice_YAMLList(t *testing.T) { + // Create a temp config file with YAML list format + tmpDir := t.TempDir() + configPath := filepath.Join(tmpDir, "config.yml") + + yamlContent := ` +whitelist_hosts: + - static.sneak.cloud + - sneak.berlin + - s3.sneak.cloud +` + err := os.WriteFile(configPath, []byte(yamlContent), 0644) + if err != nil { + t.Fatalf("failed to write test config: %v", err) + } + + // Load config using smartconfig + sc, err := loadTestConfig(configPath) + if err != nil { + t.Fatalf("failed to load config: %v", err) + } + + // Test that getStringSlice correctly parses YAML list + hosts := getStringSlice(sc, "whitelist_hosts") + + if len(hosts) != 3 { + t.Errorf("expected 3 hosts, got %d: %v", len(hosts), hosts) + } + + expected := []string{"static.sneak.cloud", "sneak.berlin", "s3.sneak.cloud"} + for i, want := range expected { + if i >= len(hosts) { + t.Errorf("missing host at index %d: want %q", i, want) + continue + } + if hosts[i] != want { + t.Errorf("host[%d] = %q, want %q", i, hosts[i], want) + } + } +} + +func TestGetStringSlice_CommaSeparated(t *testing.T) { + // Test backwards compatibility with comma-separated string + tmpDir := t.TempDir() + configPath := filepath.Join(tmpDir, "config.yml") + + yamlContent := `whitelist_hosts: "static.sneak.cloud, sneak.berlin, s3.sneak.cloud"` + + err := os.WriteFile(configPath, []byte(yamlContent), 0644) + if err != nil { + t.Fatalf("failed to write test config: %v", err) + } + + sc, err := loadTestConfig(configPath) + if err != nil { + t.Fatalf("failed to load config: %v", err) + } + + hosts := getStringSlice(sc, "whitelist_hosts") + + if len(hosts) != 3 { + t.Errorf("expected 3 hosts, got %d: %v", len(hosts), hosts) + } + + expected := []string{"static.sneak.cloud", "sneak.berlin", "s3.sneak.cloud"} + for i, want := range expected { + if i >= len(hosts) { + t.Errorf("missing host at index %d: want %q", i, want) + continue + } + if hosts[i] != want { + t.Errorf("host[%d] = %q, want %q", i, hosts[i], want) + } + } +} + +func TestGetStringSlice_Empty(t *testing.T) { + tmpDir := t.TempDir() + configPath := filepath.Join(tmpDir, "config.yml") + + yamlContent := `port: 8080` + + err := os.WriteFile(configPath, []byte(yamlContent), 0644) + if err != nil { + t.Fatalf("failed to write test config: %v", err) + } + + sc, err := loadTestConfig(configPath) + if err != nil { + t.Fatalf("failed to load config: %v", err) + } + + hosts := getStringSlice(sc, "whitelist_hosts") + + if hosts != nil && len(hosts) != 0 { + t.Errorf("expected nil or empty slice, got %v", hosts) + } +} + +// loadTestConfig is a helper to load a config file for testing +func loadTestConfig(path string) (*smartconfig.Config, error) { + return smartconfig.NewFromConfigPath(path) +}