| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899 |
- package transport
- import (
- "context"
- "io"
- "net/http"
- "strings"
- "testing"
- "github.com/stretchr/testify/suite"
- "github.com/imgproxy/imgproxy/v3/httpheaders"
- "github.com/imgproxy/imgproxy/v3/storage"
- )
- // mockStorage is a simple mock implementation of storage.Reader
- type mockStorage struct {
- getObject func(ctx context.Context, reqHeader http.Header, bucket, key, query string) (*storage.ObjectReader, error)
- }
- func (m *mockStorage) GetObject(ctx context.Context, reqHeader http.Header, bucket, key, query string) (*storage.ObjectReader, error) {
- if m.getObject == nil {
- return nil, nil
- }
- return m.getObject(ctx, reqHeader, bucket, key, query)
- }
- type RoundTripperTestSuite struct {
- suite.Suite
- }
- func (s *RoundTripperTestSuite) TestRoundTripperSuccess() {
- // Create mock storage that returns a successful response
- mock := &mockStorage{
- getObject: func(ctx context.Context, reqHeader http.Header, bucket, key, query string) (*storage.ObjectReader, error) {
- s.Equal("test-bucket", bucket)
- s.Equal("test-key", key)
- s.Equal("version=123", query)
- headers := make(http.Header)
- headers.Set(httpheaders.ContentType, "image/png")
- headers.Set(httpheaders.Etag, "test-etag")
- body := io.NopCloser(strings.NewReader("test data"))
- return storage.NewObjectOK(headers, body), nil
- },
- }
- rt := NewRoundTripper(mock, "?")
- // Create a test request
- req, err := http.NewRequest("GET", EscapeURL("s3://test-bucket/test-key?version=123"), nil)
- s.Require().NoError(err)
- // Execute RoundTrip
- resp, err := rt.RoundTrip(req)
- s.Require().NoError(err)
- s.Require().NotNil(resp)
- // Verify response
- s.Equal(http.StatusOK, resp.StatusCode)
- s.Equal("image/png", resp.Header.Get(httpheaders.ContentType))
- s.Equal("test-etag", resp.Header.Get(httpheaders.Etag))
- // Read and verify body
- defer resp.Body.Close()
- data, err := io.ReadAll(resp.Body)
- s.Require().NoError(err)
- s.Equal("test data", string(data))
- }
- func (s *RoundTripperTestSuite) TestRoundTripperNotFound() {
- // Create mock storage that returns 404
- mock := &mockStorage{
- getObject: func(ctx context.Context, reqHeader http.Header, bucket, key, query string) (*storage.ObjectReader, error) {
- return storage.NewObjectNotFound("object not found"), nil
- },
- }
- rt := NewRoundTripper(mock, "?")
- req, err := http.NewRequest("GET", "s3://bucket/key", nil)
- s.Require().NoError(err)
- resp, err := rt.RoundTrip(req)
- s.Require().NoError(err)
- s.Require().NotNil(resp)
- if resp.Body != nil {
- resp.Body.Close()
- }
- s.Equal(http.StatusNotFound, resp.StatusCode)
- }
- func TestRoundTripper(t *testing.T) {
- suite.Run(t, new(RoundTripperTestSuite))
- }
|