313 lines
8.6 KiB
Go
313 lines
8.6 KiB
Go
package godo
|
|
|
|
import (
|
|
"encoding/json"
|
|
"fmt"
|
|
"net/http"
|
|
"testing"
|
|
"time"
|
|
|
|
"github.com/stretchr/testify/assert"
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
const (
|
|
testRegistry = "test-registry"
|
|
testRepository = "test/repository"
|
|
testEncodedRepository = "test%2Frepository"
|
|
testTag = "test-tag"
|
|
testDigest = "sha256:e692418e4cbaf90ca69d05a66403747baa33ee08806650b51fab815ad7fc331f"
|
|
testCompressedSize = 2789669
|
|
testSize = 5843968
|
|
)
|
|
|
|
var (
|
|
testTime = time.Date(2020, 4, 1, 0, 0, 0, 0, time.UTC)
|
|
testTimeString = testTime.Format(time.RFC3339)
|
|
)
|
|
|
|
func TestRegistry_Create(t *testing.T) {
|
|
setup()
|
|
defer teardown()
|
|
|
|
want := &Registry{
|
|
Name: testRegistry,
|
|
CreatedAt: testTime,
|
|
}
|
|
|
|
createRequest := &RegistryCreateRequest{
|
|
Name: want.Name,
|
|
}
|
|
|
|
createResponseJSON := `
|
|
{
|
|
"registry": {
|
|
"name": "` + testRegistry + `",
|
|
"created_at": "` + testTimeString + `"
|
|
}
|
|
}`
|
|
|
|
mux.HandleFunc("/v2/registry", func(w http.ResponseWriter, r *http.Request) {
|
|
v := new(RegistryCreateRequest)
|
|
err := json.NewDecoder(r.Body).Decode(v)
|
|
if err != nil {
|
|
t.Fatal(err)
|
|
}
|
|
|
|
testMethod(t, r, http.MethodPost)
|
|
require.Equal(t, v, createRequest)
|
|
fmt.Fprint(w, createResponseJSON)
|
|
})
|
|
|
|
got, _, err := client.Registry.Create(ctx, createRequest)
|
|
require.NoError(t, err)
|
|
require.Equal(t, want, got)
|
|
}
|
|
|
|
func TestRegistry_Get(t *testing.T) {
|
|
setup()
|
|
defer teardown()
|
|
|
|
want := &Registry{
|
|
Name: testRegistry,
|
|
}
|
|
|
|
getResponseJSON := `
|
|
{
|
|
"registry": {
|
|
"name": "` + testRegistry + `"
|
|
}
|
|
}`
|
|
|
|
mux.HandleFunc("/v2/registry", func(w http.ResponseWriter, r *http.Request) {
|
|
testMethod(t, r, http.MethodGet)
|
|
fmt.Fprint(w, getResponseJSON)
|
|
})
|
|
got, _, err := client.Registry.Get(ctx)
|
|
require.NoError(t, err)
|
|
require.Equal(t, want, got)
|
|
}
|
|
|
|
func TestRegistry_Delete(t *testing.T) {
|
|
setup()
|
|
defer teardown()
|
|
|
|
mux.HandleFunc("/v2/registry", func(w http.ResponseWriter, r *http.Request) {
|
|
testMethod(t, r, http.MethodDelete)
|
|
})
|
|
|
|
_, err := client.Registry.Delete(ctx)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestRegistry_DockerCredentials(t *testing.T) {
|
|
returnedConfig := "this could be a docker config"
|
|
tests := []struct {
|
|
name string
|
|
params *RegistryDockerCredentialsRequest
|
|
expectedReadWrite string
|
|
expectedExpirySeconds string
|
|
}{
|
|
{
|
|
name: "read-only (default)",
|
|
params: &RegistryDockerCredentialsRequest{},
|
|
expectedReadWrite: "false",
|
|
},
|
|
{
|
|
name: "read/write",
|
|
params: &RegistryDockerCredentialsRequest{ReadWrite: true},
|
|
expectedReadWrite: "true",
|
|
},
|
|
{
|
|
name: "read-only + custom expiry",
|
|
params: &RegistryDockerCredentialsRequest{ExpirySeconds: intPtr(60 * 60)},
|
|
expectedReadWrite: "false",
|
|
expectedExpirySeconds: "3600",
|
|
},
|
|
{
|
|
name: "read/write + custom expiry",
|
|
params: &RegistryDockerCredentialsRequest{ReadWrite: true, ExpirySeconds: intPtr(60 * 60)},
|
|
expectedReadWrite: "true",
|
|
expectedExpirySeconds: "3600",
|
|
},
|
|
}
|
|
|
|
for _, test := range tests {
|
|
t.Run(test.name, func(t *testing.T) {
|
|
setup()
|
|
defer teardown()
|
|
|
|
mux.HandleFunc("/v2/registry/docker-credentials", func(w http.ResponseWriter, r *http.Request) {
|
|
require.Equal(t, test.expectedReadWrite, r.URL.Query().Get("read_write"))
|
|
require.Equal(t, test.expectedExpirySeconds, r.URL.Query().Get("expiry_seconds"))
|
|
testMethod(t, r, http.MethodGet)
|
|
fmt.Fprint(w, returnedConfig)
|
|
})
|
|
|
|
got, _, err := client.Registry.DockerCredentials(ctx, test.params)
|
|
require.NoError(t, err)
|
|
require.Equal(t, []byte(returnedConfig), got.DockerConfigJSON)
|
|
})
|
|
}
|
|
}
|
|
|
|
func TestRepository_List(t *testing.T) {
|
|
setup()
|
|
defer teardown()
|
|
|
|
wantRepositories := []*Repository{
|
|
{
|
|
RegistryName: testRegistry,
|
|
Name: testRepository,
|
|
TagCount: 1,
|
|
LatestTag: &RepositoryTag{
|
|
RegistryName: testRegistry,
|
|
Repository: testRepository,
|
|
Tag: testTag,
|
|
ManifestDigest: testDigest,
|
|
CompressedSizeBytes: testCompressedSize,
|
|
SizeBytes: testSize,
|
|
UpdatedAt: testTime,
|
|
},
|
|
},
|
|
}
|
|
getResponseJSON := `{
|
|
"repositories": [
|
|
{
|
|
"registry_name": "` + testRegistry + `",
|
|
"name": "` + testRepository + `",
|
|
"tag_count": 1,
|
|
"latest_tag": {
|
|
"registry_name": "` + testRegistry + `",
|
|
"repository": "` + testRepository + `",
|
|
"tag": "` + testTag + `",
|
|
"manifest_digest": "` + testDigest + `",
|
|
"compressed_size_bytes": ` + fmt.Sprintf("%d", testCompressedSize) + `,
|
|
"size_bytes": ` + fmt.Sprintf("%d", testSize) + `,
|
|
"updated_at": "` + testTimeString + `"
|
|
}
|
|
}
|
|
],
|
|
"links": {
|
|
"pages": {
|
|
"next": "https://api.digitalocean.com/v2/registry/` + testRegistry + `/repositories?page=2",
|
|
"last": "https://api.digitalocean.com/v2/registry/` + testRegistry + `/repositories?page=2"
|
|
}
|
|
},
|
|
"meta": {
|
|
"total": 2
|
|
}
|
|
}`
|
|
|
|
mux.HandleFunc(fmt.Sprintf("/v2/registry/%s/repositories", testRegistry), func(w http.ResponseWriter, r *http.Request) {
|
|
testMethod(t, r, http.MethodGet)
|
|
testFormValues(t, r, map[string]string{"page": "1", "per_page": "1"})
|
|
fmt.Fprint(w, getResponseJSON)
|
|
})
|
|
got, response, err := client.Registry.ListRepositories(ctx, testRegistry, &ListOptions{Page: 1, PerPage: 1})
|
|
require.NoError(t, err)
|
|
require.Equal(t, wantRepositories, got)
|
|
|
|
gotRespLinks := response.Links
|
|
wantRespLinks := &Links{
|
|
Pages: &Pages{
|
|
Next: fmt.Sprintf("https://api.digitalocean.com/v2/registry/%s/repositories?page=2", testRegistry),
|
|
Last: fmt.Sprintf("https://api.digitalocean.com/v2/registry/%s/repositories?page=2", testRegistry),
|
|
},
|
|
}
|
|
assert.Equal(t, wantRespLinks, gotRespLinks)
|
|
|
|
gotRespMeta := response.Meta
|
|
wantRespMeta := &Meta{
|
|
Total: 2,
|
|
}
|
|
assert.Equal(t, wantRespMeta, gotRespMeta)
|
|
}
|
|
|
|
func TestRepository_ListTags(t *testing.T) {
|
|
setup()
|
|
defer teardown()
|
|
|
|
wantTags := []*RepositoryTag{
|
|
{
|
|
RegistryName: testRegistry,
|
|
Repository: testRepository,
|
|
Tag: testTag,
|
|
ManifestDigest: testDigest,
|
|
CompressedSizeBytes: testCompressedSize,
|
|
SizeBytes: testSize,
|
|
UpdatedAt: testTime,
|
|
},
|
|
}
|
|
getResponseJSON := `{
|
|
"tags": [
|
|
{
|
|
"registry_name": "` + testRegistry + `",
|
|
"repository": "` + testRepository + `",
|
|
"tag": "` + testTag + `",
|
|
"manifest_digest": "` + testDigest + `",
|
|
"compressed_size_bytes": ` + fmt.Sprintf("%d", testCompressedSize) + `,
|
|
"size_bytes": ` + fmt.Sprintf("%d", testSize) + `,
|
|
"updated_at": "` + testTimeString + `"
|
|
}
|
|
],
|
|
"links": {
|
|
"pages": {
|
|
"next": "https://api.digitalocean.com/v2/registry/` + testRegistry + `/repositories/` + testEncodedRepository + `/tags?page=2",
|
|
"last": "https://api.digitalocean.com/v2/registry/` + testRegistry + `/repositories/` + testEncodedRepository + `/tags?page=2"
|
|
}
|
|
},
|
|
"meta": {
|
|
"total": 2
|
|
}
|
|
}`
|
|
|
|
mux.HandleFunc(fmt.Sprintf("/v2/registry/%s/repositories/%s/tags", testRegistry, testRepository), func(w http.ResponseWriter, r *http.Request) {
|
|
testMethod(t, r, http.MethodGet)
|
|
testFormValues(t, r, map[string]string{"page": "1", "per_page": "1"})
|
|
fmt.Fprint(w, getResponseJSON)
|
|
})
|
|
got, response, err := client.Registry.ListRepositoryTags(ctx, testRegistry, testRepository, &ListOptions{Page: 1, PerPage: 1})
|
|
require.NoError(t, err)
|
|
require.Equal(t, wantTags, got)
|
|
|
|
gotRespLinks := response.Links
|
|
wantRespLinks := &Links{
|
|
Pages: &Pages{
|
|
Next: fmt.Sprintf("https://api.digitalocean.com/v2/registry/%s/repositories/%s/tags?page=2", testRegistry, testEncodedRepository),
|
|
Last: fmt.Sprintf("https://api.digitalocean.com/v2/registry/%s/repositories/%s/tags?page=2", testRegistry, testEncodedRepository),
|
|
},
|
|
}
|
|
assert.Equal(t, wantRespLinks, gotRespLinks)
|
|
|
|
gotRespMeta := response.Meta
|
|
wantRespMeta := &Meta{
|
|
Total: 2,
|
|
}
|
|
assert.Equal(t, wantRespMeta, gotRespMeta)
|
|
}
|
|
|
|
func TestRegistry_DeleteTag(t *testing.T) {
|
|
setup()
|
|
defer teardown()
|
|
|
|
mux.HandleFunc(fmt.Sprintf("/v2/registry/%s/repositories/%s/tags/%s", testRegistry, testRepository, testTag), func(w http.ResponseWriter, r *http.Request) {
|
|
testMethod(t, r, http.MethodDelete)
|
|
})
|
|
|
|
_, err := client.Registry.DeleteTag(ctx, testRegistry, testRepository, testTag)
|
|
require.NoError(t, err)
|
|
}
|
|
|
|
func TestRegistry_DeleteManifest(t *testing.T) {
|
|
setup()
|
|
defer teardown()
|
|
|
|
mux.HandleFunc(fmt.Sprintf("/v2/registry/%s/repositories/%s/digests/%s", testRegistry, testRepository, testDigest), func(w http.ResponseWriter, r *http.Request) {
|
|
testMethod(t, r, http.MethodDelete)
|
|
})
|
|
|
|
_, err := client.Registry.DeleteManifest(ctx, testRegistry, testRepository, testDigest)
|
|
require.NoError(t, err)
|
|
}
|