static_provider_test.go 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210
  1. package auximageprovider
  2. import (
  3. "encoding/base64"
  4. "io"
  5. "net/http"
  6. "net/http/httptest"
  7. "os"
  8. "strconv"
  9. "testing"
  10. "github.com/stretchr/testify/suite"
  11. "github.com/imgproxy/imgproxy/v3/config"
  12. "github.com/imgproxy/imgproxy/v3/fetcher"
  13. "github.com/imgproxy/imgproxy/v3/httpheaders"
  14. "github.com/imgproxy/imgproxy/v3/imagedata"
  15. "github.com/imgproxy/imgproxy/v3/options"
  16. "github.com/imgproxy/imgproxy/v3/transport"
  17. )
  18. type ImageProviderTestSuite struct {
  19. suite.Suite
  20. server *httptest.Server
  21. testData []byte
  22. testDataB64 string
  23. // Server state
  24. status int
  25. data []byte
  26. header http.Header
  27. }
  28. func (s *ImageProviderTestSuite) SetupSuite() {
  29. config.Reset()
  30. config.AllowLoopbackSourceAddresses = true
  31. // Load test image data
  32. f, err := os.Open("../testdata/test1.jpg")
  33. s.Require().NoError(err)
  34. defer f.Close()
  35. data, err := io.ReadAll(f)
  36. s.Require().NoError(err)
  37. s.testData = data
  38. s.testDataB64 = base64.StdEncoding.EncodeToString(data)
  39. // Create test server
  40. s.server = httptest.NewServer(http.HandlerFunc(func(rw http.ResponseWriter, r *http.Request) {
  41. for k, vv := range s.header {
  42. for _, v := range vv {
  43. rw.Header().Add(k, v)
  44. }
  45. }
  46. data := s.data
  47. if data == nil {
  48. data = s.testData
  49. }
  50. rw.Header().Set(httpheaders.ContentLength, strconv.Itoa(len(data)))
  51. rw.WriteHeader(s.status)
  52. rw.Write(data)
  53. }))
  54. }
  55. func (s *ImageProviderTestSuite) TearDownSuite() {
  56. s.server.Close()
  57. }
  58. func (s *ImageProviderTestSuite) SetupTest() {
  59. s.status = http.StatusOK
  60. s.data = nil
  61. s.header = http.Header{}
  62. s.header.Set(httpheaders.ContentType, "image/jpeg")
  63. }
  64. // Helper function to read data from ImageData
  65. func (s *ImageProviderTestSuite) readImageData(provider Provider) []byte {
  66. imgData, _, err := provider.Get(s.T().Context(), &options.ProcessingOptions{})
  67. s.Require().NoError(err)
  68. s.Require().NotNil(imgData)
  69. defer imgData.Close()
  70. reader := imgData.Reader()
  71. data, err := io.ReadAll(reader)
  72. s.Require().NoError(err)
  73. return data
  74. }
  75. func (s *ImageProviderTestSuite) TestNewProvider() {
  76. tests := []struct {
  77. name string
  78. config *StaticConfig
  79. setupFunc func()
  80. expectError bool
  81. expectNil bool
  82. validateFunc func(provider Provider)
  83. }{
  84. {
  85. name: "B64",
  86. config: &StaticConfig{Base64Data: s.testDataB64},
  87. validateFunc: func(provider Provider) {
  88. s.Equal(s.testData, s.readImageData(provider))
  89. },
  90. },
  91. {
  92. name: "Path",
  93. config: &StaticConfig{Path: "../testdata/test1.jpg"},
  94. validateFunc: func(provider Provider) {
  95. s.Equal(s.testData, s.readImageData(provider))
  96. },
  97. },
  98. {
  99. name: "URL",
  100. config: &StaticConfig{URL: s.server.URL},
  101. validateFunc: func(provider Provider) {
  102. s.Equal(s.testData, s.readImageData(provider))
  103. },
  104. },
  105. {
  106. name: "EmptyConfig",
  107. config: &StaticConfig{},
  108. expectNil: true,
  109. },
  110. {
  111. name: "InvalidURL",
  112. config: &StaticConfig{URL: "http://invalid-url-that-does-not-exist.invalid"},
  113. expectError: true,
  114. expectNil: true,
  115. },
  116. {
  117. name: "InvalidBase64",
  118. config: &StaticConfig{Base64Data: "invalid-base64-data!!!"},
  119. expectError: true,
  120. expectNil: true,
  121. },
  122. {
  123. name: "Base64PreferenceOverPath",
  124. config: &StaticConfig{
  125. Base64Data: base64.StdEncoding.EncodeToString(s.testData),
  126. Path: "../testdata/test2.jpg", // This should be ignored
  127. },
  128. validateFunc: func(provider Provider) {
  129. actualData := s.readImageData(provider)
  130. s.Equal(s.testData, actualData)
  131. },
  132. },
  133. {
  134. name: "HeadersPassedThrough",
  135. config: &StaticConfig{URL: s.server.URL},
  136. setupFunc: func() {
  137. s.header.Set("X-Custom-Header", "test-value")
  138. s.header.Set(httpheaders.CacheControl, "max-age=3600")
  139. },
  140. validateFunc: func(provider Provider) {
  141. imgData, headers, err := provider.Get(s.T().Context(), &options.ProcessingOptions{})
  142. s.Require().NoError(err)
  143. s.Require().NotNil(imgData)
  144. defer imgData.Close()
  145. s.Equal("test-value", headers.Get("X-Custom-Header"))
  146. s.Equal("max-age=3600", headers.Get(httpheaders.CacheControl))
  147. s.Equal("image/jpeg", headers.Get(httpheaders.ContentType))
  148. },
  149. },
  150. }
  151. trc := transport.NewDefaultConfig()
  152. tr, err := transport.New(&trc)
  153. s.Require().NoError(err)
  154. fc := fetcher.NewDefaultConfig()
  155. f, err := fetcher.New(tr, &fc)
  156. s.Require().NoError(err)
  157. idf := imagedata.NewFactory(f)
  158. for _, tt := range tests {
  159. s.T().Run(tt.name, func(t *testing.T) {
  160. if tt.setupFunc != nil {
  161. tt.setupFunc()
  162. }
  163. provider, err := NewStaticProvider(s.T().Context(), tt.config, "test image", idf)
  164. if tt.expectError {
  165. s.Require().Error(err)
  166. } else {
  167. s.Require().NoError(err)
  168. }
  169. if tt.expectNil {
  170. s.Nil(provider)
  171. } else {
  172. s.Require().NotNil(provider)
  173. }
  174. if tt.validateFunc != nil {
  175. tt.validateFunc(provider)
  176. }
  177. })
  178. }
  179. }
  180. func TestImageProvider(t *testing.T) {
  181. suite.Run(t, new(ImageProviderTestSuite))
  182. }