github.com/adityamillind98/moby@v23.0.0-rc.4+incompatible/client/image_list_test.go (about) 1 package client // import "github.com/docker/docker/client" 2 3 import ( 4 "bytes" 5 "context" 6 "encoding/json" 7 "fmt" 8 "io" 9 "net/http" 10 "net/url" 11 "strings" 12 "testing" 13 14 "github.com/docker/docker/api/types" 15 "github.com/docker/docker/api/types/filters" 16 "github.com/docker/docker/errdefs" 17 "gotest.tools/v3/assert" 18 is "gotest.tools/v3/assert/cmp" 19 ) 20 21 func TestImageListError(t *testing.T) { 22 client := &Client{ 23 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 24 } 25 26 _, err := client.ImageList(context.Background(), types.ImageListOptions{}) 27 if !errdefs.IsSystem(err) { 28 t.Fatalf("expected a Server Error, got %[1]T: %[1]v", err) 29 } 30 } 31 32 func TestImageList(t *testing.T) { 33 expectedURL := "/images/json" 34 35 noDanglingfilters := filters.NewArgs() 36 noDanglingfilters.Add("dangling", "false") 37 38 filters := filters.NewArgs() 39 filters.Add("label", "label1") 40 filters.Add("label", "label2") 41 filters.Add("dangling", "true") 42 43 listCases := []struct { 44 options types.ImageListOptions 45 expectedQueryParams map[string]string 46 }{ 47 { 48 options: types.ImageListOptions{}, 49 expectedQueryParams: map[string]string{ 50 "all": "", 51 "filter": "", 52 "filters": "", 53 }, 54 }, 55 { 56 options: types.ImageListOptions{ 57 Filters: filters, 58 }, 59 expectedQueryParams: map[string]string{ 60 "all": "", 61 "filter": "", 62 "filters": `{"dangling":{"true":true},"label":{"label1":true,"label2":true}}`, 63 }, 64 }, 65 { 66 options: types.ImageListOptions{ 67 Filters: noDanglingfilters, 68 }, 69 expectedQueryParams: map[string]string{ 70 "all": "", 71 "filter": "", 72 "filters": `{"dangling":{"false":true}}`, 73 }, 74 }, 75 } 76 for _, listCase := range listCases { 77 client := &Client{ 78 client: newMockClient(func(req *http.Request) (*http.Response, error) { 79 if !strings.HasPrefix(req.URL.Path, expectedURL) { 80 return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) 81 } 82 query := req.URL.Query() 83 for key, expected := range listCase.expectedQueryParams { 84 actual := query.Get(key) 85 if actual != expected { 86 return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual) 87 } 88 } 89 content, err := json.Marshal([]types.ImageSummary{ 90 { 91 ID: "image_id2", 92 }, 93 { 94 ID: "image_id2", 95 }, 96 }) 97 if err != nil { 98 return nil, err 99 } 100 return &http.Response{ 101 StatusCode: http.StatusOK, 102 Body: io.NopCloser(bytes.NewReader(content)), 103 }, nil 104 }), 105 } 106 107 images, err := client.ImageList(context.Background(), listCase.options) 108 if err != nil { 109 t.Fatal(err) 110 } 111 if len(images) != 2 { 112 t.Fatalf("expected 2 images, got %v", images) 113 } 114 } 115 } 116 117 func TestImageListApiBefore125(t *testing.T) { 118 expectedFilter := "image:tag" 119 client := &Client{ 120 client: newMockClient(func(req *http.Request) (*http.Response, error) { 121 query := req.URL.Query() 122 actualFilter := query.Get("filter") 123 if actualFilter != expectedFilter { 124 return nil, fmt.Errorf("filter not set in URL query properly. Expected '%s', got %s", expectedFilter, actualFilter) 125 } 126 actualFilters := query.Get("filters") 127 if actualFilters != "" { 128 return nil, fmt.Errorf("filters should have not been present, were with value: %s", actualFilters) 129 } 130 content, err := json.Marshal([]types.ImageSummary{ 131 { 132 ID: "image_id2", 133 }, 134 { 135 ID: "image_id2", 136 }, 137 }) 138 if err != nil { 139 return nil, err 140 } 141 return &http.Response{ 142 StatusCode: http.StatusOK, 143 Body: io.NopCloser(bytes.NewReader(content)), 144 }, nil 145 }), 146 version: "1.24", 147 } 148 149 filters := filters.NewArgs() 150 filters.Add("reference", "image:tag") 151 152 options := types.ImageListOptions{ 153 Filters: filters, 154 } 155 156 images, err := client.ImageList(context.Background(), options) 157 if err != nil { 158 t.Fatal(err) 159 } 160 if len(images) != 2 { 161 t.Fatalf("expected 2 images, got %v", images) 162 } 163 } 164 165 // Checks if shared-size query parameter is set/not being set correctly 166 // for /images/json. 167 func TestImageListWithSharedSize(t *testing.T) { 168 t.Parallel() 169 const sharedSize = "shared-size" 170 for _, tc := range []struct { 171 name string 172 version string 173 options types.ImageListOptions 174 sharedSize string // expected value for the shared-size query param, or empty if it should not be set. 175 }{ 176 {name: "unset after 1.42, no options set", version: "1.42"}, 177 {name: "set after 1.42, if requested", version: "1.42", options: types.ImageListOptions{SharedSize: true}, sharedSize: "1"}, 178 {name: "unset before 1.42, even if requested", version: "1.41", options: types.ImageListOptions{SharedSize: true}}, 179 } { 180 tc := tc 181 t.Run(tc.name, func(t *testing.T) { 182 t.Parallel() 183 var query url.Values 184 client := &Client{ 185 client: newMockClient(func(req *http.Request) (*http.Response, error) { 186 query = req.URL.Query() 187 return &http.Response{ 188 StatusCode: http.StatusOK, 189 Body: io.NopCloser(strings.NewReader("[]")), 190 }, nil 191 }), 192 version: tc.version, 193 } 194 _, err := client.ImageList(context.Background(), tc.options) 195 assert.Check(t, err) 196 expectedSet := tc.sharedSize != "" 197 assert.Check(t, is.Equal(query.Has(sharedSize), expectedSet)) 198 assert.Check(t, is.Equal(query.Get(sharedSize), tc.sharedSize)) 199 }) 200 } 201 }