fs_test.go 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192
  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/httpheaders"
  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. fsRoot := filepath.Join(wd, "..", "..", "..", "testdata")
  21. fi, err := os.Stat(filepath.Join(fsRoot, "test1.png"))
  22. s.Require().NoError(err)
  23. s.etag = BuildEtag("/test1.png", fi)
  24. s.modTime = fi.ModTime()
  25. s.transport, _ = New(&Config{Root: fsRoot}, "?")
  26. }
  27. func (s *FsTestSuite) TestRoundTripWithETagEnabled() {
  28. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  29. response, err := s.transport.RoundTrip(request)
  30. s.Require().NoError(err)
  31. s.Require().Equal(200, response.StatusCode)
  32. s.Require().Equal(s.etag, response.Header.Get(httpheaders.Etag))
  33. }
  34. func (s *FsTestSuite) TestRoundTripWithIfNoneMatchReturns304() {
  35. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  36. request.Header.Set(httpheaders.IfNoneMatch, s.etag)
  37. response, err := s.transport.RoundTrip(request)
  38. s.Require().NoError(err)
  39. s.Require().Equal(http.StatusNotModified, response.StatusCode)
  40. }
  41. func (s *FsTestSuite) TestRoundTripWithUpdatedETagReturns200() {
  42. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  43. request.Header.Set(httpheaders.IfNoneMatch, s.etag+"_wrong")
  44. response, err := s.transport.RoundTrip(request)
  45. s.Require().NoError(err)
  46. s.Require().Equal(http.StatusOK, response.StatusCode)
  47. }
  48. func (s *FsTestSuite) TestRoundTripWithLastModifiedEnabledReturns200() {
  49. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  50. response, err := s.transport.RoundTrip(request)
  51. s.Require().NoError(err)
  52. s.Require().Equal(200, response.StatusCode)
  53. s.Require().Equal(s.modTime.Format(http.TimeFormat), response.Header.Get(httpheaders.LastModified))
  54. }
  55. func (s *FsTestSuite) TestRoundTripWithIfModifiedSinceReturns304() {
  56. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  57. request.Header.Set(httpheaders.IfModifiedSince, s.modTime.Format(http.TimeFormat))
  58. response, err := s.transport.RoundTrip(request)
  59. s.Require().NoError(err)
  60. s.Require().Equal(http.StatusNotModified, response.StatusCode)
  61. }
  62. func (s *FsTestSuite) TestRoundTripWithUpdatedLastModifiedReturns200() {
  63. request, _ := http.NewRequest("GET", "local:///test1.png", nil)
  64. request.Header.Set(httpheaders.IfModifiedSince, s.modTime.Add(-time.Minute).Format(http.TimeFormat))
  65. response, err := s.transport.RoundTrip(request)
  66. s.Require().NoError(err)
  67. s.Require().Equal(http.StatusOK, response.StatusCode)
  68. }
  69. func TestFSTransport(t *testing.T) {
  70. suite.Run(t, new(FsTestSuite))
  71. }