github.com/OpenFlowLabs/moby@v17.12.1-ce-rc2+incompatible/client/image_remove_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/stretchr/testify/assert"
    14  	"golang.org/x/net/context"
    15  )
    16  
    17  func TestImageRemoveError(t *testing.T) {
    18  	client := &Client{
    19  		client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
    20  	}
    21  
    22  	_, err := client.ImageRemove(context.Background(), "image_id", types.ImageRemoveOptions{})
    23  	assert.EqualError(t, err, "Error response from daemon: Server error")
    24  }
    25  
    26  func TestImageRemoveImageNotFound(t *testing.T) {
    27  	client := &Client{
    28  		client: newMockClient(errorMock(http.StatusNotFound, "missing")),
    29  	}
    30  
    31  	_, err := client.ImageRemove(context.Background(), "unknown", types.ImageRemoveOptions{})
    32  	assert.EqualError(t, err, "Error: No such image: unknown")
    33  	assert.True(t, IsErrNotFound(err))
    34  }
    35  
    36  func TestImageRemove(t *testing.T) {
    37  	expectedURL := "/images/image_id"
    38  	removeCases := []struct {
    39  		force               bool
    40  		pruneChildren       bool
    41  		expectedQueryParams map[string]string
    42  	}{
    43  		{
    44  			force:         false,
    45  			pruneChildren: false,
    46  			expectedQueryParams: map[string]string{
    47  				"force":   "",
    48  				"noprune": "1",
    49  			},
    50  		}, {
    51  			force:         true,
    52  			pruneChildren: true,
    53  			expectedQueryParams: map[string]string{
    54  				"force":   "1",
    55  				"noprune": "",
    56  			},
    57  		},
    58  	}
    59  	for _, removeCase := range removeCases {
    60  		client := &Client{
    61  			client: newMockClient(func(req *http.Request) (*http.Response, error) {
    62  				if !strings.HasPrefix(req.URL.Path, expectedURL) {
    63  					return nil, fmt.Errorf("expected URL '%s', got '%s'", expectedURL, req.URL)
    64  				}
    65  				if req.Method != "DELETE" {
    66  					return nil, fmt.Errorf("expected DELETE method, got %s", req.Method)
    67  				}
    68  				query := req.URL.Query()
    69  				for key, expected := range removeCase.expectedQueryParams {
    70  					actual := query.Get(key)
    71  					if actual != expected {
    72  						return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual)
    73  					}
    74  				}
    75  				b, err := json.Marshal([]types.ImageDeleteResponseItem{
    76  					{
    77  						Untagged: "image_id1",
    78  					},
    79  					{
    80  						Deleted: "image_id",
    81  					},
    82  				})
    83  				if err != nil {
    84  					return nil, err
    85  				}
    86  
    87  				return &http.Response{
    88  					StatusCode: http.StatusOK,
    89  					Body:       ioutil.NopCloser(bytes.NewReader(b)),
    90  				}, nil
    91  			}),
    92  		}
    93  		imageDeletes, err := client.ImageRemove(context.Background(), "image_id", types.ImageRemoveOptions{
    94  			Force:         removeCase.force,
    95  			PruneChildren: removeCase.pruneChildren,
    96  		})
    97  		if err != nil {
    98  			t.Fatal(err)
    99  		}
   100  		if len(imageDeletes) != 2 {
   101  			t.Fatalf("expected 2 deleted images, got %v", imageDeletes)
   102  		}
   103  	}
   104  }