feat(config): GITEA_URL/GITEA_KEY env + 0600 env-file loading
This commit is contained in:
@@ -0,0 +1,107 @@
|
||||
package config
|
||||
|
||||
import (
|
||||
"os"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func writeFile(t *testing.T, name string, mode os.FileMode, content string) string {
|
||||
t.Helper()
|
||||
path := filepath.Join(t.TempDir(), name)
|
||||
if err := os.WriteFile(path, []byte(content), mode); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
return path
|
||||
}
|
||||
|
||||
func TestLoadEnvOnly(t *testing.T) {
|
||||
t.Setenv("GITEA_URL", "https://git.example/")
|
||||
t.Setenv("GITEA_KEY", "k1")
|
||||
cfg, src, err := Load("")
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
if cfg.BaseURL != "https://git.example" {
|
||||
t.Errorf("BaseURL = %q, want trailing slash trimmed", cfg.BaseURL)
|
||||
}
|
||||
if cfg.Token != "k1" {
|
||||
t.Errorf("Token = %q", cfg.Token)
|
||||
}
|
||||
if src.Env == "" {
|
||||
t.Errorf("source env = %q, want a key name", src.Env)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadFileOnly(t *testing.T) {
|
||||
path := writeFile(t, "env", 0o600, "GITEA_URL=https://g.example\nGITEA_KEY=k2\n")
|
||||
cfg, _, err := Load(path)
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
if cfg.BaseURL != "https://g.example" || cfg.Token != "k2" {
|
||||
t.Errorf("cfg = %+v", cfg)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadEnvWinsOverFile(t *testing.T) {
|
||||
t.Setenv("GITEA_KEY", "envkey")
|
||||
path := writeFile(t, "env", 0o600, "GITEA_URL=https://g.example\nGITEA_KEY=filekey\n")
|
||||
cfg, src, err := Load(path)
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
if cfg.Token != "envkey" {
|
||||
t.Errorf("Token = %q, want env value to win", cfg.Token)
|
||||
}
|
||||
if src.File != "" && src.Env != "GITEA_KEY" {
|
||||
t.Errorf("source = %+v", src)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadRejectsLooseFile(t *testing.T) {
|
||||
path := writeFile(t, "env", 0o644, "GITEA_URL=https://g.example\nGITEA_KEY=k\n")
|
||||
_, _, err := Load(path)
|
||||
if err == nil || !strings.Contains(err.Error(), "insecure mode") {
|
||||
t.Fatalf("err = %v, want insecure-mode rejection", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadMissingEverything(t *testing.T) {
|
||||
_, _, err := Load(filepath.Join(t.TempDir(), "absent"))
|
||||
if err == nil || !strings.Contains(err.Error(), "GITEA_URL") {
|
||||
t.Fatalf("err = %v, want guidance naming GITEA_URL/GITEA_KEY", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadKeyAbsent(t *testing.T) {
|
||||
t.Setenv("GITEA_URL", "https://g.example")
|
||||
path := writeFile(t, "env", 0o600, "# nothing useful\n")
|
||||
_, _, err := Load(path)
|
||||
if err == nil || !strings.Contains(err.Error(), "GITEA_KEY") {
|
||||
t.Fatalf("err = %v, want GITEA_KEY named", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadMalformedLineReportsNumberOnly(t *testing.T) {
|
||||
path := writeFile(t, "env", 0o600, "GITEA_URL=https://g.example\nGITEA_KEY=sekrit-value\nBROKEN LINE HERE\n")
|
||||
_, _, err := Load(path)
|
||||
if err == nil || !strings.Contains(err.Error(), "line 3") {
|
||||
t.Fatalf("err = %v, want line-number-only diagnostic", err)
|
||||
}
|
||||
if err != nil && strings.Contains(err.Error(), "sekrit-value") {
|
||||
t.Fatalf("err = %v leaks file contents", err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestLoadQuotedAndExported(t *testing.T) {
|
||||
path := writeFile(t, "env", 0o600, "export GITEA_URL=\"https://g.example\"\nexport GITEA_KEY='k3'\n")
|
||||
cfg, _, err := Load(path)
|
||||
if err != nil {
|
||||
t.Fatalf("Load: %v", err)
|
||||
}
|
||||
if cfg.BaseURL != "https://g.example" || cfg.Token != "k3" {
|
||||
t.Errorf("cfg = %+v, want quotes stripped", cfg)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user