github.com/kubeshop/testkube@v1.17.23/pkg/skopeo/client_test.go (about)

     1  package skopeo
     2  
     3  import (
     4  	"testing"
     5  
     6  	"github.com/stretchr/testify/assert"
     7  	corev1 "k8s.io/api/core/v1"
     8  	metav1 "k8s.io/apimachinery/pkg/apis/meta/v1"
     9  )
    10  
    11  func TestParseSecretData(t *testing.T) {
    12  	t.Parallel()
    13  
    14  	t.Run("parse docker config base auth", func(t *testing.T) {
    15  		t.Parallel()
    16  
    17  		secret := corev1.Secret{
    18  			Data: map[string][]byte{".dockerconfigjson": []byte("{\"auths\": {\"https://index.docker.io/v1/\": {\"auth\": \"ZG9ja2VyLXVzZXJuYW1lOnlvdXItcmVhbGx5LXJlYWxseS1sb25nLWF1dGgta2V5\"}}}")},
    19  		}
    20  
    21  		out, err := ParseSecretData([]corev1.Secret{secret}, "https://index.docker.io/v1/")
    22  
    23  		assert.Equal(t, 1, len(out))
    24  		assert.Equal(t, "docker-username", out[0].Username)
    25  		assert.Equal(t, "your-really-really-long-auth-key", out[0].Password)
    26  		assert.NoError(t, err)
    27  	})
    28  
    29  	t.Run("parse docker config map", func(t *testing.T) {
    30  		t.Parallel()
    31  
    32  		secret := corev1.Secret{
    33  			Data: map[string][]byte{".dockercfg": []byte("{\"https://index.docker.io/v1/\": {\"auth\": \"ZG9ja2VyLXVzZXJuYW1lOnlvdXItcmVhbGx5LXJlYWxseS1sb25nLWF1dGgta2V5\"}}")},
    34  		}
    35  
    36  		out, err := ParseSecretData([]corev1.Secret{secret}, "https://index.docker.io/v1/")
    37  
    38  		assert.Equal(t, 1, len(out))
    39  		assert.Equal(t, "docker-username", out[0].Username)
    40  		assert.Equal(t, "your-really-really-long-auth-key", out[0].Password)
    41  		assert.NoError(t, err)
    42  	})
    43  
    44  	t.Run("parse docker config plain credentials", func(t *testing.T) {
    45  		t.Parallel()
    46  
    47  		secret := corev1.Secret{
    48  			Data: map[string][]byte{".dockerconfigjson": []byte("{\"auths\": {\"https://index.docker.io/v1/\": {\"username\": \"plainuser\", \"password\": \"plainpass\"}}}")},
    49  		}
    50  
    51  		out, err := ParseSecretData([]corev1.Secret{secret}, "https://index.docker.io/v1/")
    52  
    53  		assert.Equal(t, 1, len(out))
    54  		assert.Equal(t, "plainuser", out[0].Username)
    55  		assert.Equal(t, "plainpass", out[0].Password)
    56  		assert.NoError(t, err)
    57  	})
    58  
    59  	t.Run("parse docker config missed registry", func(t *testing.T) {
    60  		t.Parallel()
    61  
    62  		secret := corev1.Secret{
    63  			ObjectMeta: metav1.ObjectMeta{
    64  				Name: "dockercfg",
    65  			},
    66  
    67  			Data: map[string][]byte{".dockerconfigjson": []byte("{\"auths\": {\"https://index.docker.io/v1/\": {\"username\": \"plainuser\", \"password\": \"plainpass\"}}}")},
    68  		}
    69  
    70  		out, err := ParseSecretData([]corev1.Secret{secret}, "fake")
    71  
    72  		assert.Nil(t, out)
    73  		assert.EqualError(t, err, "secret dockercfg is not defined for registry: fake")
    74  	})
    75  
    76  	t.Run("parse docker config missed data", func(t *testing.T) {
    77  		t.Parallel()
    78  
    79  		secret := corev1.Secret{
    80  			ObjectMeta: metav1.ObjectMeta{
    81  				Name: "dockercfg",
    82  			},
    83  		}
    84  
    85  		out, err := ParseSecretData([]corev1.Secret{secret}, "fake")
    86  
    87  		assert.Nil(t, out)
    88  		assert.EqualError(t, err, "imagePullSecret dockercfg contains neither .dockercfg nor .dockerconfigjson")
    89  	})
    90  
    91  	t.Run("parse docker config wrong auth", func(t *testing.T) {
    92  		t.Parallel()
    93  
    94  		secret := corev1.Secret{
    95  			Data: map[string][]byte{".dockerconfigjson": []byte("{\"auths\": {\"https://index.docker.io/v1/\": {\"auth\": \"12345\"}}}")},
    96  		}
    97  
    98  		out, err := ParseSecretData([]corev1.Secret{secret}, "https://index.docker.io/v1/")
    99  
   100  		assert.Nil(t, out)
   101  		assert.ErrorContains(t, err, "illegal base64 data")
   102  	})
   103  
   104  }
   105  
   106  // TestExtractRegistry uses table-driven tests to validate the extractRegistry function.
   107  func TestExtractRegistry(t *testing.T) {
   108  	tests := []struct {
   109  		name     string
   110  		image    string
   111  		expected string
   112  	}{
   113  		{"DockerHub short", "nginx:latest", "https://index.docker.io/v1/"},
   114  		{"DockerHub long", "library/nginx:latest", "https://index.docker.io/v1/"},
   115  		{"GCR", "gcr.io/google-containers/busybox:latest", "gcr.io"},
   116  		{"ECR", "123456789012.dkr.ecr.us-east-1.amazonaws.com/my-application:latest", "123456789012.dkr.ecr.us-east-1.amazonaws.com"},
   117  		{"MCR", "mcr.microsoft.com/dotnet/core/sdk:3.1", "mcr.microsoft.com"},
   118  		{"Quay", "quay.io/bitnami/nginx:latest", "quay.io"},
   119  		{"Custom port", "localhost:5000/myimage:latest", "localhost:5000"},
   120  		{"No tag", "myregistry.com/myimage", "myregistry.com"},
   121  		{"Only image", "myimage", "https://index.docker.io/v1/"},
   122  	}
   123  
   124  	for _, tc := range tests {
   125  		tc := tc
   126  		t.Run(tc.name, func(t *testing.T) {
   127  			got := extractRegistry(tc.image)
   128  			assert.Equal(t, tc.expected, got)
   129  		})
   130  	}
   131  }