image_search_test.go 4.9 KB

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