image_remove_test.go 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package client
  2. import (
  3. "bytes"
  4. "encoding/json"
  5. "fmt"
  6. "io/ioutil"
  7. "net/http"
  8. "strings"
  9. "testing"
  10. "github.com/docker/docker/api/types"
  11. "golang.org/x/net/context"
  12. )
  13. func TestImageRemoveError(t *testing.T) {
  14. client := &Client{
  15. client: newMockClient(errorMock(http.StatusInternalServerError, "Server error")),
  16. }
  17. _, err := client.ImageRemove(context.Background(), "image_id", types.ImageRemoveOptions{})
  18. if err == nil || err.Error() != "Error response from daemon: Server error" {
  19. t.Fatalf("expected a Server Error, got %v", err)
  20. }
  21. }
  22. func TestImageRemoveImageNotFound(t *testing.T) {
  23. client := &Client{
  24. client: newMockClient(errorMock(http.StatusNotFound, "Server error")),
  25. }
  26. _, err := client.ImageRemove(context.Background(), "unknown", types.ImageRemoveOptions{})
  27. if err == nil || !IsErrNotFound(err) {
  28. t.Fatalf("expected an imageNotFoundError error, got %v", err)
  29. }
  30. }
  31. func TestImageRemove(t *testing.T) {
  32. expectedURL := "/images/image_id"
  33. removeCases := []struct {
  34. force bool
  35. pruneChildren bool
  36. expectedQueryParams map[string]string
  37. }{
  38. {
  39. force: false,
  40. pruneChildren: false,
  41. expectedQueryParams: map[string]string{
  42. "force": "",
  43. "noprune": "1",
  44. },
  45. }, {
  46. force: true,
  47. pruneChildren: true,
  48. expectedQueryParams: map[string]string{
  49. "force": "1",
  50. "noprune": "",
  51. },
  52. },
  53. }
  54. for _, removeCase := range removeCases {
  55. client := &Client{
  56. client: newMockClient(func(req *http.Request) (*http.Response, error) {
  57. if !strings.HasPrefix(req.URL.Path, expectedURL) {
  58. return nil, fmt.Errorf("expected URL '%s', got '%s'", expectedURL, req.URL)
  59. }
  60. if req.Method != "DELETE" {
  61. return nil, fmt.Errorf("expected DELETE method, got %s", req.Method)
  62. }
  63. query := req.URL.Query()
  64. for key, expected := range removeCase.expectedQueryParams {
  65. actual := query.Get(key)
  66. if actual != expected {
  67. return nil, fmt.Errorf("%s not set in URL query properly. Expected '%s', got %s", key, expected, actual)
  68. }
  69. }
  70. b, err := json.Marshal([]types.ImageDeleteResponseItem{
  71. {
  72. Untagged: "image_id1",
  73. },
  74. {
  75. Deleted: "image_id",
  76. },
  77. })
  78. if err != nil {
  79. return nil, err
  80. }
  81. return &http.Response{
  82. StatusCode: http.StatusOK,
  83. Body: ioutil.NopCloser(bytes.NewReader(b)),
  84. }, nil
  85. }),
  86. }
  87. imageDeletes, err := client.ImageRemove(context.Background(), "image_id", types.ImageRemoveOptions{
  88. Force: removeCase.force,
  89. PruneChildren: removeCase.pruneChildren,
  90. })
  91. if err != nil {
  92. t.Fatal(err)
  93. }
  94. if len(imageDeletes) != 2 {
  95. t.Fatalf("expected 2 deleted images, got %v", imageDeletes)
  96. }
  97. }
  98. }