static_provider_test.go 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180
  1. package auximageprovider
  2. import (
  3. "encoding/base64"
  4. "io"
  5. "strconv"
  6. "testing"
  7. "github.com/stretchr/testify/suite"
  8. "github.com/imgproxy/imgproxy/v3/fetcher"
  9. "github.com/imgproxy/imgproxy/v3/httpheaders"
  10. "github.com/imgproxy/imgproxy/v3/imagedata"
  11. "github.com/imgproxy/imgproxy/v3/options"
  12. "github.com/imgproxy/imgproxy/v3/testutil"
  13. )
  14. type ImageProviderTestSuite struct {
  15. testutil.LazySuite
  16. testData []byte
  17. testDataB64 string
  18. testServer testutil.LazyTestServer
  19. idf *imagedata.Factory
  20. }
  21. func (s *ImageProviderTestSuite) SetupSuite() {
  22. s.testData = testutil.NewTestDataProvider(s.T).Read("test1.jpg")
  23. s.testDataB64 = base64.StdEncoding.EncodeToString(s.testData)
  24. fc := fetcher.NewDefaultConfig()
  25. fc.Transport.HTTP.AllowLoopbackSourceAddresses = true
  26. f, err := fetcher.New(&fc)
  27. s.Require().NoError(err)
  28. s.idf = imagedata.NewFactory(f)
  29. s.testServer, _ = testutil.NewLazySuiteTestServer(
  30. s,
  31. func(srv *testutil.TestServer) error {
  32. srv.SetHeaders(
  33. httpheaders.ContentType, "image/jpeg",
  34. httpheaders.ContentLength, strconv.Itoa(len(s.testData)),
  35. ).SetBody(s.testData)
  36. return nil
  37. },
  38. )
  39. }
  40. func (s *ImageProviderTestSuite) SetupSubTest() {
  41. // We use t.Run() a lot, so we need to reset lazy objects at the beginning of each subtest
  42. s.ResetLazyObjects()
  43. }
  44. // Helper function to read data from ImageData
  45. func (s *ImageProviderTestSuite) readImageData(provider Provider) []byte {
  46. imgData, _, err := provider.Get(s.T().Context(), options.New())
  47. s.Require().NoError(err)
  48. s.Require().NotNil(imgData)
  49. defer imgData.Close()
  50. reader := imgData.Reader()
  51. data, err := io.ReadAll(reader)
  52. s.Require().NoError(err)
  53. return data
  54. }
  55. func (s *ImageProviderTestSuite) TestNewProvider() {
  56. tests := []struct {
  57. name string
  58. config *StaticConfig
  59. setupFunc func()
  60. expectError bool
  61. expectNil bool
  62. validateFunc func(provider Provider)
  63. }{
  64. {
  65. name: "B64",
  66. config: &StaticConfig{Base64Data: s.testDataB64},
  67. validateFunc: func(provider Provider) {
  68. s.Equal(s.testData, s.readImageData(provider))
  69. },
  70. },
  71. {
  72. name: "Path",
  73. config: &StaticConfig{Path: "../testdata/test1.jpg"},
  74. validateFunc: func(provider Provider) {
  75. s.Equal(s.testData, s.readImageData(provider))
  76. },
  77. },
  78. {
  79. name: "URL",
  80. config: &StaticConfig{URL: s.testServer().URL()},
  81. validateFunc: func(provider Provider) {
  82. s.Equal(s.testData, s.readImageData(provider))
  83. },
  84. },
  85. {
  86. name: "EmptyConfig",
  87. config: &StaticConfig{},
  88. expectNil: true,
  89. },
  90. {
  91. name: "InvalidURL",
  92. config: &StaticConfig{URL: "http://invalid-url-that-does-not-exist.invalid"},
  93. expectError: true,
  94. expectNil: true,
  95. },
  96. {
  97. name: "InvalidBase64",
  98. config: &StaticConfig{Base64Data: "invalid-base64-data!!!"},
  99. expectError: true,
  100. expectNil: true,
  101. },
  102. {
  103. name: "Base64PreferenceOverPath",
  104. config: &StaticConfig{
  105. Base64Data: base64.StdEncoding.EncodeToString(s.testData),
  106. Path: "../testdata/test2.jpg", // This should be ignored
  107. },
  108. validateFunc: func(provider Provider) {
  109. actualData := s.readImageData(provider)
  110. s.Equal(s.testData, actualData)
  111. },
  112. },
  113. {
  114. name: "HeadersPassedThrough",
  115. config: &StaticConfig{URL: s.testServer().URL()},
  116. setupFunc: func() {
  117. s.testServer().SetHeaders(
  118. "X-Custom-Header", "test-value",
  119. httpheaders.CacheControl, "max-age=3600",
  120. )
  121. },
  122. validateFunc: func(provider Provider) {
  123. imgData, headers, err := provider.Get(s.T().Context(), options.New())
  124. s.Require().NoError(err)
  125. s.Require().NotNil(imgData)
  126. defer imgData.Close()
  127. s.Equal("test-value", headers.Get("X-Custom-Header"))
  128. s.Equal("max-age=3600", headers.Get(httpheaders.CacheControl))
  129. s.Equal("image/jpeg", headers.Get(httpheaders.ContentType))
  130. },
  131. },
  132. }
  133. for _, tt := range tests {
  134. s.T().Run(tt.name, func(t *testing.T) {
  135. if tt.setupFunc != nil {
  136. tt.setupFunc()
  137. }
  138. provider, err := NewStaticProvider(s.T().Context(), tt.config, "test image", s.idf)
  139. if tt.expectError {
  140. s.Require().Error(err)
  141. } else {
  142. s.Require().NoError(err)
  143. }
  144. if tt.expectNil {
  145. s.Nil(provider)
  146. } else {
  147. s.Require().NotNil(provider)
  148. }
  149. if tt.validateFunc != nil {
  150. tt.validateFunc(provider)
  151. }
  152. })
  153. }
  154. }
  155. func TestImageProvider(t *testing.T) {
  156. suite.Run(t, new(ImageProviderTestSuite))
  157. }