github.com/prebid/prebid-server/v2@v2.18.0/analytics/agma/sender_test.go (about)

     1  package agma
     2  
     3  import (
     4  	"compress/gzip"
     5  	"io"
     6  	"net/http"
     7  	"net/http/httptest"
     8  	"testing"
     9  
    10  	"github.com/prebid/prebid-server/v2/config"
    11  	"github.com/stretchr/testify/assert"
    12  )
    13  
    14  func TestCreateHttpSender(t *testing.T) {
    15  	testCases := []struct {
    16  		name        string
    17  		endpoint    config.AgmaAnalyticsHttpEndpoint
    18  		wantHeaders http.Header
    19  		wantErr     bool
    20  	}{
    21  		{
    22  			name: "Test with invalid/empty URL",
    23  			endpoint: config.AgmaAnalyticsHttpEndpoint{
    24  				Url:     "%%2815197306101420000%29",
    25  				Timeout: "1s",
    26  				Gzip:    false,
    27  			},
    28  			wantErr: true,
    29  		},
    30  		{
    31  			name: "Test with timeout",
    32  			endpoint: config.AgmaAnalyticsHttpEndpoint{
    33  				Url:     "http://localhost:8080",
    34  				Timeout: "2x", // Very short timeout
    35  				Gzip:    false,
    36  			},
    37  			wantErr: true,
    38  		},
    39  		{
    40  			name: "Test with Gzip true",
    41  			endpoint: config.AgmaAnalyticsHttpEndpoint{
    42  				Url:     "http://localhost:8080",
    43  				Timeout: "1s",
    44  				Gzip:    true,
    45  			},
    46  			wantHeaders: http.Header{
    47  				"Content-Encoding": []string{"gzip"},
    48  				"Content-Type":     []string{"application/json"},
    49  			},
    50  			wantErr: false,
    51  		},
    52  		{
    53  			name: "Test with Gzip false",
    54  			endpoint: config.AgmaAnalyticsHttpEndpoint{
    55  				Url:     "http://localhost:8080",
    56  				Timeout: "1s",
    57  				Gzip:    false,
    58  			},
    59  			wantHeaders: http.Header{
    60  				"Content-Type": []string{"application/json"},
    61  			},
    62  			wantErr: false,
    63  		},
    64  	}
    65  
    66  	for _, tc := range testCases {
    67  		t.Run(tc.name, func(t *testing.T) {
    68  			testBody := []byte("[{ \"type\": \"test\" }]")
    69  			// Create a test server
    70  			ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
    71  				// Check the headers
    72  				for name, wantValues := range tc.wantHeaders {
    73  					assert.Equal(t, wantValues, r.Header[name], "Expected header '%s' to be '%v', got '%v'", name, wantValues, r.Header[name])
    74  				}
    75  				defer r.Body.Close()
    76  				var reader io.ReadCloser
    77  				var err error
    78  				if tc.endpoint.Gzip {
    79  					reader, err = gzip.NewReader(r.Body)
    80  					assert.NoError(t, err)
    81  					defer reader.Close()
    82  				} else {
    83  					reader = r.Body
    84  				}
    85  
    86  				decompressedData, err := io.ReadAll(reader)
    87  				assert.NoError(t, err)
    88  
    89  				assert.Equal(t, string(testBody), string(decompressedData))
    90  
    91  				w.WriteHeader(http.StatusOK)
    92  			}))
    93  			defer ts.Close()
    94  
    95  			// Update the URL of the endpoint to the URL of the test server
    96  			if !tc.wantErr {
    97  				tc.endpoint.Url = ts.URL
    98  			}
    99  
   100  			// Create a test client
   101  			client := &http.Client{}
   102  
   103  			// Test the createHttpSender function
   104  			sender, err := createHttpSender(client, tc.endpoint)
   105  			if tc.wantErr {
   106  				assert.Error(t, err)
   107  				return
   108  			}
   109  			assert.NoError(t, err)
   110  
   111  			// Test the returned HttpSender function
   112  			err = sender([]byte(testBody))
   113  			assert.NoError(t, err)
   114  		})
   115  	}
   116  }
   117  
   118  func TestSenderErrorReponse(t *testing.T) {
   119  	ts := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
   120  		w.WriteHeader(http.StatusBadRequest)
   121  	}))
   122  	defer ts.Close()
   123  
   124  	client := &http.Client{}
   125  	sender, err := createHttpSender(client, config.AgmaAnalyticsHttpEndpoint{
   126  		Url:     ts.URL,
   127  		Timeout: "1s",
   128  		Gzip:    false,
   129  	})
   130  	testBody := []byte("[{ \"type\": \"test\" }]")
   131  	err = sender([]byte(testBody))
   132  	assert.Error(t, err)
   133  }