8000 client/image_test: Use functional option to create mock client · moby/moby@be76bee · GitHub
[go: up one dir, main page]

Skip to content

Commit be76bee

Browse files
committed
client/image_test: Use functional option to create mock client
Signed-off-by: Paweł Gronowski <pawel.gronowski@docker.com>
1 parent 005a289 commit be76bee

14 files changed

+511
-566
lines changed

client/image_build_test.go

Lines changed: 38 additions & 40 deletions
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,9 @@ import (
1919
)
2020

2121
func TestImageBuildError(t *testing.T) {
22-
client := &Client{
23-
client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
24-
}
25-
_, err := client.ImageBuild(context.Background(), nil, build.ImageBuildOptions{})
22+
client, err := NewClientWithOpts(WithMockClient(errorMock(http.StatusInternalServerError, "Server error")))
23+
assert.NilError(t, err)
24+
_, err = client.ImageBuild(context.Background(), nil, build.ImageBuildOptions{})
2625
assert.Check(t, is.ErrorType(err, cerrdefs.IsInternal))
2726
}
2827

@@ -158,47 +157,46 @@ func TestImageBuild(t *testing.T) {
158157
}
159158
for _, buildCase := range buildCases {
160159
expectedURL := "/build"
161-
client := &Client{
162-
client: newMockClient(func(r *http.Request) (*http.Response, error) {
163-
if !strings.HasPrefix(r.URL.Path, expectedURL) {
164-
return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, r.URL)
165-
}
166-
// Check request headers
167-
registryConfig := r.Header.Get("X-Registry-Config")
168-
if registryConfig != buildCase.expectedRegistryConfig {
169-
return nil, fmt.Errorf("X-Registry-Config header not properly set in the request. Expected '%s', got %s", buildCase.expectedRegistryConfig, registryConfig)
170-
}
171-
contentType := r.Header.Get("Content-Type")
172-
if contentType != "application/x-tar" {
173-
return nil, fmt.Errorf("Content-type header not properly set in the request. Expected 'application/x-tar', got %s", contentType)
174-
}
160+
client, err := NewClientWithOpts(WithMockClient(func(r *http.Request) (*http.Response, error) {
161+
if !strings.HasPrefix(r.URL.Path, expectedURL) {
162+
return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, r.URL)
163+
}
164+
// Check request headers
165+
registryConfig := r.Header.Get("X-Registry-Config")
166+
if registryConfig != buildCase.expectedRegistryConfig {
167+
return nil, fmt.Errorf("X-Registry-Config header not properly set in the request. Expected '%s', got %s", buildCase.expectedRegistryConfig, registryConfig)
168+
}
169+
contentType := r.Header.Get("Content-Type")
170+
if contentType != "application/x-tar" {
171+
return nil, fmt.Errorf("Content-type header not properly set in the request. Expected 'application/x-tar', got %s", contentType)
172+
}
175173

176-
// Check query parameters
177-
query := r.URL.Query()
178-
for key, expected := range buildCase.expectedQueryParams {
179-
actual := query.Get(key)
180-
if actual != expected {
181-
return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual)
182-
}
174+
// Check query parameters
175+
query := r.URL.Query()
176+
for key, expected := range buildCase.expectedQueryParams {
177+
actual := query.Get(key)
178+
if actual != expected {
179+
return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual)
183180
}
181+
}
184182

185-
// Check tags
186-
if len(buildCase.expectedTags) > 0 {
187-
tags := query["t"]
188-
if !reflect.DeepEqual(tags, buildCase.expectedTags) {
189-
return nil, fmt.Errorf("t (tags) not set in URL query properly. Expected '%s', got %s", buildCase.expectedTags, tags)
190-
}
183+
// Check tags
184+
if len(buildCase.expectedTags) > 0 {
185+
tags := query["t"]
186+
if !reflect.DeepEqual(tags, buildCase.expectedTags) {
187+
return nil, fmt.Errorf("t (tags) not set in URL query properly. Expected '%s', got %s", buildCase.expectedTags, tags)
191188
}
189+
}
192190

193-
headers := http.Header{}
194-
headers.Add("Ostype", "MyOS")
195-
return &http.Response{
196-
StatusCode: http.StatusOK,
197-
Body: io.NopCloser(bytes.NewReader([]byte("body"))),
198-
Header: headers,
199-
}, nil
200-
}),
201-
}
191+
headers := http.Header{}
192+
headers.Add("Ostype", "MyOS")
193+
return &http.Response{
194+
StatusCode: http.StatusOK,
195+
Body: io.NopCloser(bytes.NewReader([]byte("body"))),
196+
Header: headers,
197+
}, nil
198+
}))
199+
asse 5DA8 rt.NilError(t, err)
202200
buildResponse, err := client.ImageBuild(context.Background(), nil, buildCase.buildOptions)
203201
assert.NilError(t, err)
204202
assert.Check(t, is.Equal(buildResponse.OSType, "MyOS"))

client/image_create_test.go

Lines changed: 26 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -16,10 +16,9 @@ import (
1616
)
1717

1818
func TestImageCreateError(t *testing.T) {
19-
client := &Client{
20-
client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
21-
}
22-
_, AE18 err := client.ImageCreate(context.Background(), "reference", ImageCreateOptions{})
19+
client, err := NewClientWithOpts(WithMockClient(errorMock(http.StatusInternalServerError, "Server error")))
20+
assert.NilError(t, err)
21+
_, err = client.ImageCreate(context.Background(), "reference", ImageCreateOptions{})
2322
assert.Check(t, is.ErrorType(err, cerrdefs.IsInternal))
2423
}
2524

@@ -32,33 +31,32 @@ func TestImageCreate(t *testing.T) {
3231
expectedRegistryAuth = "eyJodHRwczovL2luZGV4LmRvY2tlci5pby92MS8iOnsiYXV0aCI6ImRHOTBid289IiwiZW1haWwiOiJqb2huQGRvZS5jb20ifX0="
3332
)
3433

35-
client := &Client{
36-
client: newMockClient(func(r *http.Request) (*http.Response, error) {
37-
if !strings.HasPrefix(r.URL.Path, expectedURL) {
38-
return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, r.URL)
39-
}
40-
registryAuth := r.Header.Get(registry.AuthHeader)
41-
if registryAuth != expectedRegistryAuth {
42-
return nil, fmt.Errorf("%s header not properly set in the request. Expected '%s', got %s", registry.AuthHeader, expectedRegistryAuth, registryAuth)
43-
}
34+
client, err := NewClientWithOpts(WithMockClient(func(r *http.Request) (*http.Response, error) {
35+
if !strings.HasPrefix(r.URL.Path, expectedURL) {
36+
return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, r.URL)
37+
}
38+
registryAuth := r.Header.Get(registry.AuthHeader)
39+
if registryAuth != expectedRegistryAuth {
40+
return nil, fmt.Errorf("%s header not properly set in the request. Expected '%s', got %s", registry.AuthHeader, expectedRegistryAuth, registryAuth)
41+
}
4442

45-
query := r.URL.Query( 5DA8 )
46-
fromImage := query.Get("fromImage")
47-
if fromImage != expectedImage {
48-
return nil, fmt.Errorf("fromImage not set in URL query properly. Expected '%s', got %s", expectedImage, fromImage)
49-
}
43+
query := r.URL.Query()
44+
fromImage := query.Get("fromImage")
45+
if fromImage != expectedImage {
46+
return nil, fmt.Errorf("fromImage not set in URL query properly. Expected '%s', got %s", expectedImage, fromImage)
47+
}
5048

51-
tag := query.Get("tag")
52-
if tag != expectedTag {
53-
return nil, fmt.Errorf("tag not set in URL query properly. Expected '%s', got %s", expectedTag, tag)
54-
}
49+
tag := query.Get("tag")
50+
if tag != expectedTag {
51+
return nil, fmt.Errorf("tag not set in URL query properly. Expected '%s', got %s", expectedTag, tag)
52+
}
5553

56-
return &http.Response{
57-
StatusCode: http.StatusOK,
58-
Body: io.NopCloser(bytes.NewReader([]byte("body"))),
59-
}, nil
60-
}),
61-
}
54+
return &http.Response{
55+
StatusCode: http.StatusOK,
56+
Body: io.NopCloser(bytes.NewReader([]byte("body"))),
57+
}, nil
58+
}))
59+
assert.NilError(t, err)
6260

6361
createResponse, err := client.ImageCreate(context.Background(), specifiedReference, ImageCreateOptions{
6462
RegistryAuth: expectedRegistryAuth,

client/image_history_test.go

Lines changed: 12 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@ import (
1515
)
1616

1717
func TestImageHistoryError(t *testing.T) {
18-
client := &Client{
19-
client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
20-
}
21-
_, err := client.ImageHistory(context.Background(), "nothing")
18+
client, err := NewClientWithOpts(WithMockClient(errorMock(http.StatusInternalServerError, "Server error")))
19+
assert.NilError(t, err)
20+
_, err = client.ImageHistory(context.Background(), "nothing")
2221
assert.Check(t, is.ErrorType(err, cerrdefs.IsInternal))
2322
}
2423

@@ -28,16 +27,15 @@ func TestImageHistory(t *testing.T) {
2827
historyResponse = `[{"Comment":"","Created":0,"CreatedBy":"","Id":"image_id1","Size":0,"Tags":["tag1","tag2"]},{"Comment":"","Created":0,"CreatedBy":"","Id":"image_id2","Size":0,"Tags":["tag1","tag2"]}]`
2928
expectedPlatform = `{"architecture":"arm64","os":"linux","variant":"v8"}`
3029
)
31-
client := &Client{
32-
client: newMockClient(func(r *http.Request) (*http.Response, error) {
33-
assert.Check(t, is.Equal(r.URL.Path, expectedURL))
34-
assert.Check(t, is.Equal(r.URL.Query().Get("platform"), expectedPlatform))
35-
return &http.Response{
36-
StatusCode: http.StatusOK,
37-
Body: io.NopCloser(strings.NewReader(historyResponse)),
38-
}, nil
39-
}),
40-
}
30+
client, err := NewClientWithOpts(WithMockClient(func(r *http.Request) (*http.Response, error) {
31+
assert.Check(t, is.Equal(r.URL.Path, expectedURL))
32+
assert.Check(t, is.Equal(r.URL.Query().Get("platform"), expectedPlatform))
33+
return &http.Response{
34+
StatusCode: http.StatusOK,
35+
Body: io.NopCloser(strings.NewReader(historyResponse)),
36+
}, nil
37+
}))
38+
assert.NilError(t, err)
4139
expected := []image.HistoryResponseItem{
4240
{
4341
ID: "image_id1",

client/image_import_test.go

Lines changed: 13 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -15,10 +15,9 @@ import (
1515
)
1616

1717
func TestImageImportError(t *testing.T) {
18-
client := &Client{
19-
client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
20-
}
21-
_, err := client.ImageImport(context.Background(), ImageImportSource{}, "image:tag", ImageImportOptions{})
18+
client, err := NewClientWithOpts(WithMockClient(errorMock(http.StatusInternalServerError, "Server error")))
19+
assert.NilError(t, err)
20+
_, err = client.ImageImport(context.Background(), ImageImportSource{}, "image:tag", ImageImportOptions{})
2221
assert.Check(t, is.ErrorType(err, cerrdefs.IsInternal))
2322
}
2423

@@ -68,17 +67,16 @@ func TestImageImport(t *testing.T) {
6867
}
6968
for _, tc := range tests {
7069
t.Run(tc.doc, func(t *testing.T) {
71-
client := &Client{
72-
client: newMockClient(func(req *http.Request) (*http.Response, error) {
73-
assert.Check(t, is.Equal(req.URL.Path, expectedURL))
74-
query := req.URL.Query()
75-
assert.Check(t, is.DeepEqual(query, tc.expectedQueryParams))
76-
return &http.Response{
77-
StatusCode: http.StatusOK,
78-
Body: io.NopCloser(bytes.NewReader([]byte(expectedOutput))),
79-
}, nil
80-
}),
81-
}
70+
client, err := NewClientWithOpts(WithMockClient(func(req *http.Request) (*http.Response, error) {
71+
assert.Check(t, is.Equal(req.URL.Path, expectedURL))
72+
query := req.URL.Query()
73+
assert.Check(t, is.DeepEqual(query, tc.expectedQueryParams))
74+
return &http.Response{
75+
StatusCode: http.StatusOK,
76+
Body: io.NopCloser(bytes.NewReader([]byte(expectedOutput))),
77+
}, nil
78+
}))
79+
assert.NilError(t, err)
8280
resp, err := client.ImageImport(context.Background(), ImageImportSource{
8381
Source: strings.NewReader("source"),
8482
SourceName: "image_source",

client/image_inspect_test.go

Lines changed: 51 additions & 56 deletions
42F0
Original file line numberDiff line numberDiff line change
@@ -19,54 +19,50 @@ import (
1919
)
2020

2121
func TestImageInspectError(t *testing.T) {
22-
client := &Client{
23-
client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
24-
}
22+
client, err := NewClientWithOpts(WithMockClient(errorMock(http.StatusInternalServerError, "Server error")))
23+
assert.NilError(t, err)
2524

26-
_, err := client.ImageInspect(context.Background(), "nothing")
25+
_, err = client.ImageInspect(context.Background(), "nothing")
2726
assert.Check(t, is.ErrorType(err, cerrdefs.IsInternal))
2827
}
2928

3029
func TestImageInspectImageNotFound(t *testing.T) {
31-
client := &Client{
32-
client: newMockClient(errorMock(http.StatusNotFound, "Server error")),
33-
}
30+
client, err := NewClientWithOpts(WithMockClient(errorMock(http.StatusNotFound, "Server error")))
31+
assert.NilError(t, err)
3432

35-
_, err := client.ImageInspect(context.Background(), "unknown")
33+
_, err = client.ImageInspect(context.Background(), "unknown")
3634
assert.Check(t, is.ErrorType(err, cerrdefs.IsNotFound))
3735
}
3836

3937
func TestImageInspectWithEmptyID(t *testing.T) {
40-
client := &Client{
41-
client: newMockClient(func(req *http.Request) (*http.Response, error) {
42-
return nil, errors.New("should not make request")
43-
}),
44-
}
45-
_, err := client.ImageInspect(context.Background(), "")
38+
client, err := NewClientWithOpts(WithMockClient(func(req *http.Request) (*http.Response, error) {
39+
return nil, errors.New("should not make request")
40+
}))
41+
assert.NilError(t, err)
42+
_, err = client.ImageInspect(context.Background(), "")
4643
assert.Check(t, is.ErrorType(err, cerrdefs.IsNotFound))
4744
}
4845

4946
func TestImageInspect(t *testing.T) {
5047
expectedURL := "/images/image_id/json"
5148
expectedTags := []string{"tag1", "tag2"}
52-
client := &Client{
53-
client: newMockClient(func(req *http.Request) (*http.Response, error) {
54-
if !strings.HasPrefix(req.URL.Path, expectedURL) {
55-
return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
56-
}
57-
content, err := json.Marshal(image.InspectResponse{
58-
ID: "image_id",
59-
RepoTags: expectedTags,
60-
})
61-
if err != nil {
62-
return nil, err
63-
}
64-
return &http.Response{
65-
StatusCode: http.StatusOK,
66-
Body: io.NopCloser(bytes.NewReader(content)),
67-
}, nil
68-
}),
69-
}
49+
client, err := NewClientWithOpts(WithMockClient(func(req *http.Request) (*http.Response, error) {
50+
if !strings.HasPrefix(req.URL.Path, expectedURL) {
51+
return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
52+
}
53+
content, err := json.Marshal(image.InspectResponse{
54+
ID: "image_id",
55+
RepoTags: expectedTags,
56+
})
57+
if err != nil {
58+
return nil, err
59+
}
60+
return &http.Response{
61+
StatusCode: http.StatusOK,
62+
Body: io.NopCloser(bytes.NewReader(content)),
63+
}, nil
64+
}))
65+
assert.NilError(t, err)
7066

7167
imageInspect, err := client.ImageInspect(context.Background(), "image_id")
7268
assert.NilError(t, err)
@@ -84,32 +80,31 @@ func TestImageInspectWithPlatform(t *testing.T) {
8480
expectedPlatform, err := encodePlatform(requestedPlatform)
8581
assert.NilError(t, err)
8682

87-
client := &Client{
88-
client: newMockClient(func(req *http.Request) (*http.Response, error) {
89-
if !strings.HasPrefix(req.URL.Path, expectedURL) {
90-
return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
91-
}
83+
client, err := NewClientWithOpts(WithMockClient(func(req *http.Request) (*http.Response, error) {
84+
if !strings.HasPrefix(req.URL.Path, expectedURL) {
85+
return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
86+
}
9287

93-
// Check if platform parameter is passed correctly
94-
platform := req.URL.Query().Get("platform")
95-
if platform != expectedPlatform {
96-
return nil, fmt.Errorf("Expected platform '%s', got '%s'", expectedPlatform, platform)
97-
}
88+
// Check if platform parameter is passed correctly
89+
platform := req.URL.Query().Get("platform")
90+
if platform != expectedPlatform {
91+
return nil, fmt.Errorf("Expected platform '%s', got '%s'", expectedPlatform, platform)
92+
}
9893

99-
content, err := json.Marshal(image.InspectResponse{
100-
ID: "image_id",
101-
Architecture: "arm64",
102-
Os: "linux",
103-
})
104-
if err != nil {
105-
return nil, err
106-
}
107-
return &http.Response{
108-
StatusCode: http.StatusOK,
109-
Body: io.NopCloser(bytes.NewReader(content)),
110-
}, nil
111-
}),
112-
}
94+
content, err := json.Marshal(image.InspectResponse{
95+
ID: "image_id",
96+
Architecture: "arm64",
97+
Os: "linux",
98+
})
99+
if err != nil {
100+
return nil, err
101+
}
102+
return &http.Response{
103+
StatusCode: http.StatusOK,
104+
Body: io.NopCloser(bytes.NewReader(content)),
105+
}, nil
106+
}))
107+
assert.NilError(t, err)
113108

114109
imageInspect, err := client.ImageInspect(context.Background(), "image_id", ImageInspectWithPlatform(requestedPlatform))
115110
assert.NilError(t, err)

0 commit comments

Comments
 (0)
0