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 }