1
0

fs_test.go 3.4 KB

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