0
0
Fork 0
mirror of https://github.com/crazy-max/diun.git synced 2025-04-10 13:57:31 +00:00

test: use white-box testing

This commit is contained in:
CrazyMax 2023-09-16 10:30:36 +02:00
parent bc5cdf7aa1
commit 49b8852a04
No known key found for this signature in database
GPG key ID: 3248E46B6BB8C7F7
10 changed files with 103 additions and 113 deletions

View file

@ -1,11 +1,10 @@
package config_test package config
import ( import (
"strings" "strings"
"testing" "testing"
"time" "time"
"github.com/crazy-max/diun/v4/internal/config"
"github.com/crazy-max/diun/v4/internal/model" "github.com/crazy-max/diun/v4/internal/model"
"github.com/crazy-max/diun/v4/pkg/registry" "github.com/crazy-max/diun/v4/pkg/registry"
"github.com/crazy-max/diun/v4/pkg/utl" "github.com/crazy-max/diun/v4/pkg/utl"
@ -18,7 +17,7 @@ func TestLoadFile(t *testing.T) {
cases := []struct { cases := []struct {
name string name string
cfg string cfg string
wantData *config.Config wantData *Config
wantErr bool wantErr bool
}{ }{
{ {
@ -44,7 +43,7 @@ func TestLoadFile(t *testing.T) {
{ {
name: "Success", name: "Success",
cfg: "./fixtures/config.test.yml", cfg: "./fixtures/config.test.yml",
wantData: &config.Config{ wantData: &Config{
Db: &model.Db{ Db: &model.Db{
Path: "diun.db", Path: "diun.db",
}, },
@ -236,7 +235,7 @@ for <code>{{ .Entry.Manifest.Platform }}</code> platform.
} }
for _, tt := range cases { for _, tt := range cases {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
cfg, err := config.Load(tt.cfg) cfg, err := Load(tt.cfg)
if tt.wantErr { if tt.wantErr {
require.Error(t, err) require.Error(t, err)
return return
@ -269,7 +268,7 @@ func TestLoadEnv(t *testing.T) {
environ: []string{ environ: []string{
"DIUN_PROVIDERS_DOCKER=true", "DIUN_PROVIDERS_DOCKER=true",
}, },
expected: &config.Config{ expected: &Config{
Db: (&model.Db{}).GetDefaults(), Db: (&model.Db{}).GetDefaults(),
Watch: (&model.Watch{}).GetDefaults(), Watch: (&model.Watch{}).GetDefaults(),
Notif: nil, Notif: nil,
@ -294,7 +293,7 @@ func TestLoadEnv(t *testing.T) {
"DIUN_REGOPTS_0_TIMEOUT=30s", "DIUN_REGOPTS_0_TIMEOUT=30s",
"DIUN_PROVIDERS_DOCKER=true", "DIUN_PROVIDERS_DOCKER=true",
}, },
expected: &config.Config{ expected: &Config{
Db: (&model.Db{}).GetDefaults(), Db: (&model.Db{}).GetDefaults(),
Watch: (&model.Watch{}).GetDefaults(), Watch: (&model.Watch{}).GetDefaults(),
RegOpts: model.RegOpts{ RegOpts: model.RegOpts{
@ -324,7 +323,7 @@ func TestLoadEnv(t *testing.T) {
"DIUN_NOTIF_TELEGRAM_CHATIDS=8547439,1234567", "DIUN_NOTIF_TELEGRAM_CHATIDS=8547439,1234567",
"DIUN_PROVIDERS_SWARM=true", "DIUN_PROVIDERS_SWARM=true",
}, },
expected: &config.Config{ expected: &Config{
Db: (&model.Db{}).GetDefaults(), Db: (&model.Db{}).GetDefaults(),
Watch: (&model.Watch{}).GetDefaults(), Watch: (&model.Watch{}).GetDefaults(),
Notif: &model.Notif{ Notif: &model.Notif{
@ -350,7 +349,7 @@ func TestLoadEnv(t *testing.T) {
"DIUN_NOTIF_SCRIPT_ARGS=-a", "DIUN_NOTIF_SCRIPT_ARGS=-a",
"DIUN_PROVIDERS_FILE_DIRECTORY=./fixtures", "DIUN_PROVIDERS_FILE_DIRECTORY=./fixtures",
}, },
expected: &config.Config{ expected: &Config{
Db: (&model.Db{}).GetDefaults(), Db: (&model.Db{}).GetDefaults(),
Watch: (&model.Watch{}).GetDefaults(), Watch: (&model.Watch{}).GetDefaults(),
Notif: &model.Notif{ Notif: &model.Notif{
@ -381,7 +380,7 @@ func TestLoadEnv(t *testing.T) {
} }
} }
cfg, err := config.Load(tt.cfg) cfg, err := Load(tt.cfg)
if tt.wantErr { if tt.wantErr {
require.Error(t, err) require.Error(t, err)
return return
@ -422,7 +421,7 @@ func TestLoadMixed(t *testing.T) {
"DIUN_NOTIF_MAIL_TO=webmaster@foo.com", "DIUN_NOTIF_MAIL_TO=webmaster@foo.com",
"DIUN_NOTIF_MAIL_LOCALNAME=foo.com", "DIUN_NOTIF_MAIL_LOCALNAME=foo.com",
}, },
expected: &config.Config{ expected: &Config{
Db: (&model.Db{}).GetDefaults(), Db: (&model.Db{}).GetDefaults(),
Watch: (&model.Watch{}).GetDefaults(), Watch: (&model.Watch{}).GetDefaults(),
Notif: &model.Notif{ Notif: &model.Notif{
@ -467,7 +466,7 @@ for <code>{{ .Entry.Manifest.Platform }}</code> platform.
"DIUN_NOTIF_WEBHOOK_METHOD=GET", "DIUN_NOTIF_WEBHOOK_METHOD=GET",
"DIUN_NOTIF_WEBHOOK_TIMEOUT=1m", "DIUN_NOTIF_WEBHOOK_TIMEOUT=1m",
}, },
expected: &config.Config{ expected: &Config{
Db: (&model.Db{}).GetDefaults(), Db: (&model.Db{}).GetDefaults(),
Watch: (&model.Watch{}).GetDefaults(), Watch: (&model.Watch{}).GetDefaults(),
Notif: &model.Notif{ Notif: &model.Notif{
@ -502,7 +501,7 @@ for <code>{{ .Entry.Manifest.Platform }}</code> platform.
} }
} }
cfg, err := config.Load(tt.cfg) cfg, err := Load(tt.cfg)
if tt.wantErr { if tt.wantErr {
require.Error(t, err) require.Error(t, err)
return return
@ -526,7 +525,7 @@ func TestValidation(t *testing.T) {
} }
for _, tt := range cases { for _, tt := range cases {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
cfg, err := config.Load(tt.cfg) cfg, err := Load(tt.cfg)
require.NoError(t, err) require.NoError(t, err)
_, err = env.Encode("DIUN_", cfg) _, err = env.Encode("DIUN_", cfg)
require.NoError(t, err) require.NoError(t, err)

View file

@ -1,10 +1,9 @@
package provider_test package provider
import ( import (
"testing" "testing"
"github.com/crazy-max/diun/v4/internal/model" "github.com/crazy-max/diun/v4/internal/model"
"github.com/crazy-max/diun/v4/internal/provider"
"github.com/crazy-max/diun/v4/pkg/registry" "github.com/crazy-max/diun/v4/pkg/registry"
"github.com/crazy-max/diun/v4/pkg/utl" "github.com/crazy-max/diun/v4/pkg/utl"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -79,7 +78,7 @@ func TestValidateImage(t *testing.T) {
expectedImage: model.Image{ expectedImage: model.Image{
Name: "myimg", Name: "myimg",
}, },
expectedErr: provider.ErrInvalidLabel, expectedErr: ErrInvalidLabel,
}, },
// Test diun.regopt // Test diun.regopt
{ {
@ -165,7 +164,7 @@ func TestValidateImage(t *testing.T) {
expectedImage: model.Image{ expectedImage: model.Image{
Name: "myimg", Name: "myimg",
}, },
expectedErr: provider.ErrInvalidLabel, expectedErr: ErrInvalidLabel,
}, },
{ {
name: "Override default image values with labels (true > false)", name: "Override default image values with labels (true > false)",
@ -226,7 +225,7 @@ func TestValidateImage(t *testing.T) {
Name: "myimg", Name: "myimg",
NotifyOn: []model.NotifyOn{}, NotifyOn: []model.NotifyOn{},
}, },
expectedErr: provider.ErrInvalidLabel, expectedErr: ErrInvalidLabel,
}, },
{ {
name: "Set empty notify_on", name: "Set empty notify_on",
@ -297,7 +296,7 @@ func TestValidateImage(t *testing.T) {
expectedImage: model.Image{ expectedImage: model.Image{
Name: "myimg", Name: "myimg",
}, },
expectedErr: provider.ErrInvalidLabel, expectedErr: ErrInvalidLabel,
}, },
{ {
name: "Set empty sort_tags", name: "Set empty sort_tags",
@ -368,7 +367,7 @@ func TestValidateImage(t *testing.T) {
expectedImage: model.Image{ expectedImage: model.Image{
Name: "myimg", Name: "myimg",
}, },
expectedErr: provider.ErrInvalidLabel, expectedErr: ErrInvalidLabel,
}, },
{ {
name: "Set empty max_tags", name: "Set empty max_tags",
@ -381,7 +380,7 @@ func TestValidateImage(t *testing.T) {
expectedImage: model.Image{ expectedImage: model.Image{
Name: "myimg", Name: "myimg",
}, },
expectedErr: provider.ErrInvalidLabel, expectedErr: ErrInvalidLabel,
}, },
{ {
name: "Default max_tags", name: "Default max_tags",
@ -679,7 +678,7 @@ func TestValidateImage(t *testing.T) {
expectedImage: model.Image{ expectedImage: model.Image{
Name: "myimg", Name: "myimg",
}, },
expectedErr: provider.ErrInvalidLabel, expectedErr: ErrInvalidLabel,
}, },
{ {
name: "Set empty platform", name: "Set empty platform",
@ -693,7 +692,7 @@ func TestValidateImage(t *testing.T) {
Name: "myimg", Name: "myimg",
Platform: model.ImagePlatform{}, Platform: model.ImagePlatform{},
}, },
expectedErr: provider.ErrInvalidLabel, expectedErr: ErrInvalidLabel,
}, },
{ {
name: "Default platform", name: "Default platform",
@ -769,7 +768,7 @@ func TestValidateImage(t *testing.T) {
expectedImage: model.Image{ expectedImage: model.Image{
Name: "myimg", Name: "myimg",
}, },
expectedErr: provider.ErrInvalidLabel, expectedErr: ErrInvalidLabel,
}, },
{ {
name: "Set empty metadata key", name: "Set empty metadata key",
@ -860,7 +859,7 @@ func TestValidateImage(t *testing.T) {
c := c c := c
t.Run(c.name, func(t *testing.T) { t.Run(c.name, func(t *testing.T) {
t.Parallel() t.Parallel()
actualImg, actualErr := provider.ValidateImage( actualImg, actualErr := ValidateImage(
c.image, c.image,
c.metadata, c.metadata,
c.labels, c.labels,

View file

@ -1,10 +1,9 @@
package file_test package file
import ( import (
"testing" "testing"
"github.com/crazy-max/diun/v4/internal/model" "github.com/crazy-max/diun/v4/internal/model"
"github.com/crazy-max/diun/v4/internal/provider/file"
"github.com/crazy-max/diun/v4/pkg/registry" "github.com/crazy-max/diun/v4/pkg/registry"
"github.com/crazy-max/diun/v4/pkg/utl" "github.com/crazy-max/diun/v4/pkg/utl"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
@ -156,7 +155,7 @@ var (
) )
func TestListJobFilename(t *testing.T) { func TestListJobFilename(t *testing.T) {
fc := file.New(&model.PrdFile{ fc := New(&model.PrdFile{
Filename: "./fixtures/dockerhub.yml", Filename: "./fixtures/dockerhub.yml",
}, &defaultImageDefaults) }, &defaultImageDefaults)
@ -164,7 +163,7 @@ func TestListJobFilename(t *testing.T) {
} }
func TestListJobDirectory(t *testing.T) { func TestListJobDirectory(t *testing.T) {
fc := file.New(&model.PrdFile{ fc := New(&model.PrdFile{
Directory: "./fixtures", Directory: "./fixtures",
}, &defaultImageDefaults) }, &defaultImageDefaults)
@ -172,7 +171,7 @@ func TestListJobDirectory(t *testing.T) {
} }
func TestDefaultImageOptions(t *testing.T) { func TestDefaultImageOptions(t *testing.T) {
fc := file.New(&model.PrdFile{ fc := New(&model.PrdFile{
Filename: "./fixtures/dockerhub.yml", Filename: "./fixtures/dockerhub.yml",
}, &model.Image{WatchRepo: utl.NewTrue()}) }, &model.Image{WatchRepo: utl.NewTrue()})

View file

@ -1,23 +1,22 @@
package dockerfile_test package dockerfile
import ( import (
"fmt" "fmt"
"os" "os"
"testing" "testing"
"github.com/crazy-max/diun/v4/pkg/dockerfile"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
var ( var (
dc *dockerfile.Client dc *Client
) )
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
var err error var err error
dc, err = dockerfile.New(dockerfile.Options{ dc, err = New(Options{
Filename: "./fixtures/valid.Dockerfile", Filename: "./fixtures/valid.Dockerfile",
}) })
if err != nil { if err != nil {
@ -60,7 +59,7 @@ func TestLoadFile(t *testing.T) {
} }
for _, tt := range cases { for _, tt := range cases {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
c, err := dockerfile.New(dockerfile.Options{ c, err := New(Options{
Filename: tt.dfile, Filename: tt.dfile,
}) })
if tt.wantErr { if tt.wantErr {

View file

@ -1,15 +1,14 @@
package dockerfile_test package dockerfile
import ( import (
"testing" "testing"
"github.com/crazy-max/diun/v4/pkg/dockerfile"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
func TestFromImages(t *testing.T) { func TestFromImages(t *testing.T) {
c, err := dockerfile.New(dockerfile.Options{ c, err := New(Options{
Filename: "./fixtures/valid.Dockerfile", Filename: "./fixtures/valid.Dockerfile",
}) })
require.NoError(t, err) require.NoError(t, err)

View file

@ -1,24 +1,23 @@
package registry_test package registry
import ( import (
"testing" "testing"
"github.com/crazy-max/diun/v4/pkg/registry"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestParseImage(t *testing.T) { func TestParseImage(t *testing.T) {
testCases := []struct { testCases := []struct {
desc string desc string
parseOpts registry.ParseImageOptions parseOpts ParseImageOptions
expected registry.Image expected Image
}{ }{
{ {
desc: "bintray artifactory-oss", desc: "bintray artifactory-oss",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "jfrog-docker-reg2.bintray.io/jfrog/artifactory-oss:4.0.0", Name: "jfrog-docker-reg2.bintray.io/jfrog/artifactory-oss:4.0.0",
}, },
expected: registry.Image{ expected: Image{
Domain: "jfrog-docker-reg2.bintray.io", Domain: "jfrog-docker-reg2.bintray.io",
Path: "jfrog/artifactory-oss", Path: "jfrog/artifactory-oss",
Tag: "4.0.0", Tag: "4.0.0",
@ -26,10 +25,10 @@ func TestParseImage(t *testing.T) {
}, },
{ {
desc: "bintray xray-server", desc: "bintray xray-server",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "docker.bintray.io/jfrog/xray-server:2.8.6", Name: "docker.bintray.io/jfrog/xray-server:2.8.6",
}, },
expected: registry.Image{ expected: Image{
Domain: "docker.bintray.io", Domain: "docker.bintray.io",
Path: "jfrog/xray-server", Path: "jfrog/xray-server",
Tag: "2.8.6", Tag: "2.8.6",
@ -37,10 +36,10 @@ func TestParseImage(t *testing.T) {
}, },
{ {
desc: "dockerhub alpine", desc: "dockerhub alpine",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "alpine", Name: "alpine",
}, },
expected: registry.Image{ expected: Image{
Domain: "docker.io", Domain: "docker.io",
Path: "library/alpine", Path: "library/alpine",
Tag: "latest", Tag: "latest",
@ -48,10 +47,10 @@ func TestParseImage(t *testing.T) {
}, },
{ {
desc: "dockerhub crazymax/nextcloud", desc: "dockerhub crazymax/nextcloud",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "docker.io/crazymax/nextcloud:latest", Name: "docker.io/crazymax/nextcloud:latest",
}, },
expected: registry.Image{ expected: Image{
Domain: "docker.io", Domain: "docker.io",
Path: "crazymax/nextcloud", Path: "crazymax/nextcloud",
Tag: "latest", Tag: "latest",
@ -59,10 +58,10 @@ func TestParseImage(t *testing.T) {
}, },
{ {
desc: "gcr busybox", desc: "gcr busybox",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "gcr.io/google-containers/busybox:latest", Name: "gcr.io/google-containers/busybox:latest",
}, },
expected: registry.Image{ expected: Image{
Domain: "gcr.io", Domain: "gcr.io",
Path: "google-containers/busybox", Path: "google-containers/busybox",
Tag: "latest", Tag: "latest",
@ -70,10 +69,10 @@ func TestParseImage(t *testing.T) {
}, },
{ {
desc: "github ddns-route53", desc: "github ddns-route53",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "docker.pkg.github.com/crazy-max/ddns-route53/ddns-route53:latest", Name: "docker.pkg.github.com/crazy-max/ddns-route53/ddns-route53:latest",
}, },
expected: registry.Image{ expected: Image{
Domain: "docker.pkg.github.com", Domain: "docker.pkg.github.com",
Path: "crazy-max/ddns-route53/ddns-route53", Path: "crazy-max/ddns-route53/ddns-route53",
Tag: "latest", Tag: "latest",
@ -81,10 +80,10 @@ func TestParseImage(t *testing.T) {
}, },
{ {
desc: "gitlab meltano", desc: "gitlab meltano",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "registry.gitlab.com/meltano/meltano", Name: "registry.gitlab.com/meltano/meltano",
}, },
expected: registry.Image{ expected: Image{
Domain: "registry.gitlab.com", Domain: "registry.gitlab.com",
Path: "meltano/meltano", Path: "meltano/meltano",
Tag: "latest", Tag: "latest",
@ -92,10 +91,10 @@ func TestParseImage(t *testing.T) {
}, },
{ {
desc: "quay hypercube", desc: "quay hypercube",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "quay.io/coreos/hyperkube", Name: "quay.io/coreos/hyperkube",
}, },
expected: registry.Image{ expected: Image{
Domain: "quay.io", Domain: "quay.io",
Path: "coreos/hyperkube", Path: "coreos/hyperkube",
Tag: "latest", Tag: "latest",
@ -103,10 +102,10 @@ func TestParseImage(t *testing.T) {
}, },
{ {
desc: "ghcr ddns-route53", desc: "ghcr ddns-route53",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "ghcr.io/crazy-max/ddns-route53", Name: "ghcr.io/crazy-max/ddns-route53",
}, },
expected: registry.Image{ expected: Image{
Domain: "ghcr.io", Domain: "ghcr.io",
Path: "crazy-max/ddns-route53", Path: "crazy-max/ddns-route53",
Tag: "latest", Tag: "latest",
@ -114,10 +113,10 @@ func TestParseImage(t *testing.T) {
}, },
{ {
desc: "ghcr radarr", desc: "ghcr radarr",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "ghcr.io/linuxserver/radarr", Name: "ghcr.io/linuxserver/radarr",
}, },
expected: registry.Image{ expected: Image{
Domain: "ghcr.io", Domain: "ghcr.io",
Path: "linuxserver/radarr", Path: "linuxserver/radarr",
Tag: "latest", Tag: "latest",
@ -128,7 +127,7 @@ func TestParseImage(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
tt := tt tt := tt
t.Run(tt.desc, func(t *testing.T) { t.Run(tt.desc, func(t *testing.T) {
img, err := registry.ParseImage(tt.parseOpts) img, err := ParseImage(tt.parseOpts)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
@ -142,96 +141,96 @@ func TestParseImage(t *testing.T) {
func TestHubLink(t *testing.T) { func TestHubLink(t *testing.T) {
testCases := []struct { testCases := []struct {
desc string desc string
parseOpts registry.ParseImageOptions parseOpts ParseImageOptions
expected string expected string
}{ }{
{ {
desc: "bintray artifactory-oss", desc: "bintray artifactory-oss",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "jfrog-docker-reg2.bintray.io/jfrog/artifactory-oss:4.0.0", Name: "jfrog-docker-reg2.bintray.io/jfrog/artifactory-oss:4.0.0",
}, },
expected: "https://bintray.com/jfrog/reg2/jfrog%3Aartifactory-oss", expected: "https://bintray.com/jfrog/reg2/jfrog%3Aartifactory-oss",
}, },
{ {
desc: "bintray kubexray", desc: "bintray kubexray",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "jfrog-docker-reg2.bintray.io/kubexray:latest", Name: "jfrog-docker-reg2.bintray.io/kubexray:latest",
}, },
expected: "https://bintray.com/jfrog/reg2/kubexray", expected: "https://bintray.com/jfrog/reg2/kubexray",
}, },
{ {
desc: "bintray xray-server", desc: "bintray xray-server",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "docker.bintray.io/jfrog/xray-server:2.8.6", Name: "docker.bintray.io/jfrog/xray-server:2.8.6",
}, },
expected: "https://bintray.com/jfrog/reg2/jfrog%3Axray-server", expected: "https://bintray.com/jfrog/reg2/jfrog%3Axray-server",
}, },
{ {
desc: "dockerhub alpine", desc: "dockerhub alpine",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "alpine", Name: "alpine",
}, },
expected: "https://hub.docker.com/_/alpine", expected: "https://hub.docker.com/_/alpine",
}, },
{ {
desc: "dockerhub crazymax/nextcloud", desc: "dockerhub crazymax/nextcloud",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "docker.io/crazymax/nextcloud:latest", Name: "docker.io/crazymax/nextcloud:latest",
}, },
expected: "https://hub.docker.com/r/crazymax/nextcloud", expected: "https://hub.docker.com/r/crazymax/nextcloud",
}, },
{ {
desc: "gcr busybox", desc: "gcr busybox",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "gcr.io/google-containers/busybox:latest", Name: "gcr.io/google-containers/busybox:latest",
}, },
expected: "https://gcr.io/google-containers/busybox", expected: "https://gcr.io/google-containers/busybox",
}, },
{ {
desc: "github ddns-route53", desc: "github ddns-route53",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "docker.pkg.github.com/crazy-max/ddns-route53/ddns-route53:latest", Name: "docker.pkg.github.com/crazy-max/ddns-route53/ddns-route53:latest",
}, },
expected: "https://github.com/crazy-max/ddns-route53/packages", expected: "https://github.com/crazy-max/ddns-route53/packages",
}, },
{ {
desc: "gitlab meltano", desc: "gitlab meltano",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "registry.gitlab.com/meltano/meltano", Name: "registry.gitlab.com/meltano/meltano",
}, },
expected: "https://gitlab.com/meltano/meltano/container_registry", expected: "https://gitlab.com/meltano/meltano/container_registry",
}, },
{ {
desc: "quay hypercube", desc: "quay hypercube",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "quay.io/coreos/hyperkube", Name: "quay.io/coreos/hyperkube",
}, },
expected: "https://quay.io/repository/coreos/hyperkube", expected: "https://quay.io/repository/coreos/hyperkube",
}, },
{ {
desc: "ghcr ddns-route53", desc: "ghcr ddns-route53",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "ghcr.io/crazy-max/ddns-route53", Name: "ghcr.io/crazy-max/ddns-route53",
}, },
expected: "https://github.com/users/crazy-max/packages/container/package/ddns-route53", expected: "https://github.com/users/crazy-max/packages/container/package/ddns-route53",
}, },
{ {
desc: "ghcr radarr", desc: "ghcr radarr",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "ghcr.io/linuxserver/radarr", Name: "ghcr.io/linuxserver/radarr",
}, },
expected: "https://github.com/users/linuxserver/packages/container/package/radarr", expected: "https://github.com/users/linuxserver/packages/container/package/radarr",
}, },
{ {
desc: "redhat etcd", desc: "redhat etcd",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "registry.access.redhat.com/rhel7/etcd", Name: "registry.access.redhat.com/rhel7/etcd",
}, },
expected: "https://access.redhat.com/containers/#/registry.access.redhat.com/rhel7/etcd", expected: "https://access.redhat.com/containers/#/registry.access.redhat.com/rhel7/etcd",
}, },
{ {
desc: "private", desc: "private",
parseOpts: registry.ParseImageOptions{ parseOpts: ParseImageOptions{
Name: "myregistry.example.com/an/image:latest", Name: "myregistry.example.com/an/image:latest",
HubTpl: "https://{{ .Domain }}/ui/repos/{{ .Path }}", HubTpl: "https://{{ .Domain }}/ui/repos/{{ .Path }}",
}, },
@ -242,7 +241,7 @@ func TestHubLink(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
tt := tt tt := tt
t.Run(tt.desc, func(t *testing.T) { t.Run(tt.desc, func(t *testing.T) {
img, err := registry.ParseImage(tt.parseOpts) img, err := ParseImage(tt.parseOpts)
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }

View file

@ -1,29 +1,28 @@
package registry_test package registry
import ( import (
"testing" "testing"
"github.com/crazy-max/diun/v4/pkg/registry"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestCompareDigest(t *testing.T) { func TestCompareDigest(t *testing.T) {
t.Parallel() t.Parallel()
rc, err := registry.New(registry.Options{ rc, err := New(Options{
CompareDigest: true, CompareDigest: true,
}) })
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
img, err := registry.ParseImage(registry.ParseImageOptions{ img, err := ParseImage(ParseImageOptions{
Name: "crazymax/diun:2.5.0", Name: "crazymax/diun:2.5.0",
}) })
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
manifest, _, err := rc.Manifest(img, registry.Manifest{ manifest, _, err := rc.Manifest(img, Manifest{
Name: "docker.io/crazymax/diun", Name: "docker.io/crazymax/diun",
Tag: "2.5.0", Tag: "2.5.0",
MIMEType: "application/vnd.docker.distribution.manifest.list.v2+json", MIMEType: "application/vnd.docker.distribution.manifest.list.v2+json",
@ -40,7 +39,7 @@ func TestCompareDigest(t *testing.T) {
func TestManifest(t *testing.T) { func TestManifest(t *testing.T) {
t.Parallel() t.Parallel()
rc, err := registry.New(registry.Options{ rc, err := New(Options{
CompareDigest: true, CompareDigest: true,
ImageOs: "linux", ImageOs: "linux",
ImageArch: "amd64", ImageArch: "amd64",
@ -49,14 +48,14 @@ func TestManifest(t *testing.T) {
t.Error(err) t.Error(err)
} }
img, err := registry.ParseImage(registry.ParseImageOptions{ img, err := ParseImage(ParseImageOptions{
Name: "portainer/portainer-ce:linux-amd64-2.5.1", Name: "portainer/portainer-ce:linux-amd64-2.5.1",
}) })
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
manifest, updated, err := rc.Manifest(img, registry.Manifest{ manifest, updated, err := rc.Manifest(img, Manifest{
Name: "docker.io/portainer/portainer-ce", Name: "docker.io/portainer/portainer-ce",
Tag: "linux-amd64-2.5.1", Tag: "linux-amd64-2.5.1",
MIMEType: "application/vnd.docker.distribution.manifest.v2+json", MIMEType: "application/vnd.docker.distribution.manifest.v2+json",
@ -101,7 +100,7 @@ func TestManifest(t *testing.T) {
func TestManifestMultiUpdatedPlatform(t *testing.T) { func TestManifestMultiUpdatedPlatform(t *testing.T) {
t.Parallel() t.Parallel()
rc, err := registry.New(registry.Options{ rc, err := New(Options{
CompareDigest: true, CompareDigest: true,
ImageOs: "linux", ImageOs: "linux",
ImageArch: "amd64", ImageArch: "amd64",
@ -110,14 +109,14 @@ func TestManifestMultiUpdatedPlatform(t *testing.T) {
t.Error(err) t.Error(err)
} }
img, err := registry.ParseImage(registry.ParseImageOptions{ img, err := ParseImage(ParseImageOptions{
Name: "mongo:3.6.21", Name: "mongo:3.6.21",
}) })
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
manifest, updated, err := rc.Manifest(img, registry.Manifest{ manifest, updated, err := rc.Manifest(img, Manifest{
Name: "docker.io/library/mongo", Name: "docker.io/library/mongo",
Tag: "3.6.21", Tag: "3.6.21",
MIMEType: "application/vnd.docker.distribution.manifest.list.v2+json", MIMEType: "application/vnd.docker.distribution.manifest.list.v2+json",
@ -181,7 +180,7 @@ func TestManifestMultiUpdatedPlatform(t *testing.T) {
func TestManifestMultiNotUpdatedPlatform(t *testing.T) { func TestManifestMultiNotUpdatedPlatform(t *testing.T) {
t.Parallel() t.Parallel()
rc, err := registry.New(registry.Options{ rc, err := New(Options{
CompareDigest: true, CompareDigest: true,
ImageOs: "linux", ImageOs: "linux",
ImageArch: "amd64", ImageArch: "amd64",
@ -190,14 +189,14 @@ func TestManifestMultiNotUpdatedPlatform(t *testing.T) {
t.Error(err) t.Error(err)
} }
img, err := registry.ParseImage(registry.ParseImageOptions{ img, err := ParseImage(ParseImageOptions{
Name: "mongo:3.6.21", Name: "mongo:3.6.21",
}) })
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
manifest, updated, err := rc.Manifest(img, registry.Manifest{ manifest, updated, err := rc.Manifest(img, Manifest{
Name: "docker.io/library/mongo", Name: "docker.io/library/mongo",
Tag: "3.6.21", Tag: "3.6.21",
MIMEType: "application/vnd.docker.distribution.manifest.list.v2+json", MIMEType: "application/vnd.docker.distribution.manifest.list.v2+json",
@ -261,7 +260,7 @@ func TestManifestMultiNotUpdatedPlatform(t *testing.T) {
func TestManifestVariant(t *testing.T) { func TestManifestVariant(t *testing.T) {
t.Parallel() t.Parallel()
rc, err := registry.New(registry.Options{ rc, err := New(Options{
ImageOs: "linux", ImageOs: "linux",
ImageArch: "arm", ImageArch: "arm",
ImageVariant: "v7", ImageVariant: "v7",
@ -270,14 +269,14 @@ func TestManifestVariant(t *testing.T) {
t.Error(err) t.Error(err)
} }
img, err := registry.ParseImage(registry.ParseImageOptions{ img, err := ParseImage(ParseImageOptions{
Name: "crazymax/diun:2.5.0", Name: "crazymax/diun:2.5.0",
}) })
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
manifest, _, err := rc.Manifest(img, registry.Manifest{}) manifest, _, err := rc.Manifest(img, Manifest{})
assert.NoError(t, err) assert.NoError(t, err)
assert.Equal(t, "docker.io/crazymax/diun", manifest.Name) assert.Equal(t, "docker.io/crazymax/diun", manifest.Name)
assert.Equal(t, "2.5.0", manifest.Tag) assert.Equal(t, "2.5.0", manifest.Tag)

View file

@ -1,9 +1,8 @@
package registry_test package registry
import ( import (
"testing" "testing"
"github.com/crazy-max/diun/v4/pkg/registry"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
"github.com/stretchr/testify/require" "github.com/stretchr/testify/require"
) )
@ -54,7 +53,7 @@ func TestParseReference(t *testing.T) {
for _, tt := range testCases { for _, tt := range testCases {
tt := tt tt := tt
t.Run(tt.input, func(t *testing.T) { t.Run(tt.input, func(t *testing.T) {
ref, err := registry.ParseReference(tt.input) ref, err := ParseReference(tt.input)
if tt.wantErr { if tt.wantErr {
require.Error(t, err) require.Error(t, err)
return return

View file

@ -1,21 +1,20 @@
package registry_test package registry
import ( import (
"os" "os"
"testing" "testing"
"github.com/crazy-max/diun/v4/pkg/registry"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
var ( var (
rc *registry.Client rc *Client
) )
func TestMain(m *testing.M) { func TestMain(m *testing.M) {
var err error var err error
rc, err = registry.New(registry.Options{ rc, err = New(Options{
ImageOs: "linux", ImageOs: "linux",
ImageArch: "amd64", ImageArch: "amd64",
}) })

View file

@ -1,23 +1,22 @@
package registry_test package registry
import ( import (
"testing" "testing"
"github.com/crazy-max/diun/v4/pkg/registry"
"github.com/stretchr/testify/assert" "github.com/stretchr/testify/assert"
) )
func TestTags(t *testing.T) { func TestTags(t *testing.T) {
assert.NotNil(t, rc) assert.NotNil(t, rc)
image, err := registry.ParseImage(registry.ParseImageOptions{ image, err := ParseImage(ParseImageOptions{
Name: "crazymax/diun:3.0.0", Name: "crazymax/diun:3.0.0",
}) })
if err != nil { if err != nil {
t.Error(err) t.Error(err)
} }
tags, err := rc.Tags(registry.TagsOptions{ tags, err := rc.Tags(TagsOptions{
Image: image, Image: image,
}) })
if err != nil { if err != nil {
@ -31,12 +30,12 @@ func TestTags(t *testing.T) {
func TestTagsSort(t *testing.T) { func TestTagsSort(t *testing.T) {
testCases := []struct { testCases := []struct {
name string name string
sortTag registry.SortTag sortTag SortTag
expected []string expected []string
}{ }{
{ {
name: "sort default", name: "sort default",
sortTag: registry.SortTagDefault, sortTag: SortTagDefault,
expected: []string{ expected: []string{
"0.1.0", "0.1.0",
"0.4.0", "0.4.0",
@ -76,7 +75,7 @@ func TestTagsSort(t *testing.T) {
}, },
{ {
name: "sort lexicographical", name: "sort lexicographical",
sortTag: registry.SortTagLexicographical, sortTag: SortTagLexicographical,
expected: []string{ expected: []string{
"0.1.0", "0.1.0",
"0.4.0", "0.4.0",
@ -116,7 +115,7 @@ func TestTagsSort(t *testing.T) {
}, },
{ {
name: "sort reverse", name: "sort reverse",
sortTag: registry.SortTagReverse, sortTag: SortTagReverse,
expected: []string{ expected: []string{
"latest", "latest",
"edge", "edge",
@ -156,7 +155,7 @@ func TestTagsSort(t *testing.T) {
}, },
{ {
name: "sort semver", name: "sort semver",
sortTag: registry.SortTagSemver, sortTag: SortTagSemver,
expected: []string{ expected: []string{
"alpine-5.0", "alpine-5.0",
"ubuntu-5.0", "ubuntu-5.0",
@ -237,7 +236,7 @@ func TestTagsSort(t *testing.T) {
t.Run(tt.name, func(t *testing.T) { t.Run(tt.name, func(t *testing.T) {
t.Parallel() t.Parallel()
tags := registry.SortTags(repotags, tt.sortTag) tags := SortTags(repotags, tt.sortTag)
assert.Equal(t, tt.expected, tags) assert.Equal(t, tt.expected, tags)
}) })
} }