network_list_test.go 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101
  1. package client // import "github.com/docker/docker/client"
  2. import (
  3. "bytes"
  4. "context"
  5. "encoding/json"
  6. "fmt"
  7. "io"
  8. "net/http"
  9. "strings"
  10. "testing"
  11. "github.com/docker/docker/api/types"
  12. "github.com/docker/docker/api/types/filters"
  13. "github.com/docker/docker/errdefs"
  14. "gotest.tools/v3/assert"
  15. is "gotest.tools/v3/assert/cmp"
  16. )
  17. func TestNetworkListError(t *testing.T) {
  18. client := &Client{
  19. client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
  20. }
  21. _, err := client.NetworkList(context.Background(), types.NetworkListOptions{})
  22. assert.Check(t, is.ErrorType(err, errdefs.IsSystem))
  23. }
  24. func TestNetworkList(t *testing.T) {
  25. const expectedURL = "/networks"
  26. listCases := []struct {
  27. options types.NetworkListOptions
  28. expectedFilters string
  29. }{
  30. {
  31. options: types.NetworkListOptions{},
  32. expectedFilters: "",
  33. },
  34. {
  35. options: types.NetworkListOptions{
  36. Filters: filters.NewArgs(filters.Arg("dangling", "false")),
  37. },
  38. expectedFilters: `{"dangling":{"false":true}}`,
  39. },
  40. {
  41. options: types.NetworkListOptions{
  42. Filters: filters.NewArgs(filters.Arg("dangling", "true")),
  43. },
  44. expectedFilters: `{"dangling":{"true":true}}`,
  45. },
  46. {
  47. options: types.NetworkListOptions{
  48. Filters: filters.NewArgs(
  49. filters.Arg("label", "label1"),
  50. filters.Arg("label", "label2"),
  51. ),
  52. },
  53. expectedFilters: `{"label":{"label1":true,"label2":true}}`,
  54. },
  55. }
  56. for _, listCase := range listCases {
  57. client := &Client{
  58. client: newMockClient(func(req *http.Request) (*http.Response, error) {
  59. if !strings.HasPrefix(req.URL.Path, expectedURL) {
  60. return nil, fmt.Errorf("Expected URL '%s', got '%s'", expectedURL, req.URL)
  61. }
  62. if req.Method != http.MethodGet {
  63. return nil, fmt.Errorf("expected GET method, got %s", req.Method)
  64. }
  65. query := req.URL.Query()
  66. actualFilters := query.Get("filters")
  67. if actualFilters != listCase.expectedFilters {
  68. return nil, fmt.Errorf("filters not set in URL query properly. Expected '%s', got %s", listCase.expectedFilters, actualFilters)
  69. }
  70. content, err := json.Marshal([]types.NetworkResource{
  71. {
  72. Name: "network",
  73. Driver: "bridge",
  74. },
  75. })
  76. if err != nil {
  77. return nil, err
  78. }
  79. return &http.Response{
  80. StatusCode: http.StatusOK,
  81. Body: io.NopCloser(bytes.NewReader(content)),
  82. }, nil
  83. }),
  84. }
  85. networkResources, err := client.NetworkList(context.Background(), listCase.options)
  86. if err != nil {
  87. t.Fatal(err)
  88. }
  89. if len(networkResources) != 1 {
  90. t.Fatalf("expected 1 network resource, got %v", networkResources)
  91. }
  92. }
  93. }