swift_test.go 3.2 KB

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