github.com/fabiokung/docker@v0.11.2-0.20170222101415-4534dcd49497/client/image_tag_test.go (about) 1 package client 2 3 import ( 4 "bytes" 5 "fmt" 6 "io/ioutil" 7 "net/http" 8 "strings" 9 "testing" 10 11 "golang.org/x/net/context" 12 ) 13 14 func TestImageTagError(t *testing.T) { 15 client := &Client{ 16 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 17 } 18 19 err := client.ImageTag(context.Background(), "image_id", "repo:tag") 20 if err == nil || err.Error() != "Error response from daemon: Server error" { 21 t.Fatalf("expected a Server Error, got %v", err) 22 } 23 } 24 25 // Note: this is not testing all the InvalidReference as it's the responsibility 26 // of distribution/reference package. 27 func TestImageTagInvalidReference(t *testing.T) { 28 client := &Client{ 29 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 30 } 31 32 err := client.ImageTag(context.Background(), "image_id", "aa/asdf$$^/aa") 33 if err == nil || err.Error() != `Error parsing reference: "aa/asdf$$^/aa" is not a valid repository/tag: invalid reference format` { 34 t.Fatalf("expected ErrReferenceInvalidFormat, got %v", err) 35 } 36 } 37 38 func TestImageTagInvalidSourceImageName(t *testing.T) { 39 client := &Client{ 40 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 41 } 42 43 err := client.ImageTag(context.Background(), "invalid_source_image_name_", "repo:tag") 44 if err == nil || err.Error() != "Error parsing reference: \"invalid_source_image_name_\" is not a valid repository/tag: invalid reference format" { 45 t.Fatalf("expected Parsing Reference Error, got %v", err) 46 } 47 } 48 49 func TestImageTag(t *testing.T) { 50 expectedURL := "/images/image_id/tag" 51 tagCases := []struct { 52 reference string 53 expectedQueryParams map[string]string 54 }{ 55 { 56 reference: "repository:tag1", 57 expectedQueryParams: map[string]string{ 58 "repo": "repository", 59 "tag": "tag1", 60 }, 61 }, { 62 reference: "another_repository:latest", 63 expectedQueryParams: map[string]string{ 64 "repo": "another_repository", 65 "tag": "latest", 66 }, 67 }, { 68 reference: "another_repository", 69 expectedQueryParams: map[string]string{ 70 "repo": "another_repository", 71 "tag": "latest", 72 }, 73 }, { 74 reference: "test/another_repository", 75 expectedQueryParams: map[string]string{ 76 "repo": "test/another_repository", 77 "tag": "latest", 78 }, 79 }, { 80 reference: "test/another_repository:tag1", 81 expectedQueryParams: map[string]string{ 82 "repo": "test/another_repository", 83 "tag": "tag1", 84 }, 85 }, { 86 reference: "test/test/another_repository:tag1", 87 expectedQueryParams: map[string]string{ 88 "repo": "test/test/another_repository", 89 "tag": "tag1", 90 }, 91 }, { 92 reference: "test:5000/test/another_repository:tag1", 93 expectedQueryParams: map[string]string{ 94 "repo": "test:5000/test/another_repository", 95 "tag": "tag1", 96 }, 97 }, { 98 reference: "test:5000/test/another_repository", 99 expectedQueryParams: map[string]string{ 100 "repo": "test:5000/test/another_repository", 101 "tag": "latest", 102 }, 103 }, 104 } 105 for _, tagCase := range tagCases { 106 client := &Client{ 107 client: newMockClient(func(req *http.Request) (*http.Response, error) { 108 if !strings.HasPrefix(req.URL.Path, expectedURL) { 109 return nil, fmt.Errorf("expected URL '%s', got '%s'", expectedURL, req.URL) 110 } 111 if req.Method != "POST" { 112 return nil, fmt.Errorf("expected POST method, got %s", req.Method) 113 } 114 query := req.URL.Query() 115 for key, expected := range tagCase.expectedQueryParams { 116 actual := query.Get(key) 117 if actual != expected { 118 return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual) 119 } 120 } 121 return &http.Response{ 122 StatusCode: http.StatusOK, 123 Body: ioutil.NopCloser(bytes.NewReader([]byte(""))), 124 }, nil 125 }), 126 } 127 err := client.ImageTag(context.Background(), "image_id", tagCase.reference) 128 if err != nil { 129 t.Fatal(err) 130 } 131 } 132 }