feat: add private Docker registry authentication for base images
All checks were successful
Check / check (pull_request) Successful in 3m34s
All checks were successful
Check / check (pull_request) Successful in 3m34s
Add per-app registry credentials that are passed to Docker during image builds, allowing apps to use base images from private registries. - New registry_credentials table (migration 007) - RegistryCredential model with full CRUD operations - Docker client passes AuthConfigs to ImageBuild when credentials exist - Deploy service fetches app registry credentials before builds - Web UI section for managing registry credentials (add/edit/delete) - Comprehensive unit tests for model and auth config builder - README updated to list the feature
This commit is contained in:
96
internal/docker/auth_test.go
Normal file
96
internal/docker/auth_test.go
Normal file
@@ -0,0 +1,96 @@
|
||||
package docker //nolint:testpackage // tests unexported buildAuthConfigs
|
||||
|
||||
import (
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestBuildAuthConfigsEmpty(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
result := buildAuthConfigs(nil)
|
||||
if len(result) != 0 {
|
||||
t.Errorf("expected empty map, got %d entries", len(result))
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuildAuthConfigsSingle(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
auths := []RegistryAuth{
|
||||
{
|
||||
Registry: "registry.example.com",
|
||||
Username: "user",
|
||||
Password: "pass",
|
||||
},
|
||||
}
|
||||
|
||||
result := buildAuthConfigs(auths)
|
||||
|
||||
if len(result) != 1 {
|
||||
t.Fatalf("expected 1 entry, got %d", len(result))
|
||||
}
|
||||
|
||||
cfg, ok := result["registry.example.com"]
|
||||
if !ok {
|
||||
t.Fatal("expected registry.example.com key")
|
||||
}
|
||||
|
||||
if cfg.Username != "user" {
|
||||
t.Errorf("expected username 'user', got %q", cfg.Username)
|
||||
}
|
||||
|
||||
if cfg.Password != "pass" {
|
||||
t.Errorf("expected password 'pass', got %q", cfg.Password)
|
||||
}
|
||||
|
||||
if cfg.ServerAddress != "registry.example.com" {
|
||||
t.Errorf("expected server address 'registry.example.com', got %q", cfg.ServerAddress)
|
||||
}
|
||||
}
|
||||
|
||||
func TestBuildAuthConfigsMultiple(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
auths := []RegistryAuth{
|
||||
{Registry: "ghcr.io", Username: "ghuser", Password: "ghtoken"},
|
||||
{Registry: "docker.io", Username: "dkuser", Password: "dktoken"},
|
||||
}
|
||||
|
||||
result := buildAuthConfigs(auths)
|
||||
|
||||
if len(result) != 2 {
|
||||
t.Fatalf("expected 2 entries, got %d", len(result))
|
||||
}
|
||||
|
||||
ghcr := result["ghcr.io"]
|
||||
if ghcr.Username != "ghuser" || ghcr.Password != "ghtoken" {
|
||||
t.Errorf("unexpected ghcr.io config: %+v", ghcr)
|
||||
}
|
||||
|
||||
dkr := result["docker.io"]
|
||||
if dkr.Username != "dkuser" || dkr.Password != "dktoken" {
|
||||
t.Errorf("unexpected docker.io config: %+v", dkr)
|
||||
}
|
||||
}
|
||||
|
||||
func TestRegistryAuthStruct(t *testing.T) {
|
||||
t.Parallel()
|
||||
|
||||
auth := RegistryAuth{
|
||||
Registry: "registry.example.com",
|
||||
Username: "testuser",
|
||||
Password: "testpass",
|
||||
}
|
||||
|
||||
if auth.Registry != "registry.example.com" {
|
||||
t.Errorf("expected registry 'registry.example.com', got %q", auth.Registry)
|
||||
}
|
||||
|
||||
if auth.Username != "testuser" {
|
||||
t.Errorf("expected username 'testuser', got %q", auth.Username)
|
||||
}
|
||||
|
||||
if auth.Password != "testpass" {
|
||||
t.Errorf("expected password 'testpass', got %q", auth.Password)
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user