github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/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 "strings" 11 "testing" 12 13 "github.com/docker/docker/api/types" 14 "github.com/docker/docker/api/types/filters" 15 "github.com/docker/docker/errdefs" 16 ) 17 18 func TestImageListError(t *testing.T) { 19 client := &Client{ 20 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 21 } 22 23 _, err := client.ImageList(context.Background(), types.ImageListOptions{}) 24 if !errdefs.IsSystem(err) { 25 t.Fatalf("expected a Server Error, got %[1]T: %[1]v", err) 26 } 27 } 28 29 func TestImageList(t *testing.T) { 30 expectedURL := "/images/json" 31 32 noDanglingfilters := filters.NewArgs() 33 noDanglingfilters.Add("dangling", "false") 34 35 filters := filters.NewArgs() 36 filters.Add("label", "label1") 37 filters.Add("label", "label2") 38 filters.Add("dangling", "true") 39 40 listCases := []struct { 41 options types.ImageListOptions 42 expectedQueryParams map[string]string 43 }{ 44 { 45 options: types.ImageListOptions{}, 46 expectedQueryParams: map[string]string{ 47 "all": "", 48 "filter": "", 49 "filters": "", 50 }, 51 }, 52 { 53 options: types.ImageListOptions{ 54 Filters: filters, 55 }, 56 expectedQueryParams: map[string]string{ 57 "all": "", 58 "filter": "", 59 "filters": `{"dangling":{"true":true},"label":{"label1":true,"label2":true}}`, 60 }, 61 }, 62 { 63 options: types.ImageListOptions{ 64 Filters: noDanglingfilters, 65 }, 66 expectedQueryParams: map[string]string{ 67 "all": "", 68 "filter": "", 69 "filters": `{"dangling":{"false":true}}`, 70 }, 71 }, 72 } 73 for _, listCase := range listCases { 74 client := &Client{ 75 client: newMockClient(func(req *http.Request) (*http.Response, error) { 76 if !strings.HasPrefix(req.URL.Path, expectedURL) { 77 return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) 78 } 79 query := req.URL.Query() 80 for key, expected := range listCase.expectedQueryParams { 81 actual := query.Get(key) 82 if actual != expected { 83 return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual) 84 } 85 } 86 content, err := json.Marshal([]types.ImageSummary{ 87 { 88 ID: "image_id2", 89 }, 90 { 91 ID: "image_id2", 92 }, 93 }) 94 if err != nil { 95 return nil, err 96 } 97 return &http.Response{ 98 StatusCode: http.StatusOK, 99 Body: io.NopCloser(bytes.NewReader(content)), 100 }, nil 101 }), 102 } 103 104 images, err := client.ImageList(context.Background(), listCase.options) 105 if err != nil { 106 t.Fatal(err) 107 } 108 if len(images) != 2 { 109 t.Fatalf("expected 2 images, got %v", images) 110 } 111 } 112 } 113 114 func TestImageListApiBefore125(t *testing.T) { 115 expectedFilter := "image:tag" 116 client := &Client{ 117 client: newMockClient(func(req *http.Request) (*http.Response, error) { 118 query := req.URL.Query() 119 actualFilter := query.Get("filter") 120 if actualFilter != expectedFilter { 121 return nil, fmt.Errorf("filter not set in URL query properly. Expected '%s', got %s", expectedFilter, actualFilter) 122 } 123 actualFilters := query.Get("filters") 124 if actualFilters != "" { 125 return nil, fmt.Errorf("filters should have not been present, were with value: %s", actualFilters) 126 } 127 content, err := json.Marshal([]types.ImageSummary{ 128 { 129 ID: "image_id2", 130 }, 131 { 132 ID: "image_id2", 133 }, 134 }) 135 if err != nil { 136 return nil, err 137 } 138 return &http.Response{ 139 StatusCode: http.StatusOK, 140 Body: io.NopCloser(bytes.NewReader(content)), 141 }, nil 142 }), 143 version: "1.24", 144 } 145 146 filters := filters.NewArgs() 147 filters.Add("reference", "image:tag") 148 149 options := types.ImageListOptions{ 150 Filters: filters, 151 } 152 153 images, err := client.ImageList(context.Background(), options) 154 if err != nil { 155 t.Fatal(err) 156 } 157 if len(images) != 2 { 158 t.Fatalf("expected 2 images, got %v", images) 159 } 160 }