github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/client/image_prune_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/errdefs" 14 15 "github.com/docker/docker/api/types" 16 "github.com/docker/docker/api/types/filters" 17 "gotest.tools/v3/assert" 18 is "gotest.tools/v3/assert/cmp" 19 ) 20 21 func TestImagesPruneError(t *testing.T) { 22 client := &Client{ 23 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 24 version: "1.25", 25 } 26 27 _, err := client.ImagesPrune(context.Background(), filters.NewArgs()) 28 if !errdefs.IsSystem(err) { 29 t.Fatalf("expected a Server Error, got %[1]T: %[1]v", err) 30 } 31 } 32 33 func TestImagesPrune(t *testing.T) { 34 expectedURL := "/v1.25/images/prune" 35 36 danglingFilters := filters.NewArgs() 37 danglingFilters.Add("dangling", "true") 38 39 noDanglingFilters := filters.NewArgs() 40 noDanglingFilters.Add("dangling", "false") 41 42 labelFilters := filters.NewArgs() 43 labelFilters.Add("dangling", "true") 44 labelFilters.Add("label", "label1=foo") 45 labelFilters.Add("label", "label2!=bar") 46 47 listCases := []struct { 48 filters filters.Args 49 expectedQueryParams map[string]string 50 }{ 51 { 52 filters: filters.Args{}, 53 expectedQueryParams: map[string]string{ 54 "until": "", 55 "filter": "", 56 "filters": "", 57 }, 58 }, 59 { 60 filters: danglingFilters, 61 expectedQueryParams: map[string]string{ 62 "until": "", 63 "filter": "", 64 "filters": `{"dangling":{"true":true}}`, 65 }, 66 }, 67 { 68 filters: noDanglingFilters, 69 expectedQueryParams: map[string]string{ 70 "until": "", 71 "filter": "", 72 "filters": `{"dangling":{"false":true}}`, 73 }, 74 }, 75 { 76 filters: labelFilters, 77 expectedQueryParams: map[string]string{ 78 "until": "", 79 "filter": "", 80 "filters": `{"dangling":{"true":true},"label":{"label1=foo":true,"label2!=bar":true}}`, 81 }, 82 }, 83 } 84 for _, listCase := range listCases { 85 client := &Client{ 86 client: newMockClient(func(req *http.Request) (*http.Response, error) { 87 if !strings.HasPrefix(req.URL.Path, expectedURL) { 88 return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) 89 } 90 query := req.URL.Query() 91 for key, expected := range listCase.expectedQueryParams { 92 actual := query.Get(key) 93 assert.Check(t, is.Equal(expected, actual)) 94 } 95 content, err := json.Marshal(types.ImagesPruneReport{ 96 ImagesDeleted: []types.ImageDeleteResponseItem{ 97 { 98 Deleted: "image_id1", 99 }, 100 { 101 Deleted: "image_id2", 102 }, 103 }, 104 SpaceReclaimed: 9999, 105 }) 106 if err != nil { 107 return nil, err 108 } 109 return &http.Response{ 110 StatusCode: http.StatusOK, 111 Body: io.NopCloser(bytes.NewReader(content)), 112 }, nil 113 }), 114 version: "1.25", 115 } 116 117 report, err := client.ImagesPrune(context.Background(), listCase.filters) 118 assert.Check(t, err) 119 assert.Check(t, is.Len(report.ImagesDeleted, 2)) 120 assert.Check(t, is.Equal(uint64(9999), report.SpaceReclaimed)) 121 } 122 }