github.com/kaisenlinux/docker.io@v0.0.0-20230510090727-ea55db55fac7/engine/client/image_search_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/api/types/registry" 16 "github.com/docker/docker/errdefs" 17 ) 18 19 func TestImageSearchAnyError(t *testing.T) { 20 client := &Client{ 21 client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")), 22 } 23 _, err := client.ImageSearch(context.Background(), "some-image", types.ImageSearchOptions{}) 24 if !errdefs.IsSystem(err) { 25 t.Fatalf("expected a Server Error, got %[1]T: %[1]v", err) 26 } 27 } 28 29 func TestImageSearchStatusUnauthorizedError(t *testing.T) { 30 client := &Client{ 31 client: newMockClient(errorMock(http.StatusUnauthorized, "Unauthorized error")), 32 } 33 _, err := client.ImageSearch(context.Background(), "some-image", types.ImageSearchOptions{}) 34 if !errdefs.IsUnauthorized(err) { 35 t.Fatalf("expected a Unauthorized Error, got %[1]T: %[1]v", err) 36 } 37 } 38 39 func TestImageSearchWithUnauthorizedErrorAndPrivilegeFuncError(t *testing.T) { 40 client := &Client{ 41 client: newMockClient(errorMock(http.StatusUnauthorized, "Unauthorized error")), 42 } 43 privilegeFunc := func() (string, error) { 44 return "", fmt.Errorf("Error requesting privilege") 45 } 46 _, err := client.ImageSearch(context.Background(), "some-image", types.ImageSearchOptions{ 47 PrivilegeFunc: privilegeFunc, 48 }) 49 if err == nil || err.Error() != "Error requesting privilege" { 50 t.Fatalf("expected an error requesting privilege, got %v", err) 51 } 52 } 53 54 func TestImageSearchWithUnauthorizedErrorAndAnotherUnauthorizedError(t *testing.T) { 55 client := &Client{ 56 client: newMockClient(errorMock(http.StatusUnauthorized, "Unauthorized error")), 57 } 58 privilegeFunc := func() (string, error) { 59 return "a-auth-header", nil 60 } 61 _, err := client.ImageSearch(context.Background(), "some-image", types.ImageSearchOptions{ 62 PrivilegeFunc: privilegeFunc, 63 }) 64 if !errdefs.IsUnauthorized(err) { 65 t.Fatalf("expected a Unauthorized Error, got %[1]T: %[1]v", err) 66 } 67 } 68 69 func TestImageSearchWithPrivilegedFuncNoError(t *testing.T) { 70 expectedURL := "/images/search" 71 client := &Client{ 72 client: newMockClient(func(req *http.Request) (*http.Response, error) { 73 if !strings.HasPrefix(req.URL.Path, expectedURL) { 74 return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) 75 } 76 auth := req.Header.Get("X-Registry-Auth") 77 if auth == "NotValid" { 78 return &http.Response{ 79 StatusCode: http.StatusUnauthorized, 80 Body: io.NopCloser(bytes.NewReader([]byte("Invalid credentials"))), 81 }, nil 82 } 83 if auth != "IAmValid" { 84 return nil, fmt.Errorf("Invalid auth header : expected 'IAmValid', got %s", auth) 85 } 86 query := req.URL.Query() 87 term := query.Get("term") 88 if term != "some-image" { 89 return nil, fmt.Errorf("term not set in URL query properly. Expected 'some-image', got %s", term) 90 } 91 content, err := json.Marshal([]registry.SearchResult{ 92 { 93 Name: "anything", 94 }, 95 }) 96 if err != nil { 97 return nil, err 98 } 99 return &http.Response{ 100 StatusCode: http.StatusOK, 101 Body: io.NopCloser(bytes.NewReader(content)), 102 }, nil 103 }), 104 } 105 privilegeFunc := func() (string, error) { 106 return "IAmValid", nil 107 } 108 results, err := client.ImageSearch(context.Background(), "some-image", types.ImageSearchOptions{ 109 RegistryAuth: "NotValid", 110 PrivilegeFunc: privilegeFunc, 111 }) 112 if err != nil { 113 t.Fatal(err) 114 } 115 if len(results) != 1 { 116 t.Fatalf("expected 1 result, got %v", results) 117 } 118 } 119 120 func TestImageSearchWithoutErrors(t *testing.T) { 121 expectedURL := "/images/search" 122 filterArgs := filters.NewArgs() 123 filterArgs.Add("is-automated", "true") 124 filterArgs.Add("stars", "3") 125 126 expectedFilters := `{"is-automated":{"true":true},"stars":{"3":true}}` 127 128 client := &Client{ 129 client: newMockClient(func(req *http.Request) (*http.Response, error) { 130 if !strings.HasPrefix(req.URL.Path, expectedURL) { 131 return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL) 132 } 133 query := req.URL.Query() 134 term := query.Get("term") 135 if term != "some-image" { 136 return nil, fmt.Errorf("term not set in URL query properly. Expected 'some-image', got %s", term) 137 } 138 filters := query.Get("filters") 139 if filters != expectedFilters { 140 return nil, fmt.Errorf("filters not set in URL query properly. Expected '%s', got %s", expectedFilters, filters) 141 } 142 content, err := json.Marshal([]registry.SearchResult{ 143 { 144 Name: "anything", 145 }, 146 }) 147 if err != nil { 148 return nil, err 149 } 150 return &http.Response{ 151 StatusCode: http.StatusOK, 152 Body: io.NopCloser(bytes.NewReader(content)), 153 }, nil 154 }), 155 } 156 results, err := client.ImageSearch(context.Background(), "some-image", types.ImageSearchOptions{ 157 Filters: filterArgs, 158 }) 159 if err != nil { 160 t.Fatal(err) 161 } 162 if len(results) != 1 { 163 t.Fatalf("expected a result, got %v", results) 164 } 165 }