swift_test.go 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. package swift
  2. import (
  3. "context"
  4. "net/http"
  5. "testing"
  6. "github.com/ncw/swift/v2"
  7. "github.com/ncw/swift/v2/swifttest"
  8. "github.com/stretchr/testify/require"
  9. "github.com/stretchr/testify/suite"
  10. "github.com/imgproxy/imgproxy/v3/config"
  11. )
  12. const (
  13. testContainer = "test"
  14. testObject = "foo/test.png"
  15. )
  16. type SwiftTestSuite struct {
  17. suite.Suite
  18. server *swifttest.SwiftServer
  19. transport http.RoundTripper
  20. etag string
  21. }
  22. func (s *SwiftTestSuite) SetupSuite() {
  23. s.server, _ = swifttest.NewSwiftServer("localhost")
  24. config.Reset()
  25. config.SwiftAuthURL = s.server.AuthURL
  26. config.SwiftUsername = swifttest.TEST_ACCOUNT
  27. config.SwiftAPIKey = swifttest.TEST_ACCOUNT
  28. config.SwiftAuthVersion = 1
  29. s.setupTestFile()
  30. var err error
  31. s.transport, err = New()
  32. require.Nil(s.T(), err, "failed to initialize swift transport")
  33. }
  34. func (s *SwiftTestSuite) setupTestFile() {
  35. t := s.T()
  36. c := &swift.Connection{
  37. UserName: config.SwiftUsername,
  38. ApiKey: config.SwiftAPIKey,
  39. AuthUrl: config.SwiftAuthURL,
  40. AuthVersion: config.SwiftAuthVersion,
  41. }
  42. ctx := context.Background()
  43. err := c.Authenticate(ctx)
  44. require.Nil(t, err, "failed to authenticate with test server")
  45. err = c.ContainerCreate(ctx, testContainer, nil)
  46. require.Nil(t, err, "failed to create container")
  47. f, err := c.ObjectCreate(ctx, testContainer, testObject, true, "", "image/png", nil)
  48. require.Nil(t, err, "failed to create object")
  49. defer f.Close()
  50. data := make([]byte, 32)
  51. n, err := f.Write(data)
  52. require.Equal(t, n, len(data))
  53. require.Nil(t, err)
  54. f.Close()
  55. h, err := f.Headers()
  56. require.Nil(t, err)
  57. s.etag = h["Etag"]
  58. }
  59. func (s *SwiftTestSuite) TearDownSuite() {
  60. s.server.Close()
  61. }
  62. func (s *SwiftTestSuite) TestRoundTripWithETagDisabledReturns200() {
  63. config.ETagEnabled = false
  64. request, _ := http.NewRequest("GET", "swift://test/foo/test.png", nil)
  65. response, err := s.transport.RoundTrip(request)
  66. require.Nil(s.T(), err)
  67. require.Equal(s.T(), 200, response.StatusCode)
  68. }
  69. func (s *SwiftTestSuite) TestRoundTripReturns404WhenObjectNotFound() {
  70. config.ETagEnabled = true
  71. request, _ := http.NewRequest("GET", "swift://test/foo/not-here.png", nil)
  72. response, err := s.transport.RoundTrip(request)
  73. require.Nil(s.T(), err)
  74. require.Equal(s.T(), 404, response.StatusCode)
  75. }
  76. func (s *SwiftTestSuite) TestRoundTripReturns404WhenContainerNotFound() {
  77. config.ETagEnabled = true
  78. request, _ := http.NewRequest("GET", "swift://invalid/foo/test.png", nil)
  79. response, err := s.transport.RoundTrip(request)
  80. require.Nil(s.T(), err)
  81. require.Equal(s.T(), 404, response.StatusCode)
  82. }
  83. func (s *SwiftTestSuite) TestRoundTripWithETagEnabled() {
  84. config.ETagEnabled = true
  85. request, _ := http.NewRequest("GET", "swift://test/foo/test.png", nil)
  86. response, err := s.transport.RoundTrip(request)
  87. require.Nil(s.T(), err)
  88. require.Equal(s.T(), 200, response.StatusCode)
  89. require.Equal(s.T(), s.etag, response.Header.Get("ETag"))
  90. }
  91. func (s *SwiftTestSuite) TestRoundTripWithIfNoneMatchReturns304() {
  92. config.ETagEnabled = true
  93. request, _ := http.NewRequest("GET", "swift://test/foo/test.png", nil)
  94. request.Header.Set("If-None-Match", s.etag)
  95. response, err := s.transport.RoundTrip(request)
  96. require.Nil(s.T(), err)
  97. require.Equal(s.T(), http.StatusNotModified, response.StatusCode)
  98. }
  99. func (s *SwiftTestSuite) TestRoundTripWithUpdatedETagReturns200() {
  100. config.ETagEnabled = true
  101. request, _ := http.NewRequest("GET", "swift://test/foo/test.png", nil)
  102. request.Header.Set("If-None-Match", s.etag+"_wrong")
  103. response, err := s.transport.RoundTrip(request)
  104. require.Nil(s.T(), err)
  105. require.Equal(s.T(), http.StatusOK, response.StatusCode)
  106. }
  107. func TestSwiftTransport(t *testing.T) {
  108. suite.Run(t, new(SwiftTestSuite))
  109. }