f1bcb8cd3a
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.
90 lines
3.1 KiB
Go
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")
|
|
}
|
|
}
|