fs_test.go 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package fs
  2. import (
  3. "net/http"
  4. "os"
  5. "path/filepath"
  6. "testing"
  7. "time"
  8. "github.com/stretchr/testify/suite"
  9. "github.com/imgproxy/imgproxy/v3/config"
  10. )
  11. type FsTestSuite struct {
  12. suite.Suite
  13. transport http.RoundTripper
  14. etag string
  15. modTime time.Time
  16. }
  17. func (s *FsTestSuite) SetupSuite() {
  18. wd, err := os.Getwd()
  19. s.Require().NoError(err)
  20. config.LocalFileSystemRoot = filepath.Join(wd, "..", "..", "testdata")
  21. fi, err := os.Stat(filepath.Join(config.LocalFileSystemRoot, "test1.png"))
  22. s.Require().NoError(err)
  23. s.etag = BuildEtag("/test1.png", fi)
  24. s.modTime = fi.ModTime()
  25. s.transport = New()
  26. }
  27. func (s *FsTestSuite) TestRoundTripWithETagDisabledReturns200() {
  28. config.ETagEnabled = false
  29. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  30. response, err := s.transport.RoundTrip(request)
  31. s.Require().NoError(err)
  32. s.Require().Equal(200, response.StatusCode)
  33. }
  34. func (s *FsTestSuite) TestRoundTripWithETagEnabled() {
  35. config.ETagEnabled = true
  36. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  37. response, err := s.transport.RoundTrip(request)
  38. s.Require().NoError(err)
  39. s.Require().Equal(200, response.StatusCode)
  40. s.Require().Equal(s.etag, response.Header.Get("ETag"))
  41. }
  42. func (s *FsTestSuite) TestRoundTripWithIfNoneMatchReturns304() {
  43. config.ETagEnabled = true
  44. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  45. request.Header.Set("If-None-Match", s.etag)
  46. response, err := s.transport.RoundTrip(request)
  47. s.Require().NoError(err)
  48. s.Require().Equal(http.StatusNotModified, response.StatusCode)
  49. }
  50. func (s *FsTestSuite) TestRoundTripWithUpdatedETagReturns200() {
  51. config.ETagEnabled = true
  52. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  53. request.Header.Set("If-None-Match", s.etag+"_wrong")
  54. response, err := s.transport.RoundTrip(request)
  55. s.Require().NoError(err)
  56. s.Require().Equal(http.StatusOK, response.StatusCode)
  57. }
  58. func (s *FsTestSuite) TestRoundTripWithLastModifiedDisabledReturns200() {
  59. config.LastModifiedEnabled = false
  60. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  61. response, err := s.transport.RoundTrip(request)
  62. s.Require().NoError(err)
  63. s.Require().Equal(200, response.StatusCode)
  64. }
  65. func (s *FsTestSuite) TestRoundTripWithLastModifiedEnabledReturns200() {
  66. config.LastModifiedEnabled = true
  67. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  68. response, err := s.transport.RoundTrip(request)
  69. s.Require().NoError(err)
  70. s.Require().Equal(200, response.StatusCode)
  71. s.Require().Equal(s.modTime.Format(http.TimeFormat), response.Header.Get("Last-Modified"))
  72. }
  73. func (s *FsTestSuite) TestRoundTripWithIfModifiedSinceReturns304() {
  74. config.LastModifiedEnabled = true
  75. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  76. request.Header.Set("If-Modified-Since", s.modTime.Format(http.TimeFormat))
  77. response, err := s.transport.RoundTrip(request)
  78. s.Require().NoError(err)
  79. s.Require().Equal(http.StatusNotModified, response.StatusCode)
  80. }
  81. func (s *FsTestSuite) TestRoundTripWithUpdatedLastModifiedReturns200() {
  82. config.LastModifiedEnabled = true
  83. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  84. request.Header.Set("If-Modified-Since", s.modTime.Add(-time.Minute).Format(http.TimeFormat))
  85. response, err := s.transport.RoundTrip(request)
  86. s.Require().NoError(err)
  87. s.Require().Equal(http.StatusOK, response.StatusCode)
  88. }
  89. func TestS3Transport(t *testing.T) {
  90. suite.Run(t, new(FsTestSuite))
  91. }