github.com/rish1988/moby@v25.0.2+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"
     9  	"net/http"
    10  	"strings"
    11  	"testing"
    12  
    13  	"github.com/docker/docker/api/types/image"
    14  	"github.com/docker/docker/errdefs"
    15  
    16  	"github.com/docker/docker/api/types"
    17  	"github.com/docker/docker/api/types/filters"
    18  	"gotest.tools/v3/assert"
    19  	is "gotest.tools/v3/assert/cmp"
    20  )
    21  
    22  func TestImagesPruneError(t *testing.T) {
    23  	client := &Client{
    24  		client:  newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
    25  		version: "1.25",
    26  	}
    27  
    28  	_, err := client.ImagesPrune(context.Background(), filters.NewArgs())
    29  	assert.Check(t, is.ErrorType(err, errdefs.IsSystem))
    30  }
    31  
    32  func TestImagesPrune(t *testing.T) {
    33  	const expectedURL = "/v1.25/images/prune"
    34  
    35  	listCases := []struct {
    36  		filters             filters.Args
    37  		expectedQueryParams map[string]string
    38  	}{
    39  		{
    40  			filters: filters.Args{},
    41  			expectedQueryParams: map[string]string{
    42  				"until":   "",
    43  				"filter":  "",
    44  				"filters": "",
    45  			},
    46  		},
    47  		{
    48  			filters: filters.NewArgs(filters.Arg("dangling", "true")),
    49  			expectedQueryParams: map[string]string{
    50  				"until":   "",
    51  				"filter":  "",
    52  				"filters": `{"dangling":{"true":true}}`,
    53  			},
    54  		},
    55  		{
    56  			filters: filters.NewArgs(filters.Arg("dangling", "false")),
    57  			expectedQueryParams: map[string]string{
    58  				"until":   "",
    59  				"filter":  "",
    60  				"filters": `{"dangling":{"false":true}}`,
    61  			},
    62  		},
    63  		{
    64  			filters: filters.NewArgs(
    65  				filters.Arg("dangling", "true"),
    66  				filters.Arg("label", "label1=foo"),
    67  				filters.Arg("label", "label2!=bar"),
    68  			),
    69  			expectedQueryParams: map[string]string{
    70  				"until":   "",
    71  				"filter":  "",
    72  				"filters": `{"dangling":{"true":true},"label":{"label1=foo":true,"label2!=bar":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  					assert.Check(t, is.Equal(expected, actual))
    86  				}
    87  				content, err := json.Marshal(types.ImagesPruneReport{
    88  					ImagesDeleted: []image.DeleteResponse{
    89  						{
    90  							Deleted: "image_id1",
    91  						},
    92  						{
    93  							Deleted: "image_id2",
    94  						},
    95  					},
    96  					SpaceReclaimed: 9999,
    97  				})
    98  				if err != nil {
    99  					return nil, err
   100  				}
   101  				return &http.Response{
   102  					StatusCode: http.StatusOK,
   103  					Body:       io.NopCloser(bytes.NewReader(content)),
   104  				}, nil
   105  			}),
   106  			version: "1.25",
   107  		}
   108  
   109  		report, err := client.ImagesPrune(context.Background(), listCase.filters)
   110  		assert.Check(t, err)
   111  		assert.Check(t, is.Len(report.ImagesDeleted, 2))
   112  		assert.Check(t, is.Equal(uint64(9999), report.SpaceReclaimed))
   113  	}
   114  }