github.com/docker/docker@v299999999.0.0-20200612211812-aaf470eca7b5+incompatible/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/ioutil"
     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:       ioutil.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  }