github.com/rish1988/moby@v25.0.2+incompatible/client/image_import_test.go (about)

     1  package client // import "github.com/docker/docker/client"
     2  
     3  import (
     4  	"bytes"
     5  	"context"
     6  	"fmt"
     7  	"io"
     8  	"net/http"
     9  	"reflect"
    10  	"strings"
    11  	"testing"
    12  
    13  	"github.com/docker/docker/api/types"
    14  	"github.com/docker/docker/api/types/image"
    15  	"github.com/docker/docker/errdefs"
    16  	"gotest.tools/v3/assert"
    17  	is "gotest.tools/v3/assert/cmp"
    18  )
    19  
    20  func TestImageImportError(t *testing.T) {
    21  	client := &Client{
    22  		client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
    23  	}
    24  	_, err := client.ImageImport(context.Background(), types.ImageImportSource{}, "image:tag", image.ImportOptions{})
    25  	assert.Check(t, is.ErrorType(err, errdefs.IsSystem))
    26  }
    27  
    28  func TestImageImport(t *testing.T) {
    29  	expectedURL := "/images/create"
    30  	client := &Client{
    31  		client: newMockClient(func(r *http.Request) (*http.Response, error) {
    32  			if !strings.HasPrefix(r.URL.Path, expectedURL) {
    33  				return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, r.URL)
    34  			}
    35  			query := r.URL.Query()
    36  			fromSrc := query.Get("fromSrc")
    37  			if fromSrc != "image_source" {
    38  				return nil, fmt.Errorf("fromSrc not set in URL query properly. Expected 'image_source', got %s", fromSrc)
    39  			}
    40  			repo := query.Get("repo")
    41  			if repo != "repository_name:imported" {
    42  				return nil, fmt.Errorf("repo not set in URL query properly. Expected 'repository_name:imported', got %s", repo)
    43  			}
    44  			tag := query.Get("tag")
    45  			if tag != "imported" {
    46  				return nil, fmt.Errorf("tag not set in URL query properly. Expected 'imported', got %s", tag)
    47  			}
    48  			message := query.Get("message")
    49  			if message != "A message" {
    50  				return nil, fmt.Errorf("message not set in URL query properly. Expected 'A message', got %s", message)
    51  			}
    52  			changes := query["changes"]
    53  			expectedChanges := []string{"change1", "change2"}
    54  			if !reflect.DeepEqual(expectedChanges, changes) {
    55  				return nil, fmt.Errorf("changes not set in URL query properly. Expected %v, got %v", expectedChanges, changes)
    56  			}
    57  
    58  			return &http.Response{
    59  				StatusCode: http.StatusOK,
    60  				Body:       io.NopCloser(bytes.NewReader([]byte("response"))),
    61  			}, nil
    62  		}),
    63  	}
    64  	importResponse, err := client.ImageImport(context.Background(), types.ImageImportSource{
    65  		Source:     strings.NewReader("source"),
    66  		SourceName: "image_source",
    67  	}, "repository_name:imported", image.ImportOptions{
    68  		Tag:     "imported",
    69  		Message: "A message",
    70  		Changes: []string{"change1", "change2"},
    71  	})
    72  	if err != nil {
    73  		t.Fatal(err)
    74  	}
    75  	response, err := io.ReadAll(importResponse)
    76  	if err != nil {
    77  		t.Fatal(err)
    78  	}
    79  	importResponse.Close()
    80  	if string(response) != "response" {
    81  		t.Fatalf("expected response to contain 'response', got %s", string(response))
    82  	}
    83  }