From bb36d45901c98707136515193a0cccf0fa2a730d Mon Sep 17 00:00:00 2001 From: Kehan Pan Date: Thu, 30 May 2024 02:51:46 +0000 Subject: [PATCH 01/10] New Adapter: MetaX Signed-off-by: Kehan Pan --- adapters/metax/metax.go | 236 ++++++++++++++++++ adapters/metax/metax_test.go | 58 +++++ .../metax/metaxtest/exemplary/no-bid.json | 76 ++++++ .../exemplary/simple-app-banner.json | 104 ++++++++ .../metaxtest/exemplary/simple-app-video.json | 112 +++++++++ .../exemplary/simple-site-banner.json | 104 ++++++++ .../exemplary/simple-site-video.json | 112 +++++++++ .../supplemental/invalid-adunit-error.json | 31 +++ .../supplemental/invalid-publisher-error.json | 31 +++ .../metaxtest/supplemental/status-400.json | 73 ++++++ .../supplemental/status-unknown.json | 73 ++++++ .../supplemental/zero-impression.json | 19 ++ adapters/metax/params_test.go | 55 ++++ exchange/adapter_builders.go | 2 + openrtb_ext/bidders.go | 2 + openrtb_ext/imp_metax.go | 7 + static/bidder-info/metax.yaml | 13 + static/bidder-params/metax.json | 19 ++ 18 files changed, 1127 insertions(+) create mode 100644 adapters/metax/metax.go create mode 100644 adapters/metax/metax_test.go create mode 100644 adapters/metax/metaxtest/exemplary/no-bid.json create mode 100644 adapters/metax/metaxtest/exemplary/simple-app-banner.json create mode 100644 adapters/metax/metaxtest/exemplary/simple-app-video.json create mode 100644 adapters/metax/metaxtest/exemplary/simple-site-banner.json create mode 100644 adapters/metax/metaxtest/exemplary/simple-site-video.json create mode 100644 adapters/metax/metaxtest/supplemental/invalid-adunit-error.json create mode 100644 adapters/metax/metaxtest/supplemental/invalid-publisher-error.json create mode 100644 adapters/metax/metaxtest/supplemental/status-400.json create mode 100644 adapters/metax/metaxtest/supplemental/status-unknown.json create mode 100644 adapters/metax/metaxtest/supplemental/zero-impression.json create mode 100644 adapters/metax/params_test.go create mode 100644 openrtb_ext/imp_metax.go create mode 100644 static/bidder-info/metax.yaml create mode 100644 static/bidder-params/metax.json diff --git a/adapters/metax/metax.go b/adapters/metax/metax.go new file mode 100644 index 00000000000..e02635f9c22 --- /dev/null +++ b/adapters/metax/metax.go @@ -0,0 +1,236 @@ +package metax + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + "net/url" + "strconv" + "text/template" + + "github.com/prebid/openrtb/v20/openrtb2" + "github.com/prebid/prebid-server/v2/adapters" + "github.com/prebid/prebid-server/v2/config" + "github.com/prebid/prebid-server/v2/errortypes" + "github.com/prebid/prebid-server/v2/macros" + "github.com/prebid/prebid-server/v2/openrtb_ext" + "github.com/prebid/prebid-server/v2/util/ptrutil" +) + +const SupportedCurrency = "USD" + +type MetaxAdapter struct { + template *template.Template +} + +func (a *MetaxAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { + errs := make([]error, 0, len(request.Imp)) + + if len(request.Imp) == 0 { + return nil, []error{&errortypes.BadInput{ + Message: "No impressions in the request", + }} + } + + // split impressions + reqDatas := make([]*adapters.RequestData, 0, len(request.Imp)) + for i := range request.Imp { + imp := &request.Imp[i] + impCopy := *imp + requestCopy := *request + + metaxExt, err := parseBidderExt(imp) + if err != nil { + errs = append(errs, err) + continue + } + + if err := validateParams(metaxExt); err != nil { + errs = append(errs, err) + continue + } + + if err := preprocessImp(&impCopy); err != nil { + errs = append(errs, err) + continue + } + + endpoint, err := a.getEndpoint(metaxExt) + if err != nil { + errs = append(errs, err) + continue + } + + impCopy.Ext = nil + requestCopy.Imp = []openrtb2.Imp{impCopy} + reqJSON, err := json.Marshal(requestCopy) + if err != nil { + errs = append(errs, err) + return nil, errs + } + + headers := http.Header{} + headers.Add("Content-Type", "application/json;charset=utf-8") + headers.Add("Accept", "application/json") + reqDatas = append(reqDatas, &adapters.RequestData{ + Method: "POST", + Uri: endpoint, + Body: reqJSON, + Headers: headers, + ImpIDs: openrtb_ext.GetImpIDs(requestCopy.Imp), + }) + } + + return reqDatas, errs +} + +func (a *MetaxAdapter) MakeBids(bidReq *openrtb2.BidRequest, reqData *adapters.RequestData, respData *adapters.ResponseData) (*adapters.BidderResponse, []error) { + if respData.StatusCode == http.StatusNoContent { + return nil, nil + } + + if respData.StatusCode == http.StatusBadRequest { + return nil, []error{&errortypes.BadInput{ + Message: fmt.Sprintf("Unexpected status code: %d. Bad request", respData.StatusCode), + }} + } + + if respData.StatusCode != http.StatusOK { + return nil, []error{&errortypes.BadServerResponse{ + Message: fmt.Sprintf("Unexpected status code: %d", respData.StatusCode), + }} + } + + var bidResp openrtb2.BidResponse + if err := json.Unmarshal(respData.Body, &bidResp); err != nil { + return nil, []error{err} + } + + // additional no content check + if len(bidResp.SeatBid) == 0 || len(bidResp.SeatBid[0].Bid) == 0 { + return nil, nil + } + + resp := adapters.NewBidderResponseWithBidsCapacity(len(bidResp.SeatBid[0].Bid)) + for _, sb := range bidResp.SeatBid { + for i := range sb.Bid { + bid := &sb.Bid[i] + resp.Bids = append(resp.Bids, &adapters.TypedBid{ + Bid: bid, + BidType: getBidType(bidReq.Imp, bid.ImpID), + }) + } + } + return resp, nil +} + +func (a *MetaxAdapter) getEndpoint(ext *openrtb_ext.ExtImpMetaX) (string, error) { + params := macros.EndpointTemplateParams{ + PublisherID: url.PathEscape(ext.PublisherID), + AdUnit: url.PathEscape(ext.Adunit), + } + return macros.ResolveMacros(a.template, params) +} + +func parseBidderExt(imp *openrtb2.Imp) (*openrtb_ext.ExtImpMetaX, error) { + var bidderExt adapters.ExtImpBidder + if err := json.Unmarshal(imp.Ext, &bidderExt); err != nil { + return nil, err + } + + var metaxExt openrtb_ext.ExtImpMetaX + if err := json.Unmarshal(bidderExt.Bidder, &metaxExt); err != nil { + return nil, errors.New("Wrong MetaX bidder ext") + } + + return &metaxExt, nil +} + +// publisher ID and adunit is numeric at this moment +func validateParams(ext *openrtb_ext.ExtImpMetaX) error { + if _, err := strconv.Atoi(ext.PublisherID); err != nil { + return errors.New("invalid publisher ID") + } + if _, err := strconv.Atoi(ext.Adunit); err != nil { + return errors.New("invalid adunit") + } + return nil +} + +func preprocessImp(imp *openrtb2.Imp) error { + if imp == nil { + return errors.New("imp is nil") + } + + if imp.Banner != nil { + bannerCopy, err := assignBannerSize(imp.Banner) + if err != nil { + return err + } + imp.Banner = bannerCopy + } + + // clean inventory + switch { + case imp.Video != nil: + imp.Banner = nil + case imp.Banner != nil: + imp.Video = nil + default: + } + + return nil +} + +func assignBannerSize(banner *openrtb2.Banner) (*openrtb2.Banner, error) { + if banner.W != nil && banner.H != nil { + return banner, nil + } + + return assignBannerWidthAndHeight(banner, banner.Format[0].W, banner.Format[0].H), nil +} + +func assignBannerWidthAndHeight(banner *openrtb2.Banner, w, h int64) *openrtb2.Banner { + bannerCopy := *banner + bannerCopy.W = ptrutil.ToPtr(w) + bannerCopy.H = ptrutil.ToPtr(h) + return &bannerCopy +} + +func getBidType(imps []openrtb2.Imp, impID string) openrtb_ext.BidType { + for _, imp := range imps { + if imp.ID != impID { + continue + } + switch { + case imp.Banner != nil: + return openrtb_ext.BidTypeBanner + case imp.Video != nil: + return openrtb_ext.BidTypeVideo + case imp.Native != nil: + return openrtb_ext.BidTypeNative + case imp.Audio != nil: + return openrtb_ext.BidTypeAudio + default: + } + } + return openrtb_ext.BidTypeBanner +} + +// Builder builds a new instance of the MetaX adapter for the given bidder with the given config. +func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { + if config.Endpoint == "" { + return nil, errors.New("endpoint is empty") + } + + templ, err := template.New("endpointTemplate").Parse(config.Endpoint) + if err != nil { + return nil, fmt.Errorf("unable to parse endpoint: %v", err) + } + + bidder := &MetaxAdapter{ + template: templ, + } + return bidder, nil +} diff --git a/adapters/metax/metax_test.go b/adapters/metax/metax_test.go new file mode 100644 index 00000000000..e223d70b52a --- /dev/null +++ b/adapters/metax/metax_test.go @@ -0,0 +1,58 @@ +package metax + +import ( + "testing" + + "github.com/prebid/openrtb/v20/openrtb2" + "github.com/prebid/prebid-server/v2/adapters/adapterstest" + "github.com/prebid/prebid-server/v2/config" + "github.com/prebid/prebid-server/v2/openrtb_ext" + "github.com/prebid/prebid-server/v2/util/ptrutil" + "github.com/stretchr/testify/assert" +) + +func TestJsonSamples(t *testing.T) { + bidder, buildErr := Builder( + openrtb_ext.BidderMetaX, + config.Adapter{ + Endpoint: "https://hb.metaxads.com/prebid?sid={{.PublisherID}}&adunit={{.AdUnit}}&source=prebid-server", + }, + config.Server{ + ExternalUrl: "http://hosturl.com", + GvlID: 1301, + DataCenter: "2", + }, + ) + + if buildErr != nil { + t.Fatalf("Builder returned unexpected error %v", buildErr) + } + + adapterstest.RunJSONBidderTest(t, "metaxtest", bidder) +} + +func TestAssignBannerSize(t *testing.T) { + b1 := &openrtb2.Banner{ + Format: []openrtb2.Format{ + {W: 300, H: 250}, + {W: 728, H: 90}, + }, + } + b1n, err := assignBannerSize(b1) + assert.Equal(t, b1n.W, ptrutil.ToPtr(int64(300))) + assert.Equal(t, b1n.H, ptrutil.ToPtr(int64(250))) + assert.Nil(t, err) + + b2 := &openrtb2.Banner{ + Format: []openrtb2.Format{ + {W: 300, H: 250}, + {W: 728, H: 90}, + }, + W: ptrutil.ToPtr(int64(1080)), + H: ptrutil.ToPtr(int64(720)), + } + b2n, err := assignBannerSize(b2) + assert.Equal(t, b2n.W, ptrutil.ToPtr(int64(1080))) + assert.Equal(t, b2n.H, ptrutil.ToPtr(int64(720))) + assert.Nil(t, err) +} diff --git a/adapters/metax/metaxtest/exemplary/no-bid.json b/adapters/metax/metaxtest/exemplary/no-bid.json new file mode 100644 index 00000000000..d721510b892 --- /dev/null +++ b/adapters/metax/metaxtest/exemplary/no-bid.json @@ -0,0 +1,76 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "publisherId": "10000000", + "adunit": "100000" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "body": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + } + } + ] + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 204, + "body": { + } + } + } + ], + "expectedBidResponses": [] +} diff --git a/adapters/metax/metaxtest/exemplary/simple-app-banner.json b/adapters/metax/metaxtest/exemplary/simple-app-banner.json new file mode 100644 index 00000000000..9ed7431e453 --- /dev/null +++ b/adapters/metax/metaxtest/exemplary/simple-app-banner.json @@ -0,0 +1,104 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ] + }, + "ext": { + "bidder": { + "publisherId": "10000000", + "adunit": "100000" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "body": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ], + "w": 728, + "h": 90 + } + } + ] + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "metax", + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.500000, + "adm": "some-test-ad", + "crid": "test-crid", + "h": 90, + "w": 728 + } + ] + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 728, + "h": 90 + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/metax/metaxtest/exemplary/simple-app-video.json b/adapters/metax/metaxtest/exemplary/simple-app-video.json new file mode 100644 index 00000000000..8b96ffe8708 --- /dev/null +++ b/adapters/metax/metaxtest/exemplary/simple-app-video.json @@ -0,0 +1,112 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "publisherId": "10000000", + "adunit": "100000" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "body": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + } + } + ] + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "cur": "USD", + "seatbid": [ + { + "seat": "metax", + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.500000, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 1024, + "h": 576 + } + ] + } + ] + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 1024, + "h": 576 + }, + "type": "video" + } + ] + } + ] +} diff --git a/adapters/metax/metaxtest/exemplary/simple-site-banner.json b/adapters/metax/metaxtest/exemplary/simple-site-banner.json new file mode 100644 index 00000000000..ec9ec75f956 --- /dev/null +++ b/adapters/metax/metaxtest/exemplary/simple-site-banner.json @@ -0,0 +1,104 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ] + }, + "ext": { + "bidder": { + "publisherId": "10000000", + "adunit": "100000" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "body": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ], + "w": 728, + "h": 90 + } + } + ] + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "metax", + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.500000, + "adm": "some-test-ad", + "crid": "test-crid", + "h": 90, + "w": 728 + } + ] + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 728, + "h": 90 + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/metax/metaxtest/exemplary/simple-site-video.json b/adapters/metax/metaxtest/exemplary/simple-site-video.json new file mode 100644 index 00000000000..2cf197a651a --- /dev/null +++ b/adapters/metax/metaxtest/exemplary/simple-site-video.json @@ -0,0 +1,112 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "publisherId": "10000000", + "adunit": "100000" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "body": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + } + } + ] + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "cur": "USD", + "seatbid": [ + { + "seat": "metax", + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.500000, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 1024, + "h": 576 + } + ] + } + ] + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 1024, + "h": 576 + }, + "type": "video" + } + ] + } + ] +} diff --git a/adapters/metax/metaxtest/supplemental/invalid-adunit-error.json b/adapters/metax/metaxtest/supplemental/invalid-adunit-error.json new file mode 100644 index 00000000000..5ea20b6f7c0 --- /dev/null +++ b/adapters/metax/metaxtest/supplemental/invalid-adunit-error.json @@ -0,0 +1,31 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "format": [{ + "w": 728, + "h": 90 + }], + "ext": { + "bidder": { + "publisherId": "10000000", + "adunit": "abc" + } + } + } + ], + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" + } + }, + "expectedMakeRequestsErrors": [ + { + "value": "invalid adunit", + "comparison": "literal" + } + ] +} diff --git a/adapters/metax/metaxtest/supplemental/invalid-publisher-error.json b/adapters/metax/metaxtest/supplemental/invalid-publisher-error.json new file mode 100644 index 00000000000..2dd8704f0ce --- /dev/null +++ b/adapters/metax/metaxtest/supplemental/invalid-publisher-error.json @@ -0,0 +1,31 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "format": [{ + "w": 728, + "h": 90 + }], + "ext": { + "bidder": { + "publisherId": "abc", + "adunit": "100000" + } + } + } + ], + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" + } + }, + "expectedMakeRequestsErrors": [ + { + "value": "invalid publisher ID", + "comparison": "literal" + } + ] +} diff --git a/adapters/metax/metaxtest/supplemental/status-400.json b/adapters/metax/metaxtest/supplemental/status-400.json new file mode 100644 index 00000000000..654e034ec27 --- /dev/null +++ b/adapters/metax/metaxtest/supplemental/status-400.json @@ -0,0 +1,73 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ] + }, + "ext": { + "bidder": { + "publisherId": "10000000", + "adunit": "100000" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "body": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ], + "w": 728, + "h": 90 + } + } + ] + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 400, + "body": { + } + } + } + ], + "expectedMakeBidsErrors": [ + { + "value": "Unexpected status code: 400. Bad request", + "comparison": "literal" + } + ] +} diff --git a/adapters/metax/metaxtest/supplemental/status-unknown.json b/adapters/metax/metaxtest/supplemental/status-unknown.json new file mode 100644 index 00000000000..ac9ecc51d68 --- /dev/null +++ b/adapters/metax/metaxtest/supplemental/status-unknown.json @@ -0,0 +1,73 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ] + }, + "ext": { + "bidder": { + "publisherId": "10000000", + "adunit": "100000" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "body": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ], + "w": 728, + "h": 90 + } + } + ] + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 500, + "body": { + } + } + } + ], + "expectedMakeBidsErrors": [ + { + "value": "Unexpected status code: 500", + "comparison": "literal" + } + ] +} diff --git a/adapters/metax/metaxtest/supplemental/zero-impression.json b/adapters/metax/metaxtest/supplemental/zero-impression.json new file mode 100644 index 00000000000..a0725bb0c4e --- /dev/null +++ b/adapters/metax/metaxtest/supplemental/zero-impression.json @@ -0,0 +1,19 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + ], + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + } + }, + "expectedMakeRequestsErrors": [ + { + "value": "No impressions in the request", + "comparison": "literal" + } + ] +} diff --git a/adapters/metax/params_test.go b/adapters/metax/params_test.go new file mode 100644 index 00000000000..066bc37306c --- /dev/null +++ b/adapters/metax/params_test.go @@ -0,0 +1,55 @@ +package metax + +import ( + "encoding/json" + "testing" + + "github.com/prebid/prebid-server/v2/openrtb_ext" +) + +// This file actually intends to test static/bidder-params/metax.json +// +// These also validate the format of the external API: request.imp[i].ext.prebid.bidder.metax + +// TestValidParams makes sure that the metax schema accepts all imp.ext fields which we intend to support. +func TestValidParams(t *testing.T) { + validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params") + if err != nil { + t.Fatalf("Failed to fetch the json-schemas. %v", err) + } + + for _, validParam := range validParams { + if err := validator.Validate(openrtb_ext.BidderMetaX, json.RawMessage(validParam)); err != nil { + t.Errorf("Schema rejected metax params: %s", validParam) + } + } +} + +// TestInvalidParams makes sure that the metax schema rejects all the imp.ext fields we don't support. +func TestInvalidParams(t *testing.T) { + validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params") + if err != nil { + t.Fatalf("Failed to fetch the json-schemas. %v", err) + } + + for _, invalidParam := range invalidParams { + if err := validator.Validate(openrtb_ext.BidderMetaX, json.RawMessage(invalidParam)); err == nil { + t.Errorf("Schema allowed unexpected params: %s", invalidParam) + } + } +} + +var validParams = []string{ + `{"publisherId": "10000000", "adunit": "100000"}`, +} + +var invalidParams = []string{ + ``, + `null`, + `undefined`, + `0`, + `{}`, + `{"publisherId": "", "adunit": ""}`, + `{"publisherId": "10000000", "adunit": ""}`, + `{"publisherId": "", "adunit": "100000"}`, +} diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go index 09c7bf83777..b0458fd88eb 100755 --- a/exchange/adapter_builders.go +++ b/exchange/adapter_builders.go @@ -123,6 +123,7 @@ import ( "github.com/prebid/prebid-server/v2/adapters/madvertise" "github.com/prebid/prebid-server/v2/adapters/marsmedia" "github.com/prebid/prebid-server/v2/adapters/medianet" + "github.com/prebid/prebid-server/v2/adapters/metax" "github.com/prebid/prebid-server/v2/adapters/mgid" "github.com/prebid/prebid-server/v2/adapters/mgidX" "github.com/prebid/prebid-server/v2/adapters/minutemedia" @@ -335,6 +336,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder { openrtb_ext.BidderMarsmedia: marsmedia.Builder, openrtb_ext.BidderMediafuse: appnexus.Builder, openrtb_ext.BidderMedianet: medianet.Builder, + openrtb_ext.BidderMetaX: metax.Builder, openrtb_ext.BidderMgid: mgid.Builder, openrtb_ext.BidderMgidX: mgidX.Builder, openrtb_ext.BidderMinuteMedia: minutemedia.Builder, diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go index b6cda02b89c..68c703100eb 100644 --- a/openrtb_ext/bidders.go +++ b/openrtb_ext/bidders.go @@ -141,6 +141,7 @@ var coreBidderNames []BidderName = []BidderName{ BidderMarsmedia, BidderMediafuse, BidderMedianet, + BidderMetaX, BidderMgid, BidderMgidX, BidderMinuteMedia, @@ -451,6 +452,7 @@ const ( BidderMarsmedia BidderName = "marsmedia" BidderMediafuse BidderName = "mediafuse" BidderMedianet BidderName = "medianet" + BidderMetaX BidderName = "metax" BidderMgid BidderName = "mgid" BidderMgidX BidderName = "mgidX" BidderMinuteMedia BidderName = "minutemedia" diff --git a/openrtb_ext/imp_metax.go b/openrtb_ext/imp_metax.go new file mode 100644 index 00000000000..8d518501203 --- /dev/null +++ b/openrtb_ext/imp_metax.go @@ -0,0 +1,7 @@ +package openrtb_ext + +// ExtImpMetaX defines the contract for bidrequest.imp[i].ext.prebid.bidder.metax +type ExtImpMetaX struct { + PublisherID string `json:"publisherId"` + Adunit string `json:"adunit"` +} diff --git a/static/bidder-info/metax.yaml b/static/bidder-info/metax.yaml new file mode 100644 index 00000000000..3b902461a93 --- /dev/null +++ b/static/bidder-info/metax.yaml @@ -0,0 +1,13 @@ +endpoint: "https://hb.metaxads.com/prebid?sid={{.PublisherID}}&adunit={{.AdUnit}}&source=prebid-server" +maintainer: + email: "prebid@metaxsoft.com" +gvlVendorID: 1301 +capabilities: + app: + mediaTypes: + - banner + - video + site: + mediaTypes: + - banner + - video diff --git a/static/bidder-params/metax.json b/static/bidder-params/metax.json new file mode 100644 index 00000000000..ee64f632dec --- /dev/null +++ b/static/bidder-params/metax.json @@ -0,0 +1,19 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "MetaX Adapter Params", + "description": "A schema which validates params accepted by the MetaX adapter", + "type": "object", + "properties": { + "publisherId": { + "type": "string", + "description": "An ID which identifies the publisher", + "minLength": 1 + }, + "adunit": { + "type": "string", + "description": "An ID which identifies the adunit", + "minLength": 1 + } + }, + "required": ["publisherId", "adunit"] +} From 7d24b8dd0daed41fe61708eb9b0c225193377223 Mon Sep 17 00:00:00 2001 From: Kehan Pan Date: Thu, 30 May 2024 09:02:53 +0000 Subject: [PATCH 02/10] MetaX: rename adapter struct name Signed-off-by: Kehan Pan --- adapters/metax/metax.go | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/adapters/metax/metax.go b/adapters/metax/metax.go index e02635f9c22..d11e70bd5d8 100644 --- a/adapters/metax/metax.go +++ b/adapters/metax/metax.go @@ -20,11 +20,11 @@ import ( const SupportedCurrency = "USD" -type MetaxAdapter struct { +type adapter struct { template *template.Template } -func (a *MetaxAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { +func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { errs := make([]error, 0, len(request.Imp)) if len(request.Imp) == 0 { @@ -85,7 +85,7 @@ func (a *MetaxAdapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapt return reqDatas, errs } -func (a *MetaxAdapter) MakeBids(bidReq *openrtb2.BidRequest, reqData *adapters.RequestData, respData *adapters.ResponseData) (*adapters.BidderResponse, []error) { +func (a *adapter) MakeBids(bidReq *openrtb2.BidRequest, reqData *adapters.RequestData, respData *adapters.ResponseData) (*adapters.BidderResponse, []error) { if respData.StatusCode == http.StatusNoContent { return nil, nil } @@ -125,7 +125,7 @@ func (a *MetaxAdapter) MakeBids(bidReq *openrtb2.BidRequest, reqData *adapters.R return resp, nil } -func (a *MetaxAdapter) getEndpoint(ext *openrtb_ext.ExtImpMetaX) (string, error) { +func (a *adapter) getEndpoint(ext *openrtb_ext.ExtImpMetaX) (string, error) { params := macros.EndpointTemplateParams{ PublisherID: url.PathEscape(ext.PublisherID), AdUnit: url.PathEscape(ext.Adunit), @@ -229,7 +229,7 @@ func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server co return nil, fmt.Errorf("unable to parse endpoint: %v", err) } - bidder := &MetaxAdapter{ + bidder := &adapter{ template: templ, } return bidder, nil From d3f88ede5594eec437701b027d43f84c752bf011 Mon Sep 17 00:00:00 2001 From: Kehan Pan Date: Mon, 3 Jun 2024 10:49:22 +0000 Subject: [PATCH 03/10] MetaX: add more test cases Signed-off-by: Kehan Pan --- adapters/metax/metax.go | 8 ++ adapters/metax/metax_test.go | 103 ++++++++++++++++++ .../supplemental/invalid-ext-bidder.json | 28 +++++ .../metaxtest/supplemental/invalid-ext.json | 26 +++++ .../metaxtest/supplemental/resp-bad-json.json | 72 ++++++++++++ 5 files changed, 237 insertions(+) create mode 100644 adapters/metax/metaxtest/supplemental/invalid-ext-bidder.json create mode 100644 adapters/metax/metaxtest/supplemental/invalid-ext.json create mode 100644 adapters/metax/metaxtest/supplemental/resp-bad-json.json diff --git a/adapters/metax/metax.go b/adapters/metax/metax.go index d11e70bd5d8..be6f8d2f646 100644 --- a/adapters/metax/metax.go +++ b/adapters/metax/metax.go @@ -175,8 +175,12 @@ func preprocessImp(imp *openrtb2.Imp) error { switch { case imp.Video != nil: imp.Banner = nil + imp.Native = nil + imp.Audio = nil case imp.Banner != nil: imp.Video = nil + imp.Native = nil + imp.Audio = nil default: } @@ -188,6 +192,10 @@ func assignBannerSize(banner *openrtb2.Banner) (*openrtb2.Banner, error) { return banner, nil } + if len(banner.Format) == 0 { + return banner, nil + } + return assignBannerWidthAndHeight(banner, banner.Format[0].W, banner.Format[0].H), nil } diff --git a/adapters/metax/metax_test.go b/adapters/metax/metax_test.go index e223d70b52a..e315ecfaf0f 100644 --- a/adapters/metax/metax_test.go +++ b/adapters/metax/metax_test.go @@ -1,6 +1,7 @@ package metax import ( + "encoding/json" "testing" "github.com/prebid/openrtb/v20/openrtb2" @@ -31,6 +32,72 @@ func TestJsonSamples(t *testing.T) { adapterstest.RunJSONBidderTest(t, "metaxtest", bidder) } +func TestParseBidderExt(t *testing.T) { + data := ` +{ + "bidder": { + "publisherId": "1000", + "adunit": "200" + } +}` + imp := &openrtb2.Imp{ + Ext: json.RawMessage([]byte(data)), + } + metaxExt, err := parseBidderExt(imp) + assert.Nil(t, err) + assert.Equal(t, "1000", metaxExt.PublisherID) + assert.Equal(t, "200", metaxExt.Adunit) +} + +func TestValidateParams(t *testing.T) { + tests := []struct { + ext *openrtb_ext.ExtImpMetaX + errorMsg string + }{ + { + ext: &openrtb_ext.ExtImpMetaX{ + PublisherID: "1000", + Adunit: "1", + }, + errorMsg: "", + }, + { + ext: &openrtb_ext.ExtImpMetaX{ + PublisherID: "1000", + Adunit: "abc", + }, + errorMsg: "invalid adunit", + }, + { + ext: &openrtb_ext.ExtImpMetaX{ + PublisherID: "abc", + Adunit: "1", + }, + errorMsg: "invalid publisher ID", + }, + } + + for _, test := range tests { + errMsg := "" + err := validateParams(test.ext) + if err != nil { + errMsg = err.Error() + } + assert.Equal(t, test.errorMsg, errMsg) + } +} + +func TestPreprocessImp(t *testing.T) { + assert.NotNil(t, preprocessImp(nil)) + + imp := &openrtb2.Imp{ + Banner: &openrtb2.Banner{}, + Video: &openrtb2.Video{}, + } + preprocessImp(imp) + assert.Nil(t, imp.Banner) +} + func TestAssignBannerSize(t *testing.T) { b1 := &openrtb2.Banner{ Format: []openrtb2.Format{ @@ -56,3 +123,39 @@ func TestAssignBannerSize(t *testing.T) { assert.Equal(t, b2n.H, ptrutil.ToPtr(int64(720))) assert.Nil(t, err) } + +func TestGetBidType(t *testing.T) { + imps := []openrtb2.Imp{ + {ID: "1", Banner: &openrtb2.Banner{}}, + {ID: "2", Video: &openrtb2.Video{}}, + {ID: "3", Native: &openrtb2.Native{}}, + {ID: "4", Audio: &openrtb2.Audio{}}, + } + + tests := []struct { + id string + bidtype openrtb_ext.BidType + }{ + {"1", openrtb_ext.BidTypeBanner}, + {"2", openrtb_ext.BidTypeVideo}, + {"3", openrtb_ext.BidTypeNative}, + {"4", openrtb_ext.BidTypeAudio}, + {"unknown", openrtb_ext.BidTypeBanner}, + } + + for _, test := range tests { + assert.Equal(t, test.bidtype, getBidType(imps, test.id)) + } +} + +func TestBuilder(t *testing.T) { + serverCfg := config.Server{} + + cfg1 := config.Adapter{Endpoint: "https://hb.metaxads.com/prebid"} + _, err1 := Builder("test", cfg1, serverCfg) + assert.Nil(t, err1) + + cfg2 := config.Adapter{Endpoint: ""} + _, err2 := Builder("test2", cfg2, serverCfg) + assert.NotNil(t, err2) +} diff --git a/adapters/metax/metaxtest/supplemental/invalid-ext-bidder.json b/adapters/metax/metaxtest/supplemental/invalid-ext-bidder.json new file mode 100644 index 00000000000..003d11cdc54 --- /dev/null +++ b/adapters/metax/metaxtest/supplemental/invalid-ext-bidder.json @@ -0,0 +1,28 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "format": [{ + "w": 728, + "h": 90 + }], + "ext": { + "bidder": "bad string" + } + } + ], + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" + } + }, + "expectedMakeRequestsErrors": [ + { + "value": "Wrong MetaX bidder ext", + "comparison": "literal" + } + ] +} diff --git a/adapters/metax/metaxtest/supplemental/invalid-ext.json b/adapters/metax/metaxtest/supplemental/invalid-ext.json new file mode 100644 index 00000000000..aaf4611a870 --- /dev/null +++ b/adapters/metax/metaxtest/supplemental/invalid-ext.json @@ -0,0 +1,26 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "format": [{ + "w": 728, + "h": 90 + }], + "ext": "" + } + ], + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" + } + }, + "expectedMakeRequestsErrors": [ + { + "value": "json: cannot unmarshal*", + "comparison": "regex" + } + ] +} diff --git a/adapters/metax/metaxtest/supplemental/resp-bad-json.json b/adapters/metax/metaxtest/supplemental/resp-bad-json.json new file mode 100644 index 00000000000..9933750ad6e --- /dev/null +++ b/adapters/metax/metaxtest/supplemental/resp-bad-json.json @@ -0,0 +1,72 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ] + }, + "ext": { + "bidder": { + "publisherId": "10000000", + "adunit": "100000" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "body": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ], + "w": 728, + "h": 90 + } + } + ] + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": "this is not a valid json" + } + } + ], + "expectedMakeBidsErrors": [ + { + "value": "json: cannot unmarshal*", + "comparison": "regex" + } + ] +} From 09cc0180fcd2b93126dfd0a9aa3560d9bd0fd309 Mon Sep 17 00:00:00 2001 From: Kehan Pan Date: Fri, 14 Jun 2024 07:02:48 +0000 Subject: [PATCH 04/10] MetaX: fixed new adapter issues Signed-off-by: Kehan Pan --- adapters/metax/metax.go | 90 ++--- adapters/metax/metax_test.go | 90 ++--- .../metaxtest/exemplary/app-formats.json | 154 ++++++++ .../metax/metaxtest/exemplary/app-imps.json | 345 ++++++++++++++++++ .../metax/metaxtest/exemplary/no-bid.json | 18 +- .../metax/metaxtest/exemplary/no-seat.json | 94 +++++ .../exemplary/simple-app-banner.json | 24 +- .../exemplary/simple-app-native.json | 99 +++++ .../metaxtest/exemplary/simple-app-video.json | 24 +- .../exemplary/simple-site-banner.json | 24 +- .../exemplary/simple-site-native.json | 99 +++++ .../exemplary/simple-site-video.json | 24 +- .../supplemental/invalid-adunit-error.json | 16 +- .../supplemental/invalid-ext-bidder.json | 12 +- .../metaxtest/supplemental/invalid-ext.json | 12 +- .../supplemental/invalid-publisher-error.json | 16 +- .../metaxtest/supplemental/resp-bad-json.json | 10 +- .../supplemental/resp-bad-markuptype.json | 100 +++++ .../metaxtest/supplemental/status-400.json | 12 +- .../{status-unknown.json => status-500.json} | 21 +- .../metaxtest/supplemental/status-503.json | 80 ++++ .../supplemental/zero-impression.json | 19 - adapters/metax/params_test.go | 11 +- openrtb_ext/imp_metax.go | 4 +- static/bidder-info/metax.yaml | 4 + static/bidder-params/metax.json | 8 +- 26 files changed, 1202 insertions(+), 208 deletions(-) create mode 100644 adapters/metax/metaxtest/exemplary/app-formats.json create mode 100644 adapters/metax/metaxtest/exemplary/app-imps.json create mode 100644 adapters/metax/metaxtest/exemplary/no-seat.json create mode 100644 adapters/metax/metaxtest/exemplary/simple-app-native.json create mode 100644 adapters/metax/metaxtest/exemplary/simple-site-native.json create mode 100644 adapters/metax/metaxtest/supplemental/resp-bad-markuptype.json rename adapters/metax/metaxtest/supplemental/{status-unknown.json => status-500.json} (75%) create mode 100644 adapters/metax/metaxtest/supplemental/status-503.json delete mode 100644 adapters/metax/metaxtest/supplemental/zero-impression.json diff --git a/adapters/metax/metax.go b/adapters/metax/metax.go index be6f8d2f646..ea776cd4921 100644 --- a/adapters/metax/metax.go +++ b/adapters/metax/metax.go @@ -5,7 +5,6 @@ import ( "errors" "fmt" "net/http" - "net/url" "strconv" "text/template" @@ -27,12 +26,6 @@ type adapter struct { func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { errs := make([]error, 0, len(request.Imp)) - if len(request.Imp) == 0 { - return nil, []error{&errortypes.BadInput{ - Message: "No impressions in the request", - }} - } - // split impressions reqDatas := make([]*adapters.RequestData, 0, len(request.Imp)) for i := range request.Imp { @@ -46,11 +39,6 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.E continue } - if err := validateParams(metaxExt); err != nil { - errs = append(errs, err) - continue - } - if err := preprocessImp(&impCopy); err != nil { errs = append(errs, err) continue @@ -62,7 +50,6 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.E continue } - impCopy.Ext = nil requestCopy.Imp = []openrtb2.Imp{impCopy} reqJSON, err := json.Marshal(requestCopy) if err != nil { @@ -86,20 +73,12 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.E } func (a *adapter) MakeBids(bidReq *openrtb2.BidRequest, reqData *adapters.RequestData, respData *adapters.ResponseData) (*adapters.BidderResponse, []error) { - if respData.StatusCode == http.StatusNoContent { + if adapters.IsResponseStatusCodeNoContent(respData) { return nil, nil } - if respData.StatusCode == http.StatusBadRequest { - return nil, []error{&errortypes.BadInput{ - Message: fmt.Sprintf("Unexpected status code: %d. Bad request", respData.StatusCode), - }} - } - - if respData.StatusCode != http.StatusOK { - return nil, []error{&errortypes.BadServerResponse{ - Message: fmt.Sprintf("Unexpected status code: %d", respData.StatusCode), - }} + if err := adapters.CheckResponseStatusCodeForErrors(respData); err != nil { + return nil, []error{err} } var bidResp openrtb2.BidResponse @@ -116,9 +95,13 @@ func (a *adapter) MakeBids(bidReq *openrtb2.BidRequest, reqData *adapters.Reques for _, sb := range bidResp.SeatBid { for i := range sb.Bid { bid := &sb.Bid[i] + bidType, err := getBidType(bid) + if err != nil { + return nil, []error{err} + } resp.Bids = append(resp.Bids, &adapters.TypedBid{ Bid: bid, - BidType: getBidType(bidReq.Imp, bid.ImpID), + BidType: bidType, }) } } @@ -127,8 +110,8 @@ func (a *adapter) MakeBids(bidReq *openrtb2.BidRequest, reqData *adapters.Reques func (a *adapter) getEndpoint(ext *openrtb_ext.ExtImpMetaX) (string, error) { params := macros.EndpointTemplateParams{ - PublisherID: url.PathEscape(ext.PublisherID), - AdUnit: url.PathEscape(ext.Adunit), + PublisherID: strconv.Itoa(ext.PublisherID), + AdUnit: strconv.Itoa(ext.Adunit), } return macros.ResolveMacros(a.template, params) } @@ -147,17 +130,6 @@ func parseBidderExt(imp *openrtb2.Imp) (*openrtb_ext.ExtImpMetaX, error) { return &metaxExt, nil } -// publisher ID and adunit is numeric at this moment -func validateParams(ext *openrtb_ext.ExtImpMetaX) error { - if _, err := strconv.Atoi(ext.PublisherID); err != nil { - return errors.New("invalid publisher ID") - } - if _, err := strconv.Atoi(ext.Adunit); err != nil { - return errors.New("invalid adunit") - } - return nil -} - func preprocessImp(imp *openrtb2.Imp) error { if imp == nil { return errors.New("imp is nil") @@ -171,19 +143,6 @@ func preprocessImp(imp *openrtb2.Imp) error { imp.Banner = bannerCopy } - // clean inventory - switch { - case imp.Video != nil: - imp.Banner = nil - imp.Native = nil - imp.Audio = nil - case imp.Banner != nil: - imp.Video = nil - imp.Native = nil - imp.Audio = nil - default: - } - return nil } @@ -206,24 +165,21 @@ func assignBannerWidthAndHeight(banner *openrtb2.Banner, w, h int64) *openrtb2.B return &bannerCopy } -func getBidType(imps []openrtb2.Imp, impID string) openrtb_ext.BidType { - for _, imp := range imps { - if imp.ID != impID { - continue - } - switch { - case imp.Banner != nil: - return openrtb_ext.BidTypeBanner - case imp.Video != nil: - return openrtb_ext.BidTypeVideo - case imp.Native != nil: - return openrtb_ext.BidTypeNative - case imp.Audio != nil: - return openrtb_ext.BidTypeAudio - default: +func getBidType(bid *openrtb2.Bid) (openrtb_ext.BidType, error) { + switch bid.MType { + case openrtb2.MarkupBanner: + return openrtb_ext.BidTypeBanner, nil + case openrtb2.MarkupVideo: + return openrtb_ext.BidTypeVideo, nil + case openrtb2.MarkupNative: + return openrtb_ext.BidTypeNative, nil + case openrtb2.MarkupAudio: + return openrtb_ext.BidTypeAudio, nil + default: + return "", &errortypes.BadServerResponse{ + Message: fmt.Sprintf("Unsupported MType %d", bid.MType), } } - return openrtb_ext.BidTypeBanner } // Builder builds a new instance of the MetaX adapter for the given bidder with the given config. diff --git a/adapters/metax/metax_test.go b/adapters/metax/metax_test.go index e315ecfaf0f..f9c551958d5 100644 --- a/adapters/metax/metax_test.go +++ b/adapters/metax/metax_test.go @@ -36,8 +36,8 @@ func TestParseBidderExt(t *testing.T) { data := ` { "bidder": { - "publisherId": "1000", - "adunit": "200" + "publisherId": 1000, + "adunit": 200 } }` imp := &openrtb2.Imp{ @@ -45,57 +45,12 @@ func TestParseBidderExt(t *testing.T) { } metaxExt, err := parseBidderExt(imp) assert.Nil(t, err) - assert.Equal(t, "1000", metaxExt.PublisherID) - assert.Equal(t, "200", metaxExt.Adunit) -} - -func TestValidateParams(t *testing.T) { - tests := []struct { - ext *openrtb_ext.ExtImpMetaX - errorMsg string - }{ - { - ext: &openrtb_ext.ExtImpMetaX{ - PublisherID: "1000", - Adunit: "1", - }, - errorMsg: "", - }, - { - ext: &openrtb_ext.ExtImpMetaX{ - PublisherID: "1000", - Adunit: "abc", - }, - errorMsg: "invalid adunit", - }, - { - ext: &openrtb_ext.ExtImpMetaX{ - PublisherID: "abc", - Adunit: "1", - }, - errorMsg: "invalid publisher ID", - }, - } - - for _, test := range tests { - errMsg := "" - err := validateParams(test.ext) - if err != nil { - errMsg = err.Error() - } - assert.Equal(t, test.errorMsg, errMsg) - } + assert.Equal(t, 1000, metaxExt.PublisherID) + assert.Equal(t, 200, metaxExt.Adunit) } func TestPreprocessImp(t *testing.T) { assert.NotNil(t, preprocessImp(nil)) - - imp := &openrtb2.Imp{ - Banner: &openrtb2.Banner{}, - Video: &openrtb2.Video{}, - } - preprocessImp(imp) - assert.Nil(t, imp.Banner) } func TestAssignBannerSize(t *testing.T) { @@ -109,6 +64,7 @@ func TestAssignBannerSize(t *testing.T) { assert.Equal(t, b1n.W, ptrutil.ToPtr(int64(300))) assert.Equal(t, b1n.H, ptrutil.ToPtr(int64(250))) assert.Nil(t, err) + assert.NotSame(t, b1, b1n) b2 := &openrtb2.Banner{ Format: []openrtb2.Format{ @@ -122,29 +78,37 @@ func TestAssignBannerSize(t *testing.T) { assert.Equal(t, b2n.W, ptrutil.ToPtr(int64(1080))) assert.Equal(t, b2n.H, ptrutil.ToPtr(int64(720))) assert.Nil(t, err) -} + assert.Same(t, b2, b2n) -func TestGetBidType(t *testing.T) { - imps := []openrtb2.Imp{ - {ID: "1", Banner: &openrtb2.Banner{}}, - {ID: "2", Video: &openrtb2.Video{}}, - {ID: "3", Native: &openrtb2.Native{}}, - {ID: "4", Audio: &openrtb2.Audio{}}, + b3 := &openrtb2.Banner{ + W: ptrutil.ToPtr(int64(1080)), + H: ptrutil.ToPtr(int64(720)), } + b3n, err := assignBannerSize(b3) + assert.Equal(t, b3n.W, ptrutil.ToPtr(int64(1080))) + assert.Equal(t, b3n.H, ptrutil.ToPtr(int64(720))) + assert.Nil(t, err) + assert.Same(t, b3, b3n) +} +func TestGetBidType(t *testing.T) { tests := []struct { - id string + bid *openrtb2.Bid bidtype openrtb_ext.BidType }{ - {"1", openrtb_ext.BidTypeBanner}, - {"2", openrtb_ext.BidTypeVideo}, - {"3", openrtb_ext.BidTypeNative}, - {"4", openrtb_ext.BidTypeAudio}, - {"unknown", openrtb_ext.BidTypeBanner}, + {&openrtb2.Bid{AdM: "", MType: openrtb2.MarkupBanner}, openrtb_ext.BidTypeBanner}, + {&openrtb2.Bid{AdM: "", MType: openrtb2.MarkupVideo}, openrtb_ext.BidTypeVideo}, + {&openrtb2.Bid{AdM: "", MType: openrtb2.MarkupNative}, openrtb_ext.BidTypeNative}, + {&openrtb2.Bid{AdM: "", MType: openrtb2.MarkupAudio}, openrtb_ext.BidTypeAudio}, + {&openrtb2.Bid{AdM: "", MType: 0}, ""}, } for _, test := range tests { - assert.Equal(t, test.bidtype, getBidType(imps, test.id)) + bidType, err := getBidType(test.bid) + assert.Equal(t, test.bidtype, bidType) + if bidType == "" { + assert.NotNil(t, err) + } } } diff --git a/adapters/metax/metaxtest/exemplary/app-formats.json b/adapters/metax/metaxtest/exemplary/app-formats.json new file mode 100644 index 00000000000..bfb0fdb7df3 --- /dev/null +++ b/adapters/metax/metaxtest/exemplary/app-formats.json @@ -0,0 +1,154 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ] + }, + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + }, + "native": { + "request": "{json string 1}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "body": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ], + "w": 728, + "h": 90 + }, + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + }, + "native": { + "request": "{json string 1}", + "ver": "1.2" + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ] + }, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "metax", + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.500000, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 728, + "h": 90, + "mtype": 1 + } + ] + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 728, + "h": 90, + "mtype": 1 + }, + "type": "banner" + } + ] + } + ] +} diff --git a/adapters/metax/metaxtest/exemplary/app-imps.json b/adapters/metax/metaxtest/exemplary/app-imps.json new file mode 100644 index 00000000000..1c30ba1e4cb --- /dev/null +++ b/adapters/metax/metaxtest/exemplary/app-imps.json @@ -0,0 +1,345 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "imp-1", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + }, + { + "id": "imp-2", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + }, + { + "id": "imp-3", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ] + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ] + }, + "body": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "imp-1", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "impIDs":["imp-1"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "cur": "USD", + "seatbid": [ + { + "seat": "metax", + "bid": [ + { + "id": "bid-1", + "impid": "imp-1", + "price": 0.500000, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 1024, + "h": 576, + "mtype": 2 + } + ] + } + ] + } + } + }, + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ] + }, + "body": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "imp-2", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "impIDs":["imp-2"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "cur": "USD", + "seatbid": [ + { + "seat": "metax", + "bid": [ + { + "id": "bid-2", + "impid": "imp-2", + "price": 0.500000, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 1024, + "h": 576, + "mtype": 2 + } + ] + } + ] + } + } + }, + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ] + }, + "body": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "imp-3", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ], + "w": 728, + "h": 90 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "impIDs":["imp-3"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "cur": "USD", + "seatbid": [ + { + "seat": "metax", + "bid": [ + { + "id": "bid-3", + "impid": "imp-3", + "price": 0.500000, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 728, + "h": 90, + "mtype": 1 + } + ] + } + ] + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "bid-1", + "impid": "imp-1", + "price": 0.5, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 1024, + "h": 576, + "mtype": 2 + }, + "type": "video" + } + ] + }, + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "bid-2", + "impid": "imp-2", + "price": 0.5, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 1024, + "h": 576, + "mtype": 2 + }, + "type": "video" + } + ] + }, + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "bid-3", + "impid": "imp-3", + "price": 0.5, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 728, + "h": 90, + "mtype": 1 + }, + "type": "banner" + } + ] + } + ] +} + + + diff --git a/adapters/metax/metaxtest/exemplary/no-bid.json b/adapters/metax/metaxtest/exemplary/no-bid.json index d721510b892..22b361aaac1 100644 --- a/adapters/metax/metaxtest/exemplary/no-bid.json +++ b/adapters/metax/metaxtest/exemplary/no-bid.json @@ -25,8 +25,8 @@ }, "ext": { "bidder": { - "publisherId": "10000000", - "adunit": "100000" + "publisherId": 10000000, + "adunit": 100000 } } } @@ -36,6 +36,14 @@ { "expectedRequest": { "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ] + }, "body": { "id": "test-request-id", "app": { @@ -59,6 +67,12 @@ ], "w": 1024, "h": 576 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } } } ] diff --git a/adapters/metax/metaxtest/exemplary/no-seat.json b/adapters/metax/metaxtest/exemplary/no-seat.json new file mode 100644 index 00000000000..df4db1882ec --- /dev/null +++ b/adapters/metax/metaxtest/exemplary/no-seat.json @@ -0,0 +1,94 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ] + }, + "body": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 204, + "body": { + "id": "test-request-id", + "seatbid": [] + } + } + } + ], + "expectedBidResponses": [] +} \ No newline at end of file diff --git a/adapters/metax/metaxtest/exemplary/simple-app-banner.json b/adapters/metax/metaxtest/exemplary/simple-app-banner.json index 9ed7431e453..89e4b43ffb1 100644 --- a/adapters/metax/metaxtest/exemplary/simple-app-banner.json +++ b/adapters/metax/metaxtest/exemplary/simple-app-banner.json @@ -20,8 +20,8 @@ }, "ext": { "bidder": { - "publisherId": "10000000", - "adunit": "100000" + "publisherId": 10000000, + "adunit": 100000 } } } @@ -31,6 +31,14 @@ { "expectedRequest": { "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ] + }, "body": { "id": "test-request-id", "app": { @@ -51,6 +59,12 @@ ], "w": 728, "h": 90 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } } } ] @@ -71,8 +85,9 @@ "price": 0.500000, "adm": "some-test-ad", "crid": "test-crid", + "w": 728, "h": 90, - "w": 728 + "mtype": 1 } ] } @@ -94,7 +109,8 @@ "adm": "some-test-ad", "crid": "test-crid", "w": 728, - "h": 90 + "h": 90, + "mtype": 1 }, "type": "banner" } diff --git a/adapters/metax/metaxtest/exemplary/simple-app-native.json b/adapters/metax/metaxtest/exemplary/simple-app-native.json new file mode 100644 index 00000000000..bf3b6793061 --- /dev/null +++ b/adapters/metax/metaxtest/exemplary/simple-app-native.json @@ -0,0 +1,99 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":2,\"contextsubtype\":20,\"plcmttype\":11,\"plcmtcnt\":1,\"aurlsupport\":1,\"durlsupport\":1,\"assets\":[{\"id\":123,\"required\":1,\"title\":{\"len\":140}},{\"id\":128,\"required\":0,\"img\":{\"wmin\":836,\"hmin\":627,\"type\":3}}]}" + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "httpCalls": [{ + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ] + }, + "body": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":2,\"contextsubtype\":20,\"plcmttype\":11,\"plcmtcnt\":1,\"aurlsupport\":1,\"durlsupport\":1,\"assets\":[{\"id\":123,\"required\":1,\"title\":{\"len\":140}},{\"id\":128,\"required\":0,\"img\":{\"wmin\":836,\"hmin\":627,\"type\":3}}]}" + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.500000, + "adm": "native-json", + "crid": "test-crid", + "mtype": 4 + } + ] + } + ] + } + } + }], + + "expectedBidResponses": [{ + "currency": "USD", + "bids": [{ + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.500000, + "adm": "native-json", + "crid": "test-crid", + "mtype": 4 + }, + "type": "native" + }] + }] +} diff --git a/adapters/metax/metaxtest/exemplary/simple-app-video.json b/adapters/metax/metaxtest/exemplary/simple-app-video.json index 8b96ffe8708..886895f0588 100644 --- a/adapters/metax/metaxtest/exemplary/simple-app-video.json +++ b/adapters/metax/metaxtest/exemplary/simple-app-video.json @@ -25,8 +25,8 @@ }, "ext": { "bidder": { - "publisherId": "10000000", - "adunit": "100000" + "publisherId": 10000000, + "adunit": 100000 } } } @@ -36,6 +36,14 @@ { "expectedRequest": { "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ] + }, "body": { "id": "test-request-id", "app": { @@ -59,6 +67,12 @@ ], "w": 1024, "h": 576 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } } } ] @@ -81,7 +95,8 @@ "adm": "some-test-ad", "crid": "test-crid", "w": 1024, - "h": 576 + "h": 576, + "mtype": 2 } ] } @@ -102,7 +117,8 @@ "adm": "some-test-ad", "crid": "test-crid", "w": 1024, - "h": 576 + "h": 576, + "mtype": 2 }, "type": "video" } diff --git a/adapters/metax/metaxtest/exemplary/simple-site-banner.json b/adapters/metax/metaxtest/exemplary/simple-site-banner.json index ec9ec75f956..37ca021a375 100644 --- a/adapters/metax/metaxtest/exemplary/simple-site-banner.json +++ b/adapters/metax/metaxtest/exemplary/simple-site-banner.json @@ -20,8 +20,8 @@ }, "ext": { "bidder": { - "publisherId": "10000000", - "adunit": "100000" + "publisherId": 10000000, + "adunit": 100000 } } } @@ -31,6 +31,14 @@ { "expectedRequest": { "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ] + }, "body": { "id": "test-request-id", "site": { @@ -51,6 +59,12 @@ ], "w": 728, "h": 90 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } } } ] @@ -71,8 +85,9 @@ "price": 0.500000, "adm": "some-test-ad", "crid": "test-crid", + "w": 728, "h": 90, - "w": 728 + "mtype": 1 } ] } @@ -94,7 +109,8 @@ "adm": "some-test-ad", "crid": "test-crid", "w": 728, - "h": 90 + "h": 90, + "mtype": 1 }, "type": "banner" } diff --git a/adapters/metax/metaxtest/exemplary/simple-site-native.json b/adapters/metax/metaxtest/exemplary/simple-site-native.json new file mode 100644 index 00000000000..4f9b49d087b --- /dev/null +++ b/adapters/metax/metaxtest/exemplary/simple-site-native.json @@ -0,0 +1,99 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":2,\"contextsubtype\":20,\"plcmttype\":11,\"plcmtcnt\":1,\"aurlsupport\":1,\"durlsupport\":1,\"assets\":[{\"id\":123,\"required\":1,\"title\":{\"len\":140}},{\"id\":128,\"required\":0,\"img\":{\"wmin\":836,\"hmin\":627,\"type\":3}}]}" + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "httpCalls": [{ + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ] + }, + "body": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "device": { + "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "native": { + "request": "{\"ver\":\"1.2\",\"context\":2,\"contextsubtype\":20,\"plcmttype\":11,\"plcmtcnt\":1,\"aurlsupport\":1,\"durlsupport\":1,\"assets\":[{\"id\":123,\"required\":1,\"title\":{\"len\":140}},{\"id\":128,\"required\":0,\"img\":{\"wmin\":836,\"hmin\":627,\"type\":3}}]}" + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.500000, + "adm": "native-json", + "crid": "test-crid", + "mtype": 4 + } + ] + } + ] + } + } + }], + + "expectedBidResponses": [{ + "currency": "USD", + "bids": [{ + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.500000, + "adm": "native-json", + "crid": "test-crid", + "mtype": 4 + }, + "type": "native" + }] + }] +} diff --git a/adapters/metax/metaxtest/exemplary/simple-site-video.json b/adapters/metax/metaxtest/exemplary/simple-site-video.json index 2cf197a651a..535c0eefce5 100644 --- a/adapters/metax/metaxtest/exemplary/simple-site-video.json +++ b/adapters/metax/metaxtest/exemplary/simple-site-video.json @@ -25,8 +25,8 @@ }, "ext": { "bidder": { - "publisherId": "10000000", - "adunit": "100000" + "publisherId": 10000000, + "adunit": 100000 } } } @@ -36,6 +36,14 @@ { "expectedRequest": { "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ] + }, "body": { "id": "test-request-id", "site": { @@ -59,6 +67,12 @@ ], "w": 1024, "h": 576 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } } } ] @@ -81,7 +95,8 @@ "adm": "some-test-ad", "crid": "test-crid", "w": 1024, - "h": 576 + "h": 576, + "mtype": 2 } ] } @@ -102,7 +117,8 @@ "adm": "some-test-ad", "crid": "test-crid", "w": 1024, - "h": 576 + "h": 576, + "mtype": 2 }, "type": "video" } diff --git a/adapters/metax/metaxtest/supplemental/invalid-adunit-error.json b/adapters/metax/metaxtest/supplemental/invalid-adunit-error.json index 5ea20b6f7c0..35ce462a422 100644 --- a/adapters/metax/metaxtest/supplemental/invalid-adunit-error.json +++ b/adapters/metax/metaxtest/supplemental/invalid-adunit-error.json @@ -3,13 +3,17 @@ "id": "test-request-id", "imp": [ { - "format": [{ - "w": 728, - "h": 90 - }], + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ] + }, "ext": { "bidder": { - "publisherId": "10000000", + "publisherId": 10000000, "adunit": "abc" } } @@ -24,7 +28,7 @@ }, "expectedMakeRequestsErrors": [ { - "value": "invalid adunit", + "value": "Wrong MetaX bidder ext", "comparison": "literal" } ] diff --git a/adapters/metax/metaxtest/supplemental/invalid-ext-bidder.json b/adapters/metax/metaxtest/supplemental/invalid-ext-bidder.json index 003d11cdc54..7016e7dc08e 100644 --- a/adapters/metax/metaxtest/supplemental/invalid-ext-bidder.json +++ b/adapters/metax/metaxtest/supplemental/invalid-ext-bidder.json @@ -3,10 +3,14 @@ "id": "test-request-id", "imp": [ { - "format": [{ - "w": 728, - "h": 90 - }], + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ] + }, "ext": { "bidder": "bad string" } diff --git a/adapters/metax/metaxtest/supplemental/invalid-ext.json b/adapters/metax/metaxtest/supplemental/invalid-ext.json index aaf4611a870..54d6d9f2c05 100644 --- a/adapters/metax/metaxtest/supplemental/invalid-ext.json +++ b/adapters/metax/metaxtest/supplemental/invalid-ext.json @@ -3,10 +3,14 @@ "id": "test-request-id", "imp": [ { - "format": [{ - "w": 728, - "h": 90 - }], + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ] + }, "ext": "" } ], diff --git a/adapters/metax/metaxtest/supplemental/invalid-publisher-error.json b/adapters/metax/metaxtest/supplemental/invalid-publisher-error.json index 2dd8704f0ce..2a16200f1c1 100644 --- a/adapters/metax/metaxtest/supplemental/invalid-publisher-error.json +++ b/adapters/metax/metaxtest/supplemental/invalid-publisher-error.json @@ -3,14 +3,18 @@ "id": "test-request-id", "imp": [ { - "format": [{ - "w": 728, - "h": 90 - }], + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ] + }, "ext": { "bidder": { "publisherId": "abc", - "adunit": "100000" + "adunit": 100000 } } } @@ -24,7 +28,7 @@ }, "expectedMakeRequestsErrors": [ { - "value": "invalid publisher ID", + "value": "Wrong MetaX bidder ext", "comparison": "literal" } ] diff --git a/adapters/metax/metaxtest/supplemental/resp-bad-json.json b/adapters/metax/metaxtest/supplemental/resp-bad-json.json index 9933750ad6e..2e25c64eb6a 100644 --- a/adapters/metax/metaxtest/supplemental/resp-bad-json.json +++ b/adapters/metax/metaxtest/supplemental/resp-bad-json.json @@ -20,8 +20,8 @@ }, "ext": { "bidder": { - "publisherId": "10000000", - "adunit": "100000" + "publisherId": 10000000, + "adunit": 100000 } } } @@ -51,6 +51,12 @@ ], "w": 728, "h": 90 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } } } ] diff --git a/adapters/metax/metaxtest/supplemental/resp-bad-markuptype.json b/adapters/metax/metaxtest/supplemental/resp-bad-markuptype.json new file mode 100644 index 00000000000..dae139bd452 --- /dev/null +++ b/adapters/metax/metaxtest/supplemental/resp-bad-markuptype.json @@ -0,0 +1,100 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ] + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "body": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ], + "w": 728, + "h": 90 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "metax", + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.500000, + "adm": "some-test-ad", + "crid": "test-crid", + "w": 728, + "h": 90, + "mtype": 0 + } + ] + } + ], + "cur": "USD" + } + } + } + ], + "expectedMakeBidsErrors": [ + { + "value": "Unsupported MType 0", + "comparison": "literal" + } + ] +} \ No newline at end of file diff --git a/adapters/metax/metaxtest/supplemental/status-400.json b/adapters/metax/metaxtest/supplemental/status-400.json index 654e034ec27..08a8b1efcb4 100644 --- a/adapters/metax/metaxtest/supplemental/status-400.json +++ b/adapters/metax/metaxtest/supplemental/status-400.json @@ -20,8 +20,8 @@ }, "ext": { "bidder": { - "publisherId": "10000000", - "adunit": "100000" + "publisherId": 10000000, + "adunit": 100000 } } } @@ -51,6 +51,12 @@ ], "w": 728, "h": 90 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } } } ] @@ -66,7 +72,7 @@ ], "expectedMakeBidsErrors": [ { - "value": "Unexpected status code: 400. Bad request", + "value": "Unexpected status code: 400. Run with request.debug = 1 for more info", "comparison": "literal" } ] diff --git a/adapters/metax/metaxtest/supplemental/status-unknown.json b/adapters/metax/metaxtest/supplemental/status-500.json similarity index 75% rename from adapters/metax/metaxtest/supplemental/status-unknown.json rename to adapters/metax/metaxtest/supplemental/status-500.json index ac9ecc51d68..79841569eb4 100644 --- a/adapters/metax/metaxtest/supplemental/status-unknown.json +++ b/adapters/metax/metaxtest/supplemental/status-500.json @@ -20,8 +20,8 @@ }, "ext": { "bidder": { - "publisherId": "10000000", - "adunit": "100000" + "publisherId": 10000000, + "adunit": 100000 } } } @@ -51,23 +51,30 @@ ], "w": 728, "h": 90 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } } } ] }, - "impIDs":["test-imp-id"] + "impIDs": [ + "test-imp-id" + ] }, "mockResponse": { "status": 500, - "body": { - } + "body": "Internal Server Error" } } ], "expectedMakeBidsErrors": [ { - "value": "Unexpected status code: 500", + "value": "Unexpected status code: 500. Run with request.debug = 1 for more info", "comparison": "literal" } ] -} +} \ No newline at end of file diff --git a/adapters/metax/metaxtest/supplemental/status-503.json b/adapters/metax/metaxtest/supplemental/status-503.json new file mode 100644 index 00000000000..3c8220ee598 --- /dev/null +++ b/adapters/metax/metaxtest/supplemental/status-503.json @@ -0,0 +1,80 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ] + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "body": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 728, + "h": 90 + } + ], + "w": 728, + "h": 90 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 503, + "body": "" + } + } + ], + "expectedMakeBidsErrors": [ + { + "value": "Unexpected status code: 503. Run with request.debug = 1 for more info", + "comparison": "literal" + } + ] +} \ No newline at end of file diff --git a/adapters/metax/metaxtest/supplemental/zero-impression.json b/adapters/metax/metaxtest/supplemental/zero-impression.json deleted file mode 100644 index a0725bb0c4e..00000000000 --- a/adapters/metax/metaxtest/supplemental/zero-impression.json +++ /dev/null @@ -1,19 +0,0 @@ -{ - "mockBidRequest": { - "id": "test-request-id", - "imp": [ - ], - "app": { - "bundle": "com.prebid" - }, - "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" - } - }, - "expectedMakeRequestsErrors": [ - { - "value": "No impressions in the request", - "comparison": "literal" - } - ] -} diff --git a/adapters/metax/params_test.go b/adapters/metax/params_test.go index 066bc37306c..5ffb45308e1 100644 --- a/adapters/metax/params_test.go +++ b/adapters/metax/params_test.go @@ -40,7 +40,7 @@ func TestInvalidParams(t *testing.T) { } var validParams = []string{ - `{"publisherId": "10000000", "adunit": "100000"}`, + `{"publisherId": 10000000, "adunit": 100000}`, } var invalidParams = []string{ @@ -49,7 +49,12 @@ var invalidParams = []string{ `undefined`, `0`, `{}`, + `[]`, + `{"publisherId": ""}`, + `{"adunit": ""}`, `{"publisherId": "", "adunit": ""}`, - `{"publisherId": "10000000", "adunit": ""}`, - `{"publisherId": "", "adunit": "100000"}`, + `{"publisherId": "10000000", "adunit": "100000"}`, + `{"publisherId": 0, "adunit": 0}`, + `{"publisherId": 10000000, "adunit": 0}`, + `{"publisherId": 0, "adunit": 100000}`, } diff --git a/openrtb_ext/imp_metax.go b/openrtb_ext/imp_metax.go index 8d518501203..ab54505fbf3 100644 --- a/openrtb_ext/imp_metax.go +++ b/openrtb_ext/imp_metax.go @@ -2,6 +2,6 @@ package openrtb_ext // ExtImpMetaX defines the contract for bidrequest.imp[i].ext.prebid.bidder.metax type ExtImpMetaX struct { - PublisherID string `json:"publisherId"` - Adunit string `json:"adunit"` + PublisherID int `json:"publisherId"` + Adunit int `json:"adunit"` } diff --git a/static/bidder-info/metax.yaml b/static/bidder-info/metax.yaml index 3b902461a93..3feef067ad0 100644 --- a/static/bidder-info/metax.yaml +++ b/static/bidder-info/metax.yaml @@ -7,7 +7,11 @@ capabilities: mediaTypes: - banner - video + - native + - audio site: mediaTypes: - banner - video + - native + - audio diff --git a/static/bidder-params/metax.json b/static/bidder-params/metax.json index ee64f632dec..3c336c2be3e 100644 --- a/static/bidder-params/metax.json +++ b/static/bidder-params/metax.json @@ -5,14 +5,14 @@ "type": "object", "properties": { "publisherId": { - "type": "string", + "type": "integer", "description": "An ID which identifies the publisher", - "minLength": 1 + "minimum": 1 }, "adunit": { - "type": "string", + "type": "integer", "description": "An ID which identifies the adunit", - "minLength": 1 + "minimum": 1 } }, "required": ["publisherId", "adunit"] From db21fa679d061dfbb66bc11d2bd07cf9d0dffc97 Mon Sep 17 00:00:00 2001 From: Kehan Pan Date: Wed, 19 Jun 2024 11:07:32 +0000 Subject: [PATCH 05/10] MetaX: adds test cases Signed-off-by: Kehan Pan --- adapters/metax/metax_test.go | 114 ++++++++++++++++-- .../metaxtest/exemplary/app-formats.json | 8 +- .../metax/metaxtest/exemplary/app-imps.json | 20 +-- .../metax/metaxtest/exemplary/no-bid.json | 8 +- .../metaxtest/exemplary/no-seat-bid.json | 99 +++++++++++++++ .../metax/metaxtest/exemplary/no-seat.json | 2 +- .../metaxtest/exemplary/simple-app-audio.json | 110 +++++++++++++++++ .../exemplary/simple-app-banner.json | 8 +- .../exemplary/simple-app-native.json | 4 +- .../metaxtest/exemplary/simple-app-video.json | 8 +- .../exemplary/simple-site-audio.json | 110 +++++++++++++++++ .../exemplary/simple-site-banner.json | 4 +- .../exemplary/simple-site-native.json | 8 +- .../exemplary/simple-site-video.json | 4 +- .../metaxtest/supplemental/resp-bad-json.json | 4 +- .../metaxtest/supplemental/status-400.json | 7 +- 16 files changed, 476 insertions(+), 42 deletions(-) create mode 100644 adapters/metax/metaxtest/exemplary/no-seat-bid.json create mode 100644 adapters/metax/metaxtest/exemplary/simple-app-audio.json create mode 100644 adapters/metax/metaxtest/exemplary/simple-site-audio.json diff --git a/adapters/metax/metax_test.go b/adapters/metax/metax_test.go index f9c551958d5..0a14ce6fa49 100644 --- a/adapters/metax/metax_test.go +++ b/adapters/metax/metax_test.go @@ -5,6 +5,7 @@ import ( "testing" "github.com/prebid/openrtb/v20/openrtb2" + "github.com/prebid/prebid-server/v2/adapters" "github.com/prebid/prebid-server/v2/adapters/adapterstest" "github.com/prebid/prebid-server/v2/config" "github.com/prebid/prebid-server/v2/openrtb_ext" @@ -51,6 +52,26 @@ func TestParseBidderExt(t *testing.T) { func TestPreprocessImp(t *testing.T) { assert.NotNil(t, preprocessImp(nil)) + + imp1 := &openrtb2.Imp{ + Banner: &openrtb2.Banner{ + Format: []openrtb2.Format{ + {W: 300, H: 250}, + {W: 728, H: 90}, + }, + }, + } + err1 := preprocessImp(imp1) + assert.Nil(t, err1) + + imp2 := &openrtb2.Imp{ + Video: &openrtb2.Video{ + W: ptrutil.ToPtr(int64(1920)), + H: ptrutil.ToPtr(int64(1920)), + }, + } + err2 := preprocessImp(imp2) + assert.Nil(t, err2) } func TestAssignBannerSize(t *testing.T) { @@ -71,24 +92,44 @@ func TestAssignBannerSize(t *testing.T) { {W: 300, H: 250}, {W: 728, H: 90}, }, - W: ptrutil.ToPtr(int64(1080)), - H: ptrutil.ToPtr(int64(720)), + W: ptrutil.ToPtr(int64(336)), + H: ptrutil.ToPtr(int64(280)), } b2n, err := assignBannerSize(b2) - assert.Equal(t, b2n.W, ptrutil.ToPtr(int64(1080))) - assert.Equal(t, b2n.H, ptrutil.ToPtr(int64(720))) + assert.Equal(t, b2n.W, ptrutil.ToPtr(int64(336))) + assert.Equal(t, b2n.H, ptrutil.ToPtr(int64(280))) assert.Nil(t, err) assert.Same(t, b2, b2n) b3 := &openrtb2.Banner{ - W: ptrutil.ToPtr(int64(1080)), - H: ptrutil.ToPtr(int64(720)), + W: ptrutil.ToPtr(int64(336)), + H: ptrutil.ToPtr(int64(280)), } b3n, err := assignBannerSize(b3) - assert.Equal(t, b3n.W, ptrutil.ToPtr(int64(1080))) - assert.Equal(t, b3n.H, ptrutil.ToPtr(int64(720))) + assert.Equal(t, b3n.W, ptrutil.ToPtr(int64(336))) + assert.Equal(t, b3n.H, ptrutil.ToPtr(int64(280))) assert.Nil(t, err) assert.Same(t, b3, b3n) + + b4 := &openrtb2.Banner{ + Format: []openrtb2.Format{ + {W: 300, H: 250}, + {W: 728, H: 90}, + }, + W: ptrutil.ToPtr(int64(336)), + } + b4n, err := assignBannerSize(b4) + assert.Equal(t, b4n.W, ptrutil.ToPtr(int64(300))) + assert.Equal(t, b4n.H, ptrutil.ToPtr(int64(250))) + assert.Nil(t, err) + assert.NotSame(t, b4, b4n) + + b5 := &openrtb2.Banner{} + b5n, err := assignBannerSize(b5) + assert.Nil(t, b5n.W) + assert.Nil(t, b5n.H) + assert.Nil(t, err) + assert.Same(t, b5, b5n) } func TestGetBidType(t *testing.T) { @@ -116,10 +157,63 @@ func TestBuilder(t *testing.T) { serverCfg := config.Server{} cfg1 := config.Adapter{Endpoint: "https://hb.metaxads.com/prebid"} - _, err1 := Builder("test", cfg1, serverCfg) + builder1, err1 := Builder("test", cfg1, serverCfg) + assert.NotNil(t, builder1) assert.Nil(t, err1) + // empty endpoint cfg2 := config.Adapter{Endpoint: ""} - _, err2 := Builder("test2", cfg2, serverCfg) + builder2, err2 := Builder("test2", cfg2, serverCfg) + assert.Nil(t, builder2) assert.NotNil(t, err2) + + // invalid endpoint + cfg3 := config.Adapter{Endpoint: "https://hb.metaxads.com/prebid?a={{}}"} + builder3, err3 := Builder("test3", cfg3, serverCfg) + assert.Nil(t, builder3) + assert.NotNil(t, err3) +} + +func TestMakeRequests(t *testing.T) { + builder1, _ := Builder("metax", config.Adapter{Endpoint: "https://hb.metaxads.com/prebid?sid={{.PublisherId}}"}, config.Server{}) + reqDatas1, err1 := builder1.MakeRequests(&openrtb2.BidRequest{ + Imp: []openrtb2.Imp{ + { + Ext: []byte(` + { + "bidder": { + "publisherId": 100, + "adunit": 2 + } + } + `), + }, + }, + Ext: []byte(`{invalid json}`), + }, &adapters.ExtraRequestInfo{}) + assert.Equal(t, 0, len(reqDatas1)) + assert.Equal(t, 1, len(err1)) + + builder2, _ := Builder( + "metax", + config.Adapter{Endpoint: "https://hb.metaxads.com/prebid?sid={{.PublisherID}}&adunit={{.AdUnit}}&source=prebid-server"}, + config.Server{}, + ) + reqDatas2, err2 := builder2.MakeRequests(&openrtb2.BidRequest{ + Imp: []openrtb2.Imp{ + { + Ext: []byte(` + { + "bidder": { + "publisherId": 100, + "adunit": 2 + } + } + `), + }, + }, + Ext: []byte(`{invalid json}`), + }, &adapters.ExtraRequestInfo{}) + assert.Equal(t, 0, len(reqDatas2)) + assert.Equal(t, 1, len(err2)) } diff --git a/adapters/metax/metaxtest/exemplary/app-formats.json b/adapters/metax/metaxtest/exemplary/app-formats.json index bfb0fdb7df3..013436f20bb 100644 --- a/adapters/metax/metaxtest/exemplary/app-formats.json +++ b/adapters/metax/metaxtest/exemplary/app-formats.json @@ -5,7 +5,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { @@ -54,7 +54,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { @@ -95,7 +95,9 @@ } ] }, - "impIDs":["test-imp-id"] + "impIDs": [ + "test-imp-id" + ] }, "mockResponse": { "status": 200, diff --git a/adapters/metax/metaxtest/exemplary/app-imps.json b/adapters/metax/metaxtest/exemplary/app-imps.json index 1c30ba1e4cb..cc77a34baaf 100644 --- a/adapters/metax/metaxtest/exemplary/app-imps.json +++ b/adapters/metax/metaxtest/exemplary/app-imps.json @@ -5,7 +5,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { @@ -89,7 +89,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { @@ -116,7 +116,9 @@ } ] }, - "impIDs":["imp-1"] + "impIDs": [ + "imp-1" + ] }, "mockResponse": { "status": 200, @@ -160,7 +162,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { @@ -187,7 +189,9 @@ } ] }, - "impIDs":["imp-2"] + "impIDs": [ + "imp-2" + ] }, "mockResponse": { "status": 200, @@ -231,7 +235,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { @@ -255,7 +259,9 @@ } ] }, - "impIDs":["imp-3"] + "impIDs": [ + "imp-3" + ] }, "mockResponse": { "status": 200, diff --git a/adapters/metax/metaxtest/exemplary/no-bid.json b/adapters/metax/metaxtest/exemplary/no-bid.json index 22b361aaac1..3eb1b79a2eb 100644 --- a/adapters/metax/metaxtest/exemplary/no-bid.json +++ b/adapters/metax/metaxtest/exemplary/no-bid.json @@ -5,7 +5,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { @@ -50,7 +50,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { @@ -77,7 +77,9 @@ } ] }, - "impIDs":["test-imp-id"] + "impIDs": [ + "test-imp-id" + ] }, "mockResponse": { "status": 204, diff --git a/adapters/metax/metaxtest/exemplary/no-seat-bid.json b/adapters/metax/metaxtest/exemplary/no-seat-bid.json new file mode 100644 index 00000000000..fe166b1b634 --- /dev/null +++ b/adapters/metax/metaxtest/exemplary/no-seat-bid.json @@ -0,0 +1,99 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "headers": { + "Accept": [ + "application/json" + ], + "Content-Type": [ + "application/json;charset=utf-8" + ] + }, + "body": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 3, + 5, + 6 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "metax", + "bid": [] + } + ] + } + } + } + ], + "expectedBidResponses": [] +} \ No newline at end of file diff --git a/adapters/metax/metaxtest/exemplary/no-seat.json b/adapters/metax/metaxtest/exemplary/no-seat.json index df4db1882ec..ea83df7f83a 100644 --- a/adapters/metax/metaxtest/exemplary/no-seat.json +++ b/adapters/metax/metaxtest/exemplary/no-seat.json @@ -82,7 +82,7 @@ ] }, "mockResponse": { - "status": 204, + "status": 200, "body": { "id": "test-request-id", "seatbid": [] diff --git a/adapters/metax/metaxtest/exemplary/simple-app-audio.json b/adapters/metax/metaxtest/exemplary/simple-app-audio.json new file mode 100644 index 00000000000..5bd6a102fb7 --- /dev/null +++ b/adapters/metax/metaxtest/exemplary/simple-app-audio.json @@ -0,0 +1,110 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "audio": { + "mimes": [ + "audio/mp4" + ], + "protocols": [ + 9, + 10 + ] + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "body": { + "id": "test-request-id", + "app": { + "bundle": "com.prebid" + }, + "device": { + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" + }, + "imp": [ + { + "id": "test-imp-id", + "audio": { + "mimes": [ + "audio/mp4" + ], + "protocols": [ + 9, + 10 + ] + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "metax", + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.500000, + "adm": "some-test-ad", + "crid": "test-crid", + "mtype": 3 + } + ] + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-test-ad", + "crid": "test-crid", + "mtype": 3 + }, + "type": "audio" + } + ] + } + ] +} \ No newline at end of file diff --git a/adapters/metax/metaxtest/exemplary/simple-app-banner.json b/adapters/metax/metaxtest/exemplary/simple-app-banner.json index 89e4b43ffb1..329e00a2f59 100644 --- a/adapters/metax/metaxtest/exemplary/simple-app-banner.json +++ b/adapters/metax/metaxtest/exemplary/simple-app-banner.json @@ -5,7 +5,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { @@ -45,7 +45,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { @@ -69,7 +69,9 @@ } ] }, - "impIDs":["test-imp-id"] + "impIDs": [ + "test-imp-id" + ] }, "mockResponse": { "status": 200, diff --git a/adapters/metax/metaxtest/exemplary/simple-app-native.json b/adapters/metax/metaxtest/exemplary/simple-app-native.json index bf3b6793061..52b4305ad70 100644 --- a/adapters/metax/metaxtest/exemplary/simple-app-native.json +++ b/adapters/metax/metaxtest/exemplary/simple-app-native.json @@ -5,7 +5,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { @@ -39,7 +39,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { diff --git a/adapters/metax/metaxtest/exemplary/simple-app-video.json b/adapters/metax/metaxtest/exemplary/simple-app-video.json index 886895f0588..4f4272ee3db 100644 --- a/adapters/metax/metaxtest/exemplary/simple-app-video.json +++ b/adapters/metax/metaxtest/exemplary/simple-app-video.json @@ -5,7 +5,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { @@ -50,7 +50,7 @@ "bundle": "com.prebid" }, "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "ifa": "ec943cb9-61ec-460f-a925-6489c3fcc4e3" }, "imp": [ { @@ -77,7 +77,9 @@ } ] }, - "impIDs":["test-imp-id"] + "impIDs": [ + "test-imp-id" + ] }, "mockResponse": { "status": 200, diff --git a/adapters/metax/metaxtest/exemplary/simple-site-audio.json b/adapters/metax/metaxtest/exemplary/simple-site-audio.json new file mode 100644 index 00000000000..ebc240ec9f4 --- /dev/null +++ b/adapters/metax/metaxtest/exemplary/simple-site-audio.json @@ -0,0 +1,110 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "audio": { + "mimes": [ + "audio/mp4" + ], + "protocols": [ + 9, + 10 + ] + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://hb.metaxads.com/prebid?sid=10000000&adunit=100000&source=prebid-server", + "body": { + "id": "test-request-id", + "site": { + "page": "prebid.org" + }, + "user": { + "buyeruid": "be5e209ad46927520000000000000000" + }, + "imp": [ + { + "id": "test-imp-id", + "audio": { + "mimes": [ + "audio/mp4" + ], + "protocols": [ + 9, + 10 + ] + }, + "ext": { + "bidder": { + "publisherId": 10000000, + "adunit": 100000 + } + } + } + ] + }, + "impIDs": [ + "test-imp-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "seat": "metax", + "bid": [ + { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.500000, + "adm": "some-test-ad", + "crid": "test-crid", + "mtype": 3 + } + ] + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "8ee514f1-b2b8-4abb-89fd-084437d1e800", + "impid": "test-imp-id", + "price": 0.5, + "adm": "some-test-ad", + "crid": "test-crid", + "mtype": 3 + }, + "type": "audio" + } + ] + } + ] +} \ No newline at end of file diff --git a/adapters/metax/metaxtest/exemplary/simple-site-banner.json b/adapters/metax/metaxtest/exemplary/simple-site-banner.json index 37ca021a375..cc631fac8a7 100644 --- a/adapters/metax/metaxtest/exemplary/simple-site-banner.json +++ b/adapters/metax/metaxtest/exemplary/simple-site-banner.json @@ -69,7 +69,9 @@ } ] }, - "impIDs":["test-imp-id"] + "impIDs": [ + "test-imp-id" + ] }, "mockResponse": { "status": 200, diff --git a/adapters/metax/metaxtest/exemplary/simple-site-native.json b/adapters/metax/metaxtest/exemplary/simple-site-native.json index 4f9b49d087b..5955b1b86af 100644 --- a/adapters/metax/metaxtest/exemplary/simple-site-native.json +++ b/adapters/metax/metaxtest/exemplary/simple-site-native.json @@ -4,8 +4,8 @@ "site": { "page": "prebid.org" }, - "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "user": { + "buyeruid": "be5e209ad46927520000000000000000" }, "imp": [ { @@ -38,8 +38,8 @@ "site": { "page": "prebid.org" }, - "device": { - "ifa":"ec943cb9-61ec-460f-a925-6489c3fcc4e3" + "user": { + "buyeruid": "be5e209ad46927520000000000000000" }, "imp": [ { diff --git a/adapters/metax/metaxtest/exemplary/simple-site-video.json b/adapters/metax/metaxtest/exemplary/simple-site-video.json index 535c0eefce5..d6084603a0e 100644 --- a/adapters/metax/metaxtest/exemplary/simple-site-video.json +++ b/adapters/metax/metaxtest/exemplary/simple-site-video.json @@ -77,7 +77,9 @@ } ] }, - "impIDs":["test-imp-id"] + "impIDs": [ + "test-imp-id" + ] }, "mockResponse": { "status": 200, diff --git a/adapters/metax/metaxtest/supplemental/resp-bad-json.json b/adapters/metax/metaxtest/supplemental/resp-bad-json.json index 2e25c64eb6a..cc51b14e050 100644 --- a/adapters/metax/metaxtest/supplemental/resp-bad-json.json +++ b/adapters/metax/metaxtest/supplemental/resp-bad-json.json @@ -61,7 +61,9 @@ } ] }, - "impIDs":["test-imp-id"] + "impIDs": [ + "test-imp-id" + ] }, "mockResponse": { "status": 200, diff --git a/adapters/metax/metaxtest/supplemental/status-400.json b/adapters/metax/metaxtest/supplemental/status-400.json index 08a8b1efcb4..63a86a5388b 100644 --- a/adapters/metax/metaxtest/supplemental/status-400.json +++ b/adapters/metax/metaxtest/supplemental/status-400.json @@ -61,12 +61,13 @@ } ] }, - "impIDs":["test-imp-id"] + "impIDs": [ + "test-imp-id" + ] }, "mockResponse": { "status": 400, - "body": { - } + "body": "invalid params" } } ], From b4ec7b5bcf451ebe16461d79f3504ed27b75b4e0 Mon Sep 17 00:00:00 2001 From: Kehan Pan Date: Thu, 4 Jul 2024 03:40:23 +0000 Subject: [PATCH 06/10] MetaX: add comment and refine always nil issue Signed-off-by: Kehan Pan --- adapters/metax/metax.go | 14 +++++--------- adapters/metax/metax_test.go | 15 +++++---------- static/bidder-info/metax.yaml | 1 + 3 files changed, 11 insertions(+), 19 deletions(-) diff --git a/adapters/metax/metax.go b/adapters/metax/metax.go index ea776cd4921..112e678e1b7 100644 --- a/adapters/metax/metax.go +++ b/adapters/metax/metax.go @@ -136,26 +136,22 @@ func preprocessImp(imp *openrtb2.Imp) error { } if imp.Banner != nil { - bannerCopy, err := assignBannerSize(imp.Banner) - if err != nil { - return err - } - imp.Banner = bannerCopy + imp.Banner = assignBannerSize(imp.Banner) } return nil } -func assignBannerSize(banner *openrtb2.Banner) (*openrtb2.Banner, error) { +func assignBannerSize(banner *openrtb2.Banner) *openrtb2.Banner { if banner.W != nil && banner.H != nil { - return banner, nil + return banner } if len(banner.Format) == 0 { - return banner, nil + return banner } - return assignBannerWidthAndHeight(banner, banner.Format[0].W, banner.Format[0].H), nil + return assignBannerWidthAndHeight(banner, banner.Format[0].W, banner.Format[0].H) } func assignBannerWidthAndHeight(banner *openrtb2.Banner, w, h int64) *openrtb2.Banner { diff --git a/adapters/metax/metax_test.go b/adapters/metax/metax_test.go index 0a14ce6fa49..765f3004c81 100644 --- a/adapters/metax/metax_test.go +++ b/adapters/metax/metax_test.go @@ -81,10 +81,9 @@ func TestAssignBannerSize(t *testing.T) { {W: 728, H: 90}, }, } - b1n, err := assignBannerSize(b1) + b1n := assignBannerSize(b1) assert.Equal(t, b1n.W, ptrutil.ToPtr(int64(300))) assert.Equal(t, b1n.H, ptrutil.ToPtr(int64(250))) - assert.Nil(t, err) assert.NotSame(t, b1, b1n) b2 := &openrtb2.Banner{ @@ -95,20 +94,18 @@ func TestAssignBannerSize(t *testing.T) { W: ptrutil.ToPtr(int64(336)), H: ptrutil.ToPtr(int64(280)), } - b2n, err := assignBannerSize(b2) + b2n := assignBannerSize(b2) assert.Equal(t, b2n.W, ptrutil.ToPtr(int64(336))) assert.Equal(t, b2n.H, ptrutil.ToPtr(int64(280))) - assert.Nil(t, err) assert.Same(t, b2, b2n) b3 := &openrtb2.Banner{ W: ptrutil.ToPtr(int64(336)), H: ptrutil.ToPtr(int64(280)), } - b3n, err := assignBannerSize(b3) + b3n := assignBannerSize(b3) assert.Equal(t, b3n.W, ptrutil.ToPtr(int64(336))) assert.Equal(t, b3n.H, ptrutil.ToPtr(int64(280))) - assert.Nil(t, err) assert.Same(t, b3, b3n) b4 := &openrtb2.Banner{ @@ -118,17 +115,15 @@ func TestAssignBannerSize(t *testing.T) { }, W: ptrutil.ToPtr(int64(336)), } - b4n, err := assignBannerSize(b4) + b4n := assignBannerSize(b4) assert.Equal(t, b4n.W, ptrutil.ToPtr(int64(300))) assert.Equal(t, b4n.H, ptrutil.ToPtr(int64(250))) - assert.Nil(t, err) assert.NotSame(t, b4, b4n) b5 := &openrtb2.Banner{} - b5n, err := assignBannerSize(b5) + b5n := assignBannerSize(b5) assert.Nil(t, b5n.W) assert.Nil(t, b5n.H) - assert.Nil(t, err) assert.Same(t, b5, b5n) } diff --git a/static/bidder-info/metax.yaml b/static/bidder-info/metax.yaml index 3feef067ad0..d9867322d01 100644 --- a/static/bidder-info/metax.yaml +++ b/static/bidder-info/metax.yaml @@ -1,3 +1,4 @@ +# The MetaX Bidding adapter requires setup before beginning. Please contact us at endpoint: "https://hb.metaxads.com/prebid?sid={{.PublisherID}}&adunit={{.AdUnit}}&source=prebid-server" maintainer: email: "prebid@metaxsoft.com" From 6d5b2dcab0d6b7ca5e245a99ef656cb3a201dc46 Mon Sep 17 00:00:00 2001 From: Kehan Pan Date: Mon, 29 Jul 2024 03:02:03 +0000 Subject: [PATCH 07/10] MetaX: adds bidresponse currency Signed-off-by: Kehan Pan --- adapters/metax/metax.go | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/adapters/metax/metax.go b/adapters/metax/metax.go index 112e678e1b7..9cad11126d7 100644 --- a/adapters/metax/metax.go +++ b/adapters/metax/metax.go @@ -86,12 +86,10 @@ func (a *adapter) MakeBids(bidReq *openrtb2.BidRequest, reqData *adapters.Reques return nil, []error{err} } - // additional no content check - if len(bidResp.SeatBid) == 0 || len(bidResp.SeatBid[0].Bid) == 0 { - return nil, nil - } - resp := adapters.NewBidderResponseWithBidsCapacity(len(bidResp.SeatBid[0].Bid)) + if len(bidResp.Cur) != 0 { + resp.Currency = bidResp.Cur + } for _, sb := range bidResp.SeatBid { for i := range sb.Bid { bid := &sb.Bid[i] From f250cf1bda541e0479e3c0b6c927a40fe4144a3f Mon Sep 17 00:00:00 2001 From: Kehan Pan Date: Mon, 29 Jul 2024 03:11:35 +0000 Subject: [PATCH 08/10] MetaX: fixed response no bids checking Signed-off-by: Kehan Pan --- adapters/metax/metax.go | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/adapters/metax/metax.go b/adapters/metax/metax.go index 9cad11126d7..4c59fb59bb6 100644 --- a/adapters/metax/metax.go +++ b/adapters/metax/metax.go @@ -86,6 +86,11 @@ func (a *adapter) MakeBids(bidReq *openrtb2.BidRequest, reqData *adapters.Reques return nil, []error{err} } + // additional no content check + if len(bidResp.SeatBid) == 0 || len(bidResp.SeatBid[0].Bid) == 0 { + return nil, nil + } + resp := adapters.NewBidderResponseWithBidsCapacity(len(bidResp.SeatBid[0].Bid)) if len(bidResp.Cur) != 0 { resp.Currency = bidResp.Cur From 895c22e019d7d344ee5f23dfd4d187c81335c54f Mon Sep 17 00:00:00 2001 From: Kehan Pan Date: Mon, 29 Jul 2024 05:50:08 +0000 Subject: [PATCH 09/10] MetaX: adjusts impression looping Signed-off-by: Kehan Pan --- adapters/metax/metax.go | 13 +++++-------- 1 file changed, 5 insertions(+), 8 deletions(-) diff --git a/adapters/metax/metax.go b/adapters/metax/metax.go index 4c59fb59bb6..3fde413315c 100644 --- a/adapters/metax/metax.go +++ b/adapters/metax/metax.go @@ -28,18 +28,14 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.E // split impressions reqDatas := make([]*adapters.RequestData, 0, len(request.Imp)) - for i := range request.Imp { - imp := &request.Imp[i] - impCopy := *imp - requestCopy := *request - - metaxExt, err := parseBidderExt(imp) + for _, imp := range request.Imp { + metaxExt, err := parseBidderExt(&imp) if err != nil { errs = append(errs, err) continue } - if err := preprocessImp(&impCopy); err != nil { + if err := preprocessImp(&imp); err != nil { errs = append(errs, err) continue } @@ -50,7 +46,8 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.E continue } - requestCopy.Imp = []openrtb2.Imp{impCopy} + requestCopy := *request + requestCopy.Imp = []openrtb2.Imp{imp} reqJSON, err := json.Marshal(requestCopy) if err != nil { errs = append(errs, err) From 1323004a3ca59f55e2f3952b507ee642c6e0e434 Mon Sep 17 00:00:00 2001 From: Kehan Pan Date: Mon, 5 Aug 2024 11:48:56 +0000 Subject: [PATCH 10/10] MetaX: removed unused variable Signed-off-by: Kehan Pan --- adapters/metax/metax.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/adapters/metax/metax.go b/adapters/metax/metax.go index 3fde413315c..d10c426434c 100644 --- a/adapters/metax/metax.go +++ b/adapters/metax/metax.go @@ -17,8 +17,6 @@ import ( "github.com/prebid/prebid-server/v2/util/ptrutil" ) -const SupportedCurrency = "USD" - type adapter struct { template *template.Template }