github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/daemon/images/image_search_test.go (about)

     1  package images // import "github.com/docker/docker/daemon/images"
     2  
     3  import (
     4  	"context"
     5  	"errors"
     6  	"strings"
     7  	"testing"
     8  
     9  	"github.com/docker/docker/api/types"
    10  	registrytypes "github.com/docker/docker/api/types/registry"
    11  	"github.com/docker/docker/registry"
    12  )
    13  
    14  type FakeService struct {
    15  	registry.DefaultService
    16  
    17  	shouldReturnError bool
    18  
    19  	term    string
    20  	results []registrytypes.SearchResult
    21  }
    22  
    23  func (s *FakeService) Search(ctx context.Context, term string, limit int, authConfig *types.AuthConfig, userAgent string, headers map[string][]string) (*registrytypes.SearchResults, error) {
    24  	if s.shouldReturnError {
    25  		return nil, errors.New("Search unknown error")
    26  	}
    27  	return &registrytypes.SearchResults{
    28  		Query:      s.term,
    29  		NumResults: len(s.results),
    30  		Results:    s.results,
    31  	}, nil
    32  }
    33  
    34  func TestSearchRegistryForImagesErrors(t *testing.T) {
    35  	errorCases := []struct {
    36  		filtersArgs       string
    37  		shouldReturnError bool
    38  		expectedError     string
    39  	}{
    40  		{
    41  			expectedError:     "Search unknown error",
    42  			shouldReturnError: true,
    43  		},
    44  		{
    45  			filtersArgs:   "invalid json",
    46  			expectedError: "invalid character 'i' looking for beginning of value",
    47  		},
    48  		{
    49  			filtersArgs:   `{"type":{"custom":true}}`,
    50  			expectedError: "Invalid filter 'type'",
    51  		},
    52  		{
    53  			filtersArgs:   `{"is-automated":{"invalid":true}}`,
    54  			expectedError: "Invalid filter 'is-automated=[invalid]'",
    55  		},
    56  		{
    57  			filtersArgs:   `{"is-automated":{"true":true,"false":true}}`,
    58  			expectedError: "Invalid filter 'is-automated",
    59  		},
    60  		{
    61  			filtersArgs:   `{"is-official":{"invalid":true}}`,
    62  			expectedError: "Invalid filter 'is-official=[invalid]'",
    63  		},
    64  		{
    65  			filtersArgs:   `{"is-official":{"true":true,"false":true}}`,
    66  			expectedError: "Invalid filter 'is-official",
    67  		},
    68  		{
    69  			filtersArgs:   `{"stars":{"invalid":true}}`,
    70  			expectedError: "Invalid filter 'stars=invalid'",
    71  		},
    72  		{
    73  			filtersArgs:   `{"stars":{"1":true,"invalid":true}}`,
    74  			expectedError: "Invalid filter 'stars=invalid'",
    75  		},
    76  	}
    77  	for index, e := range errorCases {
    78  		daemon := &ImageService{
    79  			registryService: &FakeService{
    80  				shouldReturnError: e.shouldReturnError,
    81  			},
    82  		}
    83  		_, err := daemon.SearchRegistryForImages(context.Background(), e.filtersArgs, "term", 25, nil, map[string][]string{})
    84  		if err == nil {
    85  			t.Errorf("%d: expected an error, got nothing", index)
    86  		}
    87  		if !strings.Contains(err.Error(), e.expectedError) {
    88  			t.Errorf("%d: expected error to contain %s, got %s", index, e.expectedError, err.Error())
    89  		}
    90  	}
    91  }
    92  
    93  func TestSearchRegistryForImages(t *testing.T) {
    94  	term := "term"
    95  	successCases := []struct {
    96  		filtersArgs     string
    97  		registryResults []registrytypes.SearchResult
    98  		expectedResults []registrytypes.SearchResult
    99  	}{
   100  		{
   101  			filtersArgs:     "",
   102  			registryResults: []registrytypes.SearchResult{},
   103  			expectedResults: []registrytypes.SearchResult{},
   104  		},
   105  		{
   106  			filtersArgs: "",
   107  			registryResults: []registrytypes.SearchResult{
   108  				{
   109  					Name:        "name",
   110  					Description: "description",
   111  				},
   112  			},
   113  			expectedResults: []registrytypes.SearchResult{
   114  				{
   115  					Name:        "name",
   116  					Description: "description",
   117  				},
   118  			},
   119  		},
   120  		{
   121  			filtersArgs: `{"is-automated":{"true":true}}`,
   122  			registryResults: []registrytypes.SearchResult{
   123  				{
   124  					Name:        "name",
   125  					Description: "description",
   126  				},
   127  			},
   128  			expectedResults: []registrytypes.SearchResult{},
   129  		},
   130  		{
   131  			filtersArgs: `{"is-automated":{"true":true}}`,
   132  			registryResults: []registrytypes.SearchResult{
   133  				{
   134  					Name:        "name",
   135  					Description: "description",
   136  					IsAutomated: true,
   137  				},
   138  			},
   139  			expectedResults: []registrytypes.SearchResult{
   140  				{
   141  					Name:        "name",
   142  					Description: "description",
   143  					IsAutomated: true,
   144  				},
   145  			},
   146  		},
   147  		{
   148  			filtersArgs: `{"is-automated":{"false":true}}`,
   149  			registryResults: []registrytypes.SearchResult{
   150  				{
   151  					Name:        "name",
   152  					Description: "description",
   153  					IsAutomated: true,
   154  				},
   155  			},
   156  			expectedResults: []registrytypes.SearchResult{},
   157  		},
   158  		{
   159  			filtersArgs: `{"is-automated":{"false":true}}`,
   160  			registryResults: []registrytypes.SearchResult{
   161  				{
   162  					Name:        "name",
   163  					Description: "description",
   164  					IsAutomated: false,
   165  				},
   166  			},
   167  			expectedResults: []registrytypes.SearchResult{
   168  				{
   169  					Name:        "name",
   170  					Description: "description",
   171  					IsAutomated: false,
   172  				},
   173  			},
   174  		},
   175  		{
   176  			filtersArgs: `{"is-official":{"true":true}}`,
   177  			registryResults: []registrytypes.SearchResult{
   178  				{
   179  					Name:        "name",
   180  					Description: "description",
   181  				},
   182  			},
   183  			expectedResults: []registrytypes.SearchResult{},
   184  		},
   185  		{
   186  			filtersArgs: `{"is-official":{"true":true}}`,
   187  			registryResults: []registrytypes.SearchResult{
   188  				{
   189  					Name:        "name",
   190  					Description: "description",
   191  					IsOfficial:  true,
   192  				},
   193  			},
   194  			expectedResults: []registrytypes.SearchResult{
   195  				{
   196  					Name:        "name",
   197  					Description: "description",
   198  					IsOfficial:  true,
   199  				},
   200  			},
   201  		},
   202  		{
   203  			filtersArgs: `{"is-official":{"false":true}}`,
   204  			registryResults: []registrytypes.SearchResult{
   205  				{
   206  					Name:        "name",
   207  					Description: "description",
   208  					IsOfficial:  true,
   209  				},
   210  			},
   211  			expectedResults: []registrytypes.SearchResult{},
   212  		},
   213  		{
   214  			filtersArgs: `{"is-official":{"false":true}}`,
   215  			registryResults: []registrytypes.SearchResult{
   216  				{
   217  					Name:        "name",
   218  					Description: "description",
   219  					IsOfficial:  false,
   220  				},
   221  			},
   222  			expectedResults: []registrytypes.SearchResult{
   223  				{
   224  					Name:        "name",
   225  					Description: "description",
   226  					IsOfficial:  false,
   227  				},
   228  			},
   229  		},
   230  		{
   231  			filtersArgs: `{"stars":{"0":true}}`,
   232  			registryResults: []registrytypes.SearchResult{
   233  				{
   234  					Name:        "name",
   235  					Description: "description",
   236  					StarCount:   0,
   237  				},
   238  			},
   239  			expectedResults: []registrytypes.SearchResult{
   240  				{
   241  					Name:        "name",
   242  					Description: "description",
   243  					StarCount:   0,
   244  				},
   245  			},
   246  		},
   247  		{
   248  			filtersArgs: `{"stars":{"1":true}}`,
   249  			registryResults: []registrytypes.SearchResult{
   250  				{
   251  					Name:        "name",
   252  					Description: "description",
   253  					StarCount:   0,
   254  				},
   255  			},
   256  			expectedResults: []registrytypes.SearchResult{},
   257  		},
   258  		{
   259  			filtersArgs: `{"stars":{"1":true}}`,
   260  			registryResults: []registrytypes.SearchResult{
   261  				{
   262  					Name:        "name0",
   263  					Description: "description0",
   264  					StarCount:   0,
   265  				},
   266  				{
   267  					Name:        "name1",
   268  					Description: "description1",
   269  					StarCount:   1,
   270  				},
   271  			},
   272  			expectedResults: []registrytypes.SearchResult{
   273  				{
   274  					Name:        "name1",
   275  					Description: "description1",
   276  					StarCount:   1,
   277  				},
   278  			},
   279  		},
   280  		{
   281  			filtersArgs: `{"stars":{"1":true}, "is-official":{"true":true}, "is-automated":{"true":true}}`,
   282  			registryResults: []registrytypes.SearchResult{
   283  				{
   284  					Name:        "name0",
   285  					Description: "description0",
   286  					StarCount:   0,
   287  					IsOfficial:  true,
   288  					IsAutomated: true,
   289  				},
   290  				{
   291  					Name:        "name1",
   292  					Description: "description1",
   293  					StarCount:   1,
   294  					IsOfficial:  false,
   295  					IsAutomated: true,
   296  				},
   297  				{
   298  					Name:        "name2",
   299  					Description: "description2",
   300  					StarCount:   1,
   301  					IsOfficial:  true,
   302  					IsAutomated: false,
   303  				},
   304  				{
   305  					Name:        "name3",
   306  					Description: "description3",
   307  					StarCount:   2,
   308  					IsOfficial:  true,
   309  					IsAutomated: true,
   310  				},
   311  			},
   312  			expectedResults: []registrytypes.SearchResult{
   313  				{
   314  					Name:        "name3",
   315  					Description: "description3",
   316  					StarCount:   2,
   317  					IsOfficial:  true,
   318  					IsAutomated: true,
   319  				},
   320  			},
   321  		},
   322  	}
   323  	for index, s := range successCases {
   324  		daemon := &ImageService{
   325  			registryService: &FakeService{
   326  				term:    term,
   327  				results: s.registryResults,
   328  			},
   329  		}
   330  		results, err := daemon.SearchRegistryForImages(context.Background(), s.filtersArgs, term, 25, nil, map[string][]string{})
   331  		if err != nil {
   332  			t.Errorf("%d: %v", index, err)
   333  		}
   334  		if results.Query != term {
   335  			t.Errorf("%d: expected Query to be %s, got %s", index, term, results.Query)
   336  		}
   337  		if results.NumResults != len(s.expectedResults) {
   338  			t.Errorf("%d: expected NumResults to be %d, got %d", index, len(s.expectedResults), results.NumResults)
   339  		}
   340  		for _, result := range results.Results {
   341  			found := false
   342  			for _, expectedResult := range s.expectedResults {
   343  				if expectedResult.Name == result.Name &&
   344  					expectedResult.Description == result.Description &&
   345  					expectedResult.IsAutomated == result.IsAutomated &&
   346  					expectedResult.IsOfficial == result.IsOfficial &&
   347  					expectedResult.StarCount == result.StarCount {
   348  					found = true
   349  					break
   350  				}
   351  			}
   352  			if !found {
   353  				t.Errorf("%d: expected results %v, got %v", index, s.expectedResults, results.Results)
   354  			}
   355  		}
   356  	}
   357  }