123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361 |
- package registry // import "github.com/docker/docker/registry"
- import (
- "context"
- "encoding/json"
- "net/http"
- "net/http/httptest"
- "testing"
- "github.com/docker/docker/api/types/filters"
- "github.com/docker/docker/api/types/registry"
- "github.com/docker/docker/errdefs"
- "gotest.tools/v3/assert"
- )
- func TestSearchErrors(t *testing.T) {
- errorCases := []struct {
- filtersArgs filters.Args
- shouldReturnError bool
- expectedError string
- }{
- {
- expectedError: "Unexpected status code 500",
- shouldReturnError: true,
- },
- {
- filtersArgs: filters.NewArgs(filters.Arg("type", "custom")),
- expectedError: "invalid filter 'type'",
- },
- {
- filtersArgs: filters.NewArgs(filters.Arg("is-automated", "invalid")),
- expectedError: "invalid filter 'is-automated=[invalid]'",
- },
- {
- filtersArgs: filters.NewArgs(
- filters.Arg("is-automated", "true"),
- filters.Arg("is-automated", "false"),
- ),
- expectedError: "invalid filter 'is-automated",
- },
- {
- filtersArgs: filters.NewArgs(filters.Arg("is-official", "invalid")),
- expectedError: "invalid filter 'is-official=[invalid]'",
- },
- {
- filtersArgs: filters.NewArgs(
- filters.Arg("is-official", "true"),
- filters.Arg("is-official", "false"),
- ),
- expectedError: "invalid filter 'is-official",
- },
- {
- filtersArgs: filters.NewArgs(filters.Arg("stars", "invalid")),
- expectedError: "invalid filter 'stars=invalid'",
- },
- {
- filtersArgs: filters.NewArgs(
- filters.Arg("stars", "1"),
- filters.Arg("stars", "invalid"),
- ),
- expectedError: "invalid filter 'stars=invalid'",
- },
- }
- for _, tc := range errorCases {
- tc := tc
- t.Run(tc.expectedError, func(t *testing.T) {
- srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- if !tc.shouldReturnError {
- t.Errorf("unexpected HTTP request")
- }
- http.Error(w, "no search for you", http.StatusInternalServerError)
- }))
- defer srv.Close()
- // Construct the search term by cutting the 'http://' prefix off srv.URL.
- term := srv.URL[7:] + "/term"
- reg, err := NewService(ServiceOptions{})
- assert.NilError(t, err)
- _, err = reg.Search(context.Background(), tc.filtersArgs, term, 0, nil, map[string][]string{})
- assert.ErrorContains(t, err, tc.expectedError)
- if tc.shouldReturnError {
- assert.Check(t, errdefs.IsUnknown(err), "got: %T: %v", err, err)
- return
- }
- assert.Check(t, errdefs.IsInvalidParameter(err), "got: %T: %v", err, err)
- })
- }
- }
- func TestSearch(t *testing.T) {
- const term = "term"
- successCases := []struct {
- name string
- filtersArgs filters.Args
- registryResults []registry.SearchResult
- expectedResults []registry.SearchResult
- }{
- {
- name: "empty results",
- registryResults: []registry.SearchResult{},
- expectedResults: []registry.SearchResult{},
- },
- {
- name: "no filter",
- registryResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- },
- },
- expectedResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- },
- },
- },
- {
- name: "is-automated=true, no results",
- filtersArgs: filters.NewArgs(filters.Arg("is-automated", "true")),
- registryResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- },
- },
- expectedResults: []registry.SearchResult{},
- },
- {
- name: "is-automated=true",
- filtersArgs: filters.NewArgs(filters.Arg("is-automated", "true")),
- registryResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- IsAutomated: true,
- },
- },
- expectedResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- IsAutomated: true,
- },
- },
- },
- {
- name: "is-automated=false, no results",
- filtersArgs: filters.NewArgs(filters.Arg("is-automated", "false")),
- registryResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- IsAutomated: true,
- },
- },
- expectedResults: []registry.SearchResult{},
- },
- {
- name: "is-automated=false",
- filtersArgs: filters.NewArgs(filters.Arg("is-automated", "false")),
- registryResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- IsAutomated: false,
- },
- },
- expectedResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- IsAutomated: false,
- },
- },
- },
- {
- name: "is-official=true, no results",
- filtersArgs: filters.NewArgs(filters.Arg("is-official", "true")),
- registryResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- },
- },
- expectedResults: []registry.SearchResult{},
- },
- {
- name: "is-official=true",
- filtersArgs: filters.NewArgs(filters.Arg("is-official", "true")),
- registryResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- IsOfficial: true,
- },
- },
- expectedResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- IsOfficial: true,
- },
- },
- },
- {
- name: "is-official=false, no results",
- filtersArgs: filters.NewArgs(filters.Arg("is-official", "false")),
- registryResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- IsOfficial: true,
- },
- },
- expectedResults: []registry.SearchResult{},
- },
- {
- name: "is-official=false",
- filtersArgs: filters.NewArgs(filters.Arg("is-official", "false")),
- registryResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- IsOfficial: false,
- },
- },
- expectedResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- IsOfficial: false,
- },
- },
- },
- {
- name: "stars=0",
- filtersArgs: filters.NewArgs(filters.Arg("stars", "0")),
- registryResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- StarCount: 0,
- },
- },
- expectedResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- StarCount: 0,
- },
- },
- },
- {
- name: "stars=0, no results",
- filtersArgs: filters.NewArgs(filters.Arg("stars", "1")),
- registryResults: []registry.SearchResult{
- {
- Name: "name",
- Description: "description",
- StarCount: 0,
- },
- },
- expectedResults: []registry.SearchResult{},
- },
- {
- name: "stars=1",
- filtersArgs: filters.NewArgs(filters.Arg("stars", "1")),
- registryResults: []registry.SearchResult{
- {
- Name: "name0",
- Description: "description0",
- StarCount: 0,
- },
- {
- Name: "name1",
- Description: "description1",
- StarCount: 1,
- },
- },
- expectedResults: []registry.SearchResult{
- {
- Name: "name1",
- Description: "description1",
- StarCount: 1,
- },
- },
- },
- {
- name: "stars=1, is-official=true, is-automated=true",
- filtersArgs: filters.NewArgs(
- filters.Arg("stars", "1"),
- filters.Arg("is-official", "true"),
- filters.Arg("is-automated", "true"),
- ),
- registryResults: []registry.SearchResult{
- {
- Name: "name0",
- Description: "description0",
- StarCount: 0,
- IsOfficial: true,
- IsAutomated: true,
- },
- {
- Name: "name1",
- Description: "description1",
- StarCount: 1,
- IsOfficial: false,
- IsAutomated: true,
- },
- {
- Name: "name2",
- Description: "description2",
- StarCount: 1,
- IsOfficial: true,
- IsAutomated: false,
- },
- {
- Name: "name3",
- Description: "description3",
- StarCount: 2,
- IsOfficial: true,
- IsAutomated: true,
- },
- },
- expectedResults: []registry.SearchResult{
- {
- Name: "name3",
- Description: "description3",
- StarCount: 2,
- IsOfficial: true,
- IsAutomated: true,
- },
- },
- },
- }
- for _, tc := range successCases {
- tc := tc
- t.Run(tc.name, func(t *testing.T) {
- srv := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
- w.Header().Set("Content-type", "application/json")
- json.NewEncoder(w).Encode(registry.SearchResults{
- Query: term,
- NumResults: len(tc.registryResults),
- Results: tc.registryResults,
- })
- }))
- defer srv.Close()
- // Construct the search term by cutting the 'http://' prefix off srv.URL.
- searchTerm := srv.URL[7:] + "/" + term
- reg, err := NewService(ServiceOptions{})
- assert.NilError(t, err)
- results, err := reg.Search(context.Background(), tc.filtersArgs, searchTerm, 0, nil, map[string][]string{})
- assert.NilError(t, err)
- assert.DeepEqual(t, results, tc.expectedResults)
- })
- }
- }
|