github.com/sams1990/dockerrepo@v17.12.1-ce-rc2+incompatible/client/image_prune_test.go (about)

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