1package auto
2
3import (
4 "testing"
5
6 "github.com/stretchr/testify/assert"
7)
8
9func TestMatchesDomainAllowlist(t *testing.T) {
10 tests := []struct {
11 name string
12 domain string
13 patterns []string
14 want bool
15 }{
16 {name: "exact match", domain: "app.example.com", patterns: []string{"app.example.com"}, want: true},
17 {name: "no match", domain: "app.example.com", patterns: []string{"api.example.com"}, want: false},
18 {name: "wildcard match", domain: "app.example.com", patterns: []string{"*.example.com"}, want: true},
19 {name: "wildcard no match on root", domain: "example.com", patterns: []string{"*.example.com"}, want: false},
20 {name: "wildcard matches one level only", domain: "api.app.example.com", patterns: []string{"*.example.com"}, want: false},
21 {name: "empty allowlist", domain: "app.example.com", patterns: nil, want: false},
22 {name: "case insensitive", domain: "App.Example.Com", patterns: []string{"APP.EXAMPLE.COM"}, want: true},
23 {name: "multiple patterns", domain: "api.example.com", patterns: []string{"foo.com", "*.example.com"}, want: true},
24 {name: "star allows all", domain: "anything.example.com", patterns: []string{"*"}, want: true},
25 {name: "empty pattern skipped", domain: "app.example.com", patterns: []string{"", "app.example.com"}, want: true},
26 {name: "whitespace trimmed in pattern", domain: "app.example.com", patterns: []string{" app.example.com "}, want: true},
27 }
28
29 for _, tt := range tests {
30 t.Run(tt.name, func(t *testing.T) {
31 assert.Equal(t, tt.want, MatchesDomainAllowlist(tt.domain, tt.patterns))
32 })
33 }
34}
35
36func TestExtractRepoName(t *testing.T) {
37 tests := []struct {
38 name string
39 imageRef string
40 registryDomain string
41 want string
42 }{
43 {name: "simple tag", imageRef: "myapp:latest", want: "myapp"},
44 {name: "version tag", imageRef: "myapp:v2.0.0", want: "myapp"},
45 {name: "digest", imageRef: "myapp@sha256:abc123", want: "myapp"},
46 {name: "strip registry", imageRef: "registry.example.com/myapp:latest", registryDomain: "registry.example.com", want: "myapp"},
47 {name: "org image", imageRef: "org/myapp:latest", want: "org/myapp"},
48 {name: "registry org image", imageRef: "registry.example.com/org/myapp:latest", registryDomain: "registry.example.com", want: "org/myapp"},
49 {name: "lowercase", imageRef: "MyApp:Latest", want: "myapp"},
50 {name: "no tag no digest", imageRef: "myapp", want: "myapp"},
51 {name: "empty registry domain", imageRef: "myapp:latest", registryDomain: "", want: "myapp"},
52 }
53
54 for _, tt := range tests {
55 t.Run(tt.name, func(t *testing.T) {
56 assert.Equal(t, tt.want, ExtractRepoName(tt.imageRef, tt.registryDomain))
57 })
58 }
59}
60
61func TestExtractRepoName_TreatsLegacyAndCurrentGordonRegistryHostsAsSameRepo(t *testing.T) {
62 current := "new-registry.example.com"
63 legacy := []string{"old-registry.example.com"}
64
65 oldRepo := ExtractRepoName("old-registry.example.com/app:latest", current, legacy...)
66 newRepo := ExtractRepoName("new-registry.example.com/app:latest", current, legacy...)
67
68 assert.Equal(t, "app", oldRepo)
69 assert.Equal(t, oldRepo, newRepo)
70}
71
72func TestExtractRepoName_HandlesPortsAndDigests(t *testing.T) {
73 assert.Equal(t, "org/app", ExtractRepoName("new-registry.example.com:5000/org/app:latest", "new-registry.example.com:5000"))
74 assert.Equal(t, "org/app", ExtractRepoName("old-registry.example.com:5001/org/app@sha256:deadbeef", "new-registry.example.com:5000", "old-registry.example.com:5001"))
75}