gopkg.in/docker/docker.v20@v20.10.27/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  }