Skip to content

Commit

Permalink
Fix: TestAmpBadRequests (prebid#3546)
Browse files Browse the repository at this point in the history
  • Loading branch information
pm-nilesh-chate authored Apr 1, 2024
1 parent c72ffe4 commit cfb9d2e
Showing 1 changed file with 83 additions and 8 deletions.
91 changes: 83 additions & 8 deletions endpoints/openrtb2/amp_auction_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@ import (
"net/url"
"os"
"strconv"
"strings"
"testing"
"time"

Expand Down Expand Up @@ -1028,20 +1029,39 @@ func TestAMPSiteExt(t *testing.T) {

// TestBadRequests makes sure we return 400's on bad requests.
func TestAmpBadRequests(t *testing.T) {
dir := "sample-requests/invalid-whole"
dir := "sample-requests/invalid-whole/"
files, err := os.ReadDir(dir)
assert.NoError(t, err, "Failed to read folder: %s", dir)

badRequests := make(map[string]json.RawMessage, len(files))
mockAmpStoredReq := make(map[string]json.RawMessage, len(files))
badRequests := make(map[string]testCase, len(files))
for index, file := range files {
badRequests[strconv.Itoa(100+index)] = readFile(t, "sample-requests/invalid-whole/"+file.Name())
filename := file.Name()
fileData := readFile(t, dir+filename)

test, err := parseTestData(fileData, filename)
if !assert.NoError(t, err) {
return
}

if skipAmpTest(test) {
continue
}

requestID := strconv.Itoa(100 + index)
test.Query = fmt.Sprintf("account=test_pub&tag_id=%s", requestID)

badRequests[requestID] = test
mockAmpStoredReq[requestID] = test.BidRequest
}

addAmpBadRequests(badRequests, mockAmpStoredReq)

endpoint, _ := NewAmpEndpoint(
fakeUUIDGenerator{},
&mockAmpExchange{},
newParamsValidator(t),
&mockAmpStoredReqFetcher{badRequests},
&mockAmpStoredReqFetcher{data: mockAmpStoredReq},
empty_fetcher.EmptyFetcher{},
&config.Configuration{MaxRequestSize: maxSize},
&metricsConfig.NilMetricsEngine{},
Expand All @@ -1053,16 +1073,71 @@ func TestAmpBadRequests(t *testing.T) {
hooks.EmptyPlanBuilder{},
nil,
)
for requestID := range badRequests {
request := httptest.NewRequest("GET", fmt.Sprintf("/openrtb2/auction/amp?tag_id=%s", requestID), nil)

for _, test := range badRequests {
request := httptest.NewRequest("GET", fmt.Sprintf("/openrtb2/auction/amp?%s", test.Query), nil)
recorder := httptest.NewRecorder()

endpoint(recorder, request, nil)

if recorder.Code != http.StatusBadRequest {
t.Errorf("Expected status %d. Got %d. Input was: %s", http.StatusBadRequest, recorder.Code, fmt.Sprintf("/openrtb2/auction/amp?config=%s", requestID))
response := recorder.Body.String()
assert.Equal(t, test.ExpectedReturnCode, recorder.Code, test.Description)
assert.Contains(t, response, test.ExpectedErrorMessage, "Actual: %s \nExpected: %s. Description: %s \n", response, test.ExpectedErrorMessage, test.Description)
}
}

func skipAmpTest(test testCase) bool {
bidRequest := openrtb2.BidRequest{}
if err := json.Unmarshal(test.BidRequest, &bidRequest); err == nil {
// request.app must not exist in AMP
if bidRequest.App != nil {
return true
}

// data for tag_id='%s' does not define the required imp array
// Invalid request: data for tag_id '%s' includes %d imp elements. Only one is allowed
if len(bidRequest.Imp) == 0 || len(bidRequest.Imp) > 1 {
return true
}

if bidRequest.Device != nil && strings.Contains(string(bidRequest.Device.Ext), "interstitial") {
return true
}
}

// request.ext.prebid.cache is initialised in AMP if it is not present in request
if strings.Contains(test.ExpectedErrorMessage, `Invalid request: request.ext is invalid: request.ext.prebid.cache requires one of the "bids" or "vastxml" properties`) ||
strings.Contains(test.ExpectedErrorMessage, `Invalid request: ext.prebid.storedrequest.id must be a string`) {
return true
}

return false
}

func addAmpBadRequests(mapBadRequests map[string]testCase, mockAmpStoredReq map[string]json.RawMessage) {
mapBadRequests["201"] = testCase{
Description: "missing-tag-id",
Query: "account=test_pub",
ExpectedReturnCode: http.StatusBadRequest,
ExpectedErrorMessage: "Invalid request: AMP requests require an AMP tag_id\n",
}
mockAmpStoredReq["201"] = json.RawMessage(`{}`)

mapBadRequests["202"] = testCase{
Description: "request.app-present",
Query: "account=test_pub&tag_id=202",
ExpectedReturnCode: http.StatusBadRequest,
ExpectedErrorMessage: "Invalid request: request.app must not exist in AMP stored requests.\n",
}
mockAmpStoredReq["202"] = json.RawMessage(`{"imp":[{}],"app":{}}`)

mapBadRequests["203"] = testCase{
Description: "request-with-2-imps",
Query: "account=test_pub&tag_id=203",
ExpectedReturnCode: http.StatusBadRequest,
ExpectedErrorMessage: "Invalid request: data for tag_id '203' includes 2 imp elements. Only one is allowed",
}
mockAmpStoredReq["203"] = json.RawMessage(`{"imp":[{},{}]}`)
}

// TestAmpDebug makes sure we get debug information back when requested
Expand Down

0 comments on commit cfb9d2e

Please sign in to comment.