Path: blob/main/components/image-builder-bob/pkg/proxy/auth_test.go
2506 views
// Copyright (c) 2025 Gitpod GmbH. All rights reserved.1// Licensed under the GNU Affero General Public License (AGPL).2// See License.AGPL.txt in the project root for license information.34package proxy56import (7"testing"8)910func TestAuthorize(t *testing.T) {11type expectation struct {12user string13pass string14err string15}16tests := []struct {17name string18constructor func(string) (MapAuthorizer, error)19input string20testHost string21expected expectation22}{23{24name: "docker auth format - valid credentials",25constructor: NewAuthorizerFromDockerEnvVar,26input: `{"auths": {"registry.example.com": {"auth": "dXNlcjpwYXNz"}}}`, // base64(user:pass)27testHost: "registry.example.com",28expected: expectation{29user: "user",30pass: "pass",31},32},33{34name: "docker auth format - valid credentials - host with :443 port",35constructor: NewAuthorizerFromDockerEnvVar,36input: `{"auths": {"registry.example.com": {"auth": "dXNlcjpwYXNz"}}}`, // base64(user:pass)37testHost: "registry.example.com:443",38expected: expectation{39user: "user",40pass: "pass",41},42},43{44name: "docker auth format - invalid host",45constructor: NewAuthorizerFromDockerEnvVar,46input: `{"auths": {"registry.example.com": {"auth": "dXNlcjpwYXNz"}}}`,47testHost: "wrong.registry.com",48expected: expectation{49user: "",50pass: "",51},52},53{54name: "env var format - valid credentials",55constructor: NewAuthorizerFromEnvVar,56input: `{"registry.example.com": {"auth": "dXNlcjpwYXNz"}}`,57testHost: "registry.example.com",58expected: expectation{59user: "user",60pass: "pass",61},62},63{64name: "env var format - empty input",65constructor: NewAuthorizerFromEnvVar,66input: "",67testHost: "registry.example.com",68expected: expectation{69user: "",70pass: "",71},72},73{74name: "gitpod format - valid credentials",75constructor: NewAuthorizerFromEnvVar,76input: `{"registry.example.com": {"auth": "dXNlcjpwYXNz"}}`,77testHost: "registry.example.com",78expected: expectation{79user: "user",80pass: "pass",81},82},83{84name: "gitpod format - multiple hosts",85constructor: NewAuthorizerFromEnvVar,86input: `{"registry1.example.com": {"auth": "dXNlcjE6cGFzczEK"}, "registry2.example.com": {"auth": "dXNlcjI6cGFzczIK"}}`,87testHost: "registry2.example.com",88expected: expectation{89user: "user2",90pass: "pass2",91},92},93{94name: "gitpod format - invalid format",95constructor: NewAuthorizerFromEnvVar,96input: "invalid:format:with:toomany:colons",97testHost: "registry.example.com",98expected: expectation{99err: "invalid character 'i' looking for beginning of value",100},101},102{103name: "gitpod format - empty input",104constructor: NewAuthorizerFromEnvVar,105input: "",106testHost: "registry.example.com",107expected: expectation{108user: "",109pass: "",110},111},112{113name: "Docker Hub",114constructor: NewAuthorizerFromEnvVar,115input: `{"docker.io": {"auth": "dXNlcjpwYXNz"}}`,116testHost: "registry-1.docker.io",117expected: expectation{118user: "user",119pass: "pass",120},121},122{123name: "docker auth format - valid credentials - host with :5000 port",124constructor: NewAuthorizerFromDockerEnvVar,125input: `{"auths": {"registry.example.com:5000": {"auth": "dXNlcjpwYXNz"}}}`, // base64(user:pass)126testHost: "registry.example.com:5000",127expected: expectation{128user: "user",129pass: "pass",130},131},132}133134for _, tt := range tests {135t.Run(tt.name, func(t *testing.T) {136auth, err := tt.constructor(tt.input)137if err != nil {138if tt.expected.err == "" {139t.Errorf("Constructor failed: %s", err)140}141return142}143144actualUser, actualPassword, err := auth.Authorize(tt.testHost)145if (err != nil) != (tt.expected.err != "") {146t.Errorf("Authorize() error = %v, wantErr %v", err, tt.expected.err)147return148}149if actualUser != tt.expected.user {150t.Errorf("Authorize() actual user = %v, want %v", actualUser, tt.expected.user)151}152if actualPassword != tt.expected.pass {153t.Errorf("Authorize() actual password = %v, want %v", actualPassword, tt.expected.pass)154}155})156}157}158159160