Files
repospawner/internal/config/config_test.go
T
unkin-agent f1bcb8cd3a
ci/woodpecker/pr/build Pipeline was successful
ci/woodpecker/pr/test Pipeline was successful
ci/woodpecker/pr/pre-commit Pipeline was successful
Add the initial repospawner service
repospawner turns JSON new-repo requests into terraform-git pull requests
via kubernetes Jobs, follows those PRs to merge and optionally activates
the repository in Woodpecker.
2026-08-30 14:33:31 +10:00

90 lines
3.1 KiB
Go

package config
import (
"testing"
)
func TestLoadDefaults(t *testing.T) {
cfg, err := Load()
if err != nil {
t.Fatalf("Load: %v", err)
}
for _, tc := range []struct{ name, got, want string }{
{"Listen", cfg.Listen, ":8080"},
{"Namespace", cfg.Namespace, "repospawner"},
{"JobServiceAccount", cfg.JobServiceAccount, "repospawner"},
{"GiteaURL", cfg.GiteaURL, "https://git.unkin.net"},
{"TFGitRepo", cfg.TFGitRepo, "unkin/terraform-git"},
{"VaultAddr", cfg.VaultAddr, "https://vault.service.consul:8200"},
{"VaultK8sMount", cfg.VaultK8sMount, "k8s/au/syd1"},
{"VaultK8sRole", cfg.VaultK8sRole, "repospawner"},
{"GiteaCredsPath", cfg.GiteaCredsPath, "gitea/creds/repospawner"},
{"WoodpeckerServer", cfg.WoodpeckerServer, "https://ci.k8s.syd1.au.unkin.net"},
{"WoodpeckerTokenFile", cfg.WoodpeckerTokenFile, "/etc/repospawner/woodpecker/token"},
{"GroupsHeader", cfg.GroupsHeader, "X-Forwarded-Groups"},
} {
if tc.got != tc.want {
t.Errorf("%s = %q, want %q", tc.name, tc.got, tc.want)
}
}
if len(cfg.AllowedGroups) != 1 {
t.Errorf("AllowedGroups = %v", cfg.AllowedGroups)
}
}
func TestLoadFailsClosed(t *testing.T) {
cases := []struct {
name string
env map[string]string
}{
{name: "empty group list", env: map[string]string{"REPOSPAWNER_ALLOWED_GROUPS": " , ,"}},
{name: "blank groups header", env: map[string]string{"REPOSPAWNER_GROUPS_HEADER": " "}},
{name: "non-http gitea url", env: map[string]string{"GITEA_URL": "git.unkin.net"}},
{name: "non-http vault addr", env: map[string]string{"VAULT_ADDR": "vault.service.consul:8200"}},
{name: "non-http woodpecker", env: map[string]string{"WOODPECKER_SERVER": "ci.unkin.net"}},
{name: "bad tfgit repo", env: map[string]string{"REPOSPAWNER_TFGIT_REPO": "terraform-git"}},
{name: "nested tfgit repo", env: map[string]string{"REPOSPAWNER_TFGIT_REPO": "a/b/c"}},
{name: "blank namespace", env: map[string]string{"REPOSPAWNER_NAMESPACE": " "}},
{name: "blank vault role", env: map[string]string{"REPOSPAWNER_VAULT_K8S_ROLE": " "}},
{name: "blank creds path", env: map[string]string{"REPOSPAWNER_GITEA_CREDS_PATH": " "}},
}
for _, tc := range cases {
t.Run(tc.name, func(t *testing.T) {
for k, v := range tc.env {
t.Setenv(k, v)
}
if _, err := Load(); err == nil {
t.Fatalf("Load() with %v should have failed", tc.env)
}
})
}
}
func TestSplitRepo(t *testing.T) {
owner, name, err := SplitRepo(" unkin/terraform-git ")
if err != nil || owner != "unkin" || name != "terraform-git" {
t.Fatalf("SplitRepo = %q %q %v", owner, name, err)
}
for _, bad := range []string{"", "unkin", "/name", "owner/", "a/b/c"} {
if _, _, err := SplitRepo(bad); err == nil {
t.Errorf("SplitRepo(%q) should have failed", bad)
}
}
}
func TestParseGroups(t *testing.T) {
got := ParseGroups("a, b;c\nd e")
want := []string{"a", "b", "c", "d", "e"}
if len(got) != len(want) {
t.Fatalf("ParseGroups = %v, want %v", got, want)
}
for i := range want {
if got[i] != want[i] {
t.Fatalf("ParseGroups = %v, want %v", got, want)
}
}
if len(ParseGroups(" ,, ")) != 0 {
t.Errorf("ParseGroups of separators only should be empty")
}
}