From 50df45ad5626021579be0ded1330ef78e7df86e8 Mon Sep 17 00:00:00 2001 From: Copper6 Date: Sun, 16 Jun 2024 23:16:26 +0300 Subject: [PATCH 1/7] release adapter Copper6SSP --- adapters/copper6ssp/copper6ssp.go | 158 +++++++++++ adapters/copper6ssp/copper6ssp_test.go | 20 ++ .../copper6ssptest/exemplary/endpointId.json | 136 ++++++++++ .../exemplary/multi-format.json | 105 ++++++++ .../copper6ssptest/exemplary/multi-imp.json | 253 ++++++++++++++++++ .../exemplary/simple-banner.json | 136 ++++++++++ .../exemplary/simple-native.json | 120 +++++++++ .../exemplary/simple-video.json | 131 +++++++++ .../exemplary/simple-web-banner.json | 136 ++++++++++ .../supplemental/bad_media_type.json | 83 ++++++ .../supplemental/bad_response.json | 85 ++++++ .../supplemental/no-valid-impressions.json | 20 ++ .../supplemental/status-204.json | 80 ++++++ .../supplemental/status-not-200.json | 85 ++++++ adapters/copper6ssp/params_test.go | 47 ++++ exchange/adapter_builders.go | 2 + openrtb_ext/bidders.go | 2 + openrtb_ext/imp_copper6ssp.go | 6 + static/bidder-info/copper6ssp.yaml | 21 ++ static/bidder-params/copper6ssp.json | 22 ++ 20 files changed, 1648 insertions(+) create mode 100644 adapters/copper6ssp/copper6ssp.go create mode 100644 adapters/copper6ssp/copper6ssp_test.go create mode 100644 adapters/copper6ssp/copper6ssptest/exemplary/endpointId.json create mode 100644 adapters/copper6ssp/copper6ssptest/exemplary/multi-format.json create mode 100644 adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json create mode 100644 adapters/copper6ssp/copper6ssptest/exemplary/simple-banner.json create mode 100644 adapters/copper6ssp/copper6ssptest/exemplary/simple-native.json create mode 100644 adapters/copper6ssp/copper6ssptest/exemplary/simple-video.json create mode 100644 adapters/copper6ssp/copper6ssptest/exemplary/simple-web-banner.json create mode 100644 adapters/copper6ssp/copper6ssptest/supplemental/bad_media_type.json create mode 100644 adapters/copper6ssp/copper6ssptest/supplemental/bad_response.json create mode 100644 adapters/copper6ssp/copper6ssptest/supplemental/no-valid-impressions.json create mode 100644 adapters/copper6ssp/copper6ssptest/supplemental/status-204.json create mode 100644 adapters/copper6ssp/copper6ssptest/supplemental/status-not-200.json create mode 100644 adapters/copper6ssp/params_test.go create mode 100644 openrtb_ext/imp_copper6ssp.go create mode 100644 static/bidder-info/copper6ssp.yaml create mode 100644 static/bidder-params/copper6ssp.json diff --git a/adapters/copper6ssp/copper6ssp.go b/adapters/copper6ssp/copper6ssp.go new file mode 100644 index 00000000000..67a2fd7cdee --- /dev/null +++ b/adapters/copper6ssp/copper6ssp.go @@ -0,0 +1,158 @@ +package copper6ssp + +import ( + "encoding/json" + "errors" + "fmt" + "net/http" + + "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/openrtb_ext" +) + +type adapter struct { + endpoint string +} + +type reqBodyExt struct { + Copper6sspBidderExt reqBodyExtBidder `json:"bidder"` +} + +type reqBodyExtBidder struct { + Type string `json:"type"` + PlacementID string `json:"placementId,omitempty"` + EndpointID string `json:"endpointId,omitempty"` +} + +func Builder(bidderName openrtb_ext.BidderName, config config.Adapter, server config.Server) (adapters.Bidder, error) { + bidder := &adapter{ + endpoint: config.Endpoint, + } + return bidder, nil +} + +func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { + var errs []error + var adapterRequests []*adapters.RequestData + + reqCopy := *request + for _, imp := range request.Imp { + reqCopy.Imp = []openrtb2.Imp{imp} + + var bidderExt adapters.ExtImpBidder + var copper6sspExt openrtb_ext.ImpExtCopper6ssp + + if err := json.Unmarshal(imp.Ext, &bidderExt); err != nil { + errs = append(errs, err) + continue + } + if err := json.Unmarshal(bidderExt.Bidder, &copper6sspExt); err != nil { + errs = append(errs, err) + continue + } + + impExt := reqBodyExt{Copper6sspBidderExt: reqBodyExtBidder{}} + + if copper6sspExt.PlacementID != "" { + impExt.Copper6sspBidderExt.PlacementID = copper6sspExt.PlacementID + impExt.Copper6sspBidderExt.Type = "publisher" + } else if copper6sspExt.EndpointID != "" { + impExt.Copper6sspBidderExt.EndpointID = copper6sspExt.EndpointID + impExt.Copper6sspBidderExt.Type = "network" + } + + finalyImpExt, err := json.Marshal(impExt) + if err != nil { + errs = append(errs, err) + continue + } + + reqCopy.Imp[0].Ext = finalyImpExt + + adapterReq, err := a.makeRequest(&reqCopy) + if err != nil { + errs = append(errs, err) + continue + } + + adapterRequests = append(adapterRequests, adapterReq) + } + + if len(adapterRequests) == 0 { + errs = append(errs, errors.New("found no valid impressions")) + return nil, errs + } + + return adapterRequests, nil +} + +func (a *adapter) makeRequest(request *openrtb2.BidRequest) (*adapters.RequestData, error) { + reqJSON, err := json.Marshal(request) + if err != nil { + return nil, err + } + + headers := http.Header{} + headers.Add("Content-Type", "application/json;charset=utf-8") + headers.Add("Accept", "application/json") + return &adapters.RequestData{ + Method: "POST", + Uri: a.endpoint, + Body: reqJSON, + Headers: headers, + ImpIDs: openrtb_ext.GetImpIDs(request.Imp), + }, nil +} + +func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.RequestData, responseData *adapters.ResponseData) (*adapters.BidderResponse, []error) { + if adapters.IsResponseStatusCodeNoContent(responseData) { + return nil, nil + } + + if err := adapters.CheckResponseStatusCodeForErrors(responseData); err != nil { + return nil, []error{err} + } + + var response openrtb2.BidResponse + if err := json.Unmarshal(responseData.Body, &response); err != nil { + return nil, []error{err} + } + + bidResponse := adapters.NewBidderResponseWithBidsCapacity(len(request.Imp)) + if len(response.Cur) != 0 { + bidResponse.Currency = response.Cur + } + + for _, seatBid := range response.SeatBid { + for i := range seatBid.Bid { + bid := seatBid.Bid[i] + bidType, err := getBidType(bid) + if err != nil { + return nil, []error{err} + } + + b := &adapters.TypedBid{ + Bid: &seatBid.Bid[i], + BidType: bidType, + } + bidResponse.Bids = append(bidResponse.Bids, b) + } + } + return bidResponse, nil +} + +func getBidType(bid openrtb2.Bid) (openrtb_ext.BidType, error) { + // determinate media type by bid response field mtype + 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 + } + + return "", fmt.Errorf("could not define media type for impression: %s", bid.ImpID) +} diff --git a/adapters/copper6ssp/copper6ssp_test.go b/adapters/copper6ssp/copper6ssp_test.go new file mode 100644 index 00000000000..54d1ab9b28c --- /dev/null +++ b/adapters/copper6ssp/copper6ssp_test.go @@ -0,0 +1,20 @@ +package copper6ssp + +import ( + "testing" + + "github.com/prebid/prebid-server/v2/adapters/adapterstest" + "github.com/prebid/prebid-server/v2/config" + "github.com/prebid/prebid-server/v2/openrtb_ext" +) + +func TestJsonSamples(t *testing.T) { + bidder, buildErr := Builder(openrtb_ext.BidderEmtv, config.Adapter{ + Endpoint: "https://endpoint.copper6.com/pserver"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) + + if buildErr != nil { + t.Fatalf("Builder returned unexpected error %v", buildErr) + } + + adapterstest.RunJSONBidderTest(t, "copper6ssptest", bidder) +} diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/endpointId.json b/adapters/copper6ssp/copper6ssptest/exemplary/endpointId.json new file mode 100644 index 00000000000..2ed8cee6e93 --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/exemplary/endpointId.json @@ -0,0 +1,136 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + }, + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "endpointId": "test" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://endpoint.copper6.com/pserver", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "endpointId": "test", + "type": "network" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "bid": [ + { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 1, + "w": 300, + "h": 250, + "ext": { + "prebid": { + "type": "banner" + } + } + } + ], + "seat": "copper6ssp" + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "bids": [ + { + "bid": { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 1, + "w": 300, + "h": 250, + "ext": { + "prebid": { + "type": "banner" + } + } + }, + "type": "banner" + } + ] + } + ] +} \ No newline at end of file diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/multi-format.json b/adapters/copper6ssp/copper6ssptest/exemplary/multi-format.json new file mode 100644 index 00000000000..a924a543c3f --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/exemplary/multi-format.json @@ -0,0 +1,105 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + }, + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 5 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "endpointId": "test" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://endpoint.copper6.com/pserver", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 5 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "endpointId": "test", + "type": "network" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 204 + } + } + ], + "expectedBidResponses": [] +} \ No newline at end of file diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json b/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json new file mode 100644 index 00000000000..c1c8a57eee1 --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json @@ -0,0 +1,253 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + }, + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "endpointId": "test" + } + } + }, + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "endpointId": "test" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://endpoint.copper6.com/pserver", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "endpointId": "test", + "type": "network" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "bid": [ + { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 1, + "w": 300, + "h": 250, + "ext": { + "prebid": { + "type": "banner" + } + } + } + ], + "seat": "copper6ssp" + } + ], + "cur": "USD" + } + } + }, + { + "expectedRequest": { + "uri": "https://endpoint.copper6.com/pserver", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "endpointId": "test", + "type": "network" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "bid": [ + { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 1, + "w": 300, + "h": 250, + "ext": { + "prebid": { + "type": "banner" + } + } + } + ], + "seat": "copper6ssp" + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "bids": [ + { + "bid": { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 1, + "w": 300, + "h": 250, + "ext": { + "prebid": { + "type": "banner" + } + } + }, + "type": "banner" + } + ] + }, + { + "bids": [ + { + "bid": { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 1, + "w": 300, + "h": 250, + "ext": { + "prebid": { + "type": "banner" + } + } + }, + "type": "banner" + } + ] + } + ] +} \ No newline at end of file diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/simple-banner.json b/adapters/copper6ssp/copper6ssptest/exemplary/simple-banner.json new file mode 100644 index 00000000000..a224916898b --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/exemplary/simple-banner.json @@ -0,0 +1,136 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + }, + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "placementId": "test" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://endpoint.copper6.com/pserver", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "placementId": "test", + "type": "publisher" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "bid": [ + { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 1, + "w": 300, + "h": 250, + "ext": { + "prebid": { + "type": "banner" + } + } + } + ], + "seat": "copper6ssp" + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "bids": [ + { + "bid": { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 1, + "w": 300, + "h": 250, + "ext": { + "prebid": { + "type": "banner" + } + } + }, + "type": "banner" + } + ] + } + ] +} \ No newline at end of file diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/simple-native.json b/adapters/copper6ssp/copper6ssptest/exemplary/simple-native.json new file mode 100644 index 00000000000..79f87ad75f7 --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/exemplary/simple-native.json @@ -0,0 +1,120 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + }, + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "native": { + "request": "{\"ver\":\"1.1\",\"layout\":1,\"adunit\":2,\"plcmtcnt\":6,\"plcmttype\":4,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":75}},{\"id\":2,\"required\":1,\"img\":{\"wmin\":492,\"hmin\":328,\"type\":3,\"mimes\":[\"image/jpeg\",\"image/jpg\",\"image/png\"]}},{\"id\":4,\"required\":0,\"data\":{\"type\":6}},{\"id\":5,\"required\":0,\"data\":{\"type\":7}},{\"id\":6,\"required\":0,\"data\":{\"type\":1,\"len\":20}}]}", + "ver": "1.1" + }, + "ext": { + "bidder": { + "placementId": "test" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://endpoint.copper6.com/pserver", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "native": { + "request": "{\"ver\":\"1.1\",\"layout\":1,\"adunit\":2,\"plcmtcnt\":6,\"plcmttype\":4,\"assets\":[{\"id\":1,\"required\":1,\"title\":{\"len\":75}},{\"id\":2,\"required\":1,\"img\":{\"wmin\":492,\"hmin\":328,\"type\":3,\"mimes\":[\"image/jpeg\",\"image/jpg\",\"image/png\"]}},{\"id\":4,\"required\":0,\"data\":{\"type\":6}},{\"id\":5,\"required\":0,\"data\":{\"type\":7}},{\"id\":6,\"required\":0,\"data\":{\"type\":1,\"len\":20}}]}", + "ver": "1.1" + }, + "ext": { + "bidder": { + "placementId": "test", + "type": "publisher" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "bid": [ + { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 4, + "w": 300, + "h": 250, + "ext": { + "prebid": { + "type": "native" + } + } + } + ], + "seat": "copper6ssp" + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "bids": [ + { + "bid": { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 4, + "w": 300, + "h": 250, + "ext": { + "prebid": { + "type": "native" + } + } + }, + "type": "native" + } + ] + } + ] +} \ No newline at end of file diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/simple-video.json b/adapters/copper6ssp/copper6ssptest/exemplary/simple-video.json new file mode 100644 index 00000000000..2634344b622 --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/exemplary/simple-video.json @@ -0,0 +1,131 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + }, + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 5 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "placementId": "test" + } + } + } + ] + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://endpoint.copper6.com/pserver", + "body": { + "id": "test-request-id", + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + }, + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "video": { + "mimes": [ + "video/mp4" + ], + "protocols": [ + 2, + 5 + ], + "w": 1024, + "h": 576 + }, + "ext": { + "bidder": { + "placementId": "test", + "type": "publisher" + } + } + } + ] + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "bid": [ + { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "00:01:00", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 2, + "ext": { + "prebid": { + "type": "video" + } + } + } + ], + "seat": "copper6ssp" + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "currency": "USD", + "bids": [ + { + "bid": { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "00:01:00", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 2, + "ext": { + "prebid": { + "type": "video" + } + } + }, + "type": "video" + } + ] + } + ] +} \ No newline at end of file diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/simple-web-banner.json b/adapters/copper6ssp/copper6ssptest/exemplary/simple-web-banner.json new file mode 100644 index 00000000000..1fdf447127d --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/exemplary/simple-web-banner.json @@ -0,0 +1,136 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "placementId": "test" + } + } + } + ], + "site": { + "id": "1", + "domain": "test.com" + }, + "device": { + "ip": "123.123.123.123", + "ua": "Ubuntu" + } + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://endpoint.copper6.com/pserver", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "placementId": "test", + "type": "publisher" + } + } + } + ], + "site": { + "id": "1", + "domain": "test.com" + }, + "device": { + "ip": "123.123.123.123", + "ua": "Ubuntu" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "bid": [ + { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 1, + "w": 468, + "h": 60, + "ext": { + "prebid": { + "type": "banner" + } + } + } + ], + "seat": "copper6ssp" + } + ], + "cur": "USD" + } + } + } + ], + "expectedBidResponses": [ + { + "bids": [ + { + "bid": { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "mtype": 1, + "w": 468, + "h": 60, + "ext": { + "prebid": { + "type": "banner" + } + } + }, + "type": "banner" + } + ] + } + ] +} \ No newline at end of file diff --git a/adapters/copper6ssp/copper6ssptest/supplemental/bad_media_type.json b/adapters/copper6ssp/copper6ssptest/supplemental/bad_media_type.json new file mode 100644 index 00000000000..16706b1af2e --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/supplemental/bad_media_type.json @@ -0,0 +1,83 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "ext": { + "bidder": { + "placementId": "test" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ifa": "sdjfksdf-dfsds-dsdg-dsgg" + } + }, + "httpCalls": [{ + "expectedRequest": { + "uri": "https://endpoint.copper6.com/pserver", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "ext": { + "bidder": { + "placementId": "test", + "type": "publisher" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ifa": "sdjfksdf-dfsds-dsdg-dsgg" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "test-request-id", + "seatbid": [ + { + "bid": [ + { + "id": "test_bid_id", + "impid": "test-imp-id", + "price": 0.27543, + "adm": "", + "cid": "test_cid", + "crid": "test_crid", + "dealid": "test_dealid", + "w": 300, + "h": 250, + "ext": {} + } + ], + "seat": "copper6ssp" + } + ], + "cur": "USD" + } + } + }], + "expectedMakeBidsErrors": [ + { + "value": "could not define media type for impression: test-imp-id", + "comparison": "literal" + } + ] +} diff --git a/adapters/copper6ssp/copper6ssptest/supplemental/bad_response.json b/adapters/copper6ssp/copper6ssptest/supplemental/bad_response.json new file mode 100644 index 00000000000..2b64fe150e4 --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/supplemental/bad_response.json @@ -0,0 +1,85 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "placementId": "test" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ifa": "sdjfksdf-dfsds-dsdg-dsgg" + } + }, + "httpCalls": [{ + "expectedRequest": { + "uri": "https://endpoint.copper6.com/pserver", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "placementId": "test", + "type": "publisher" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ifa": "sdjfksdf-dfsds-dsdg-dsgg" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 200, + "body": "" + } + }], + "expectedMakeBidsErrors": [ + { + "value": "json: cannot unmarshal string into Go value of type openrtb2.BidResponse", + "comparison": "literal" + } + ] +} diff --git a/adapters/copper6ssp/copper6ssptest/supplemental/no-valid-impressions.json b/adapters/copper6ssp/copper6ssptest/supplemental/no-valid-impressions.json new file mode 100644 index 00000000000..cc1edd685f9 --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/supplemental/no-valid-impressions.json @@ -0,0 +1,20 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ifa": "sdjfksdf-dfsds-dsdg-dsgg" + } + }, + "expectedMakeRequestsErrors": [ + { + "value": "found no valid impressions", + "comparison": "literal" + } + ] +} diff --git a/adapters/copper6ssp/copper6ssptest/supplemental/status-204.json b/adapters/copper6ssp/copper6ssptest/supplemental/status-204.json new file mode 100644 index 00000000000..e165476651d --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/supplemental/status-204.json @@ -0,0 +1,80 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "placementId": "test" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ifa": "sdjfksdf-dfsds-dsdg-dsgg" + } + }, + "httpCalls": [{ + "expectedRequest": { + "uri": "https://endpoint.copper6.com/pserver", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "placementId": "test", + "type": "publisher" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ifa": "sdjfksdf-dfsds-dsdg-dsgg" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 204, + "body": {} + } + }], + "expectedBidResponses": [] +} diff --git a/adapters/copper6ssp/copper6ssptest/supplemental/status-not-200.json b/adapters/copper6ssp/copper6ssptest/supplemental/status-not-200.json new file mode 100644 index 00000000000..da205b50b09 --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/supplemental/status-not-200.json @@ -0,0 +1,85 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "placementId": "test" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ifa": "sdjfksdf-dfsds-dsdg-dsgg" + } + }, + "httpCalls": [{ + "expectedRequest": { + "uri": "https://endpoint.copper6.com/pserver", + "body": { + "id": "test-request-id", + "imp": [ + { + "id": "test-imp-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "placementId": "test", + "type": "publisher" + } + } + } + ], + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "device": { + "ip": "123.123.123.123", + "ifa": "sdjfksdf-dfsds-dsdg-dsgg" + } + }, + "impIDs":["test-imp-id"] + }, + "mockResponse": { + "status": 404, + "body": {} + } + }], + "expectedMakeBidsErrors": [ + { + "value": "Unexpected status code: 404. Run with request.debug = 1 for more info", + "comparison": "literal" + } + ] +} diff --git a/adapters/copper6ssp/params_test.go b/adapters/copper6ssp/params_test.go new file mode 100644 index 00000000000..f067a5f9d5c --- /dev/null +++ b/adapters/copper6ssp/params_test.go @@ -0,0 +1,47 @@ +package copper6ssp + +import ( + "encoding/json" + "testing" + + "github.com/prebid/prebid-server/v2/openrtb_ext" +) + +func TestValidParams(t *testing.T) { + validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params") + if err != nil { + t.Fatalf("Failed to fetch the json schema. %v", err) + } + + for _, p := range validParams { + if err := validator.Validate(openrtb_ext.BidderCopper6ssp, json.RawMessage(p)); err != nil { + t.Errorf("Schema rejected valid params: %s", p) + } + } +} + +func TestInvalidParams(t *testing.T) { + validator, err := openrtb_ext.NewBidderParamsValidator("../../static/bidder-params") + if err != nil { + t.Fatalf("Failed to fetch the json schema. %v", err) + } + + for _, p := range invalidParams { + if err := validator.Validate(openrtb_ext.BidderCopper6ssp, json.RawMessage(p)); err == nil { + t.Errorf("Schema allowed invalid params: %s", p) + } + } +} + +var validParams = []string{ + `{"placementId": "test"}`, + `{"placementId": "1"}`, + `{"endpointId": "test"}`, + `{"endpointId": "1"}`, +} + +var invalidParams = []string{ + `{"placementId": 42}`, + `{"endpointId": 42}`, + `{"placementId": "1", "endpointId": "1"}`, +} diff --git a/exchange/adapter_builders.go b/exchange/adapter_builders.go index 1593773b064..2c86a5d1efd 100755 --- a/exchange/adapter_builders.go +++ b/exchange/adapter_builders.go @@ -69,6 +69,7 @@ import ( "github.com/prebid/prebid-server/v2/adapters/connectad" "github.com/prebid/prebid-server/v2/adapters/consumable" "github.com/prebid/prebid-server/v2/adapters/conversant" + "github.com/prebid/prebid-server/v2/adapters/copper6ssp" "github.com/prebid/prebid-server/v2/adapters/cpmstar" "github.com/prebid/prebid-server/v2/adapters/criteo" "github.com/prebid/prebid-server/v2/adapters/cwire" @@ -279,6 +280,7 @@ func newAdapterBuilders() map[openrtb_ext.BidderName]adapters.Builder { openrtb_ext.BidderConnectAd: connectad.Builder, openrtb_ext.BidderConsumable: consumable.Builder, openrtb_ext.BidderConversant: conversant.Builder, + openrtb_ext.BidderCopper6ssp: copper6ssp.Builder, openrtb_ext.BidderCpmstar: cpmstar.Builder, openrtb_ext.BidderCriteo: criteo.Builder, openrtb_ext.BidderCWire: cwire.Builder, diff --git a/openrtb_ext/bidders.go b/openrtb_ext/bidders.go index adcee3ad09a..f3fcca82737 100644 --- a/openrtb_ext/bidders.go +++ b/openrtb_ext/bidders.go @@ -85,6 +85,7 @@ var coreBidderNames []BidderName = []BidderName{ BidderConnectAd, BidderConsumable, BidderConversant, + BidderCopper6ssp, BidderCpmstar, BidderCriteo, BidderCWire, @@ -395,6 +396,7 @@ const ( BidderConnectAd BidderName = "connectad" BidderConsumable BidderName = "consumable" BidderConversant BidderName = "conversant" + BidderCopper6ssp BidderName = "copper6ssp" BidderCpmstar BidderName = "cpmstar" BidderCriteo BidderName = "criteo" BidderCWire BidderName = "cwire" diff --git a/openrtb_ext/imp_copper6ssp.go b/openrtb_ext/imp_copper6ssp.go new file mode 100644 index 00000000000..a9fd47a1eb6 --- /dev/null +++ b/openrtb_ext/imp_copper6ssp.go @@ -0,0 +1,6 @@ +package openrtb_ext + +type ImpExtCopper6ssp struct { + PlacementID string `json:"placementId"` + EndpointID string `json:"endpointId"` +} diff --git a/static/bidder-info/copper6ssp.yaml b/static/bidder-info/copper6ssp.yaml new file mode 100644 index 00000000000..92dc5cfb7e8 --- /dev/null +++ b/static/bidder-info/copper6ssp.yaml @@ -0,0 +1,21 @@ +endpoint: "https://endpoint.copper6.com/" +maintainer: + email: "info@copper6.com" +capabilities: + site: + mediaTypes: + - banner + - video + - native + app: + mediaTypes: + - banner + - video + - native +userSync: + redirect: + url: "https://csync.copper6.com/pbserver?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&ccpa={{.USPrivacy}}&gpp={{.GPP}}&gpp_sid={{.GPPSID}}&redir={{.RedirectURL}}" + userMacro: "[UID]" + iframe: + url: "https://csync.copper6.com/pbserverIframe?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&ccpa={{.USPrivacy}}&gpp={{.GPP}}&gpp_sid={{.GPPSID}}&pbserverUrl={{.RedirectURL}}" + userMacro: "[UID]" diff --git a/static/bidder-params/copper6ssp.json b/static/bidder-params/copper6ssp.json new file mode 100644 index 00000000000..4879d64a526 --- /dev/null +++ b/static/bidder-params/copper6ssp.json @@ -0,0 +1,22 @@ +{ + "$schema": "http://json-schema.org/draft-04/schema#", + "title": "Copper6SSPs Adapter Params", + "description": "A schema which validates params accepted by the QT adapter", + "type": "object", + "properties": { + "placementId": { + "type": "string", + "minLength": 1, + "description": "Placement ID" + }, + "endpointId": { + "type": "string", + "minLength": 1, + "description": "Endpoint ID" + } + }, + "oneOf": [ + { "required": ["placementId"] }, + { "required": ["endpointId"] } + ] +} \ No newline at end of file From 45a77cb8c5ece335232fba07835d38a48fef9f8c Mon Sep 17 00:00:00 2001 From: Copper6 Date: Sun, 16 Jun 2024 23:19:01 +0300 Subject: [PATCH 2/7] upd --- static/bidder-params/copper6ssp.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/bidder-params/copper6ssp.json b/static/bidder-params/copper6ssp.json index 4879d64a526..9467e48e9b9 100644 --- a/static/bidder-params/copper6ssp.json +++ b/static/bidder-params/copper6ssp.json @@ -1,7 +1,7 @@ { "$schema": "http://json-schema.org/draft-04/schema#", "title": "Copper6SSPs Adapter Params", - "description": "A schema which validates params accepted by the QT adapter", + "description": "A schema which validates params accepted by the Copper6SSP adapter", "type": "object", "properties": { "placementId": { From 248757ea9e1e16250363d895cc0b39b7e3176973 Mon Sep 17 00:00:00 2001 From: Copper6 Date: Wed, 24 Jul 2024 11:47:37 +0300 Subject: [PATCH 3/7] upd --- adapters/copper6ssp/copper6ssp.go | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/adapters/copper6ssp/copper6ssp.go b/adapters/copper6ssp/copper6ssp.go index 67a2fd7cdee..c6348d73f3e 100644 --- a/adapters/copper6ssp/copper6ssp.go +++ b/adapters/copper6ssp/copper6ssp.go @@ -77,7 +77,9 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.E continue } - adapterRequests = append(adapterRequests, adapterReq) + if adapterReq != nil { + adapterRequests = append(adapterRequests, adapterReq) + } } if len(adapterRequests) == 0 { @@ -127,8 +129,7 @@ func (a *adapter) MakeBids(request *openrtb2.BidRequest, requestData *adapters.R for _, seatBid := range response.SeatBid { for i := range seatBid.Bid { - bid := seatBid.Bid[i] - bidType, err := getBidType(bid) + bidType, err := getBidType(seatBid.Bid[i]) if err != nil { return nil, []error{err} } From ef0e3a3b1b240b2c1cd26671d7ab7f86e7309e91 Mon Sep 17 00:00:00 2001 From: Copper6 Date: Mon, 5 Aug 2024 16:58:29 +0300 Subject: [PATCH 4/7] fixes --- adapters/copper6ssp/copper6ssp.go | 6 +-- adapters/copper6ssp/copper6ssp_test.go | 4 +- .../copper6ssptest/exemplary/endpointId.json | 6 +-- .../exemplary/multi-format.json | 2 +- .../copper6ssptest/exemplary/multi-imp.json | 14 +++---- .../exemplary/simple-banner.json | 6 +-- .../exemplary/simple-native.json | 6 +-- .../exemplary/simple-video.json | 2 +- .../exemplary/simple-web-banner.json | 6 +-- .../supplemental/bad_media_type.json | 4 +- .../supplemental/bad_response.json | 2 +- .../supplemental/no-valid-bidder-param.json | 42 +++++++++++++++++++ .../supplemental/no-valid-imp-ext.json | 38 +++++++++++++++++ .../supplemental/no-valid-impressions.json | 20 --------- .../supplemental/status-204.json | 2 +- .../supplemental/status-not-200.json | 2 +- 16 files changed, 110 insertions(+), 52 deletions(-) create mode 100644 adapters/copper6ssp/copper6ssptest/supplemental/no-valid-bidder-param.json create mode 100644 adapters/copper6ssp/copper6ssptest/supplemental/no-valid-imp-ext.json delete mode 100644 adapters/copper6ssp/copper6ssptest/supplemental/no-valid-impressions.json diff --git a/adapters/copper6ssp/copper6ssp.go b/adapters/copper6ssp/copper6ssp.go index c6348d73f3e..57ec6bcc17b 100644 --- a/adapters/copper6ssp/copper6ssp.go +++ b/adapters/copper6ssp/copper6ssp.go @@ -2,7 +2,6 @@ package copper6ssp import ( "encoding/json" - "errors" "fmt" "net/http" @@ -63,13 +62,13 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.E impExt.Copper6sspBidderExt.Type = "network" } - finalyImpExt, err := json.Marshal(impExt) + finalImpExt, err := json.Marshal(impExt) if err != nil { errs = append(errs, err) continue } - reqCopy.Imp[0].Ext = finalyImpExt + reqCopy.Imp[0].Ext = finalImpExt adapterReq, err := a.makeRequest(&reqCopy) if err != nil { @@ -83,7 +82,6 @@ func (a *adapter) MakeRequests(request *openrtb2.BidRequest, reqInfo *adapters.E } if len(adapterRequests) == 0 { - errs = append(errs, errors.New("found no valid impressions")) return nil, errs } diff --git a/adapters/copper6ssp/copper6ssp_test.go b/adapters/copper6ssp/copper6ssp_test.go index 54d1ab9b28c..25bd2dbc67a 100644 --- a/adapters/copper6ssp/copper6ssp_test.go +++ b/adapters/copper6ssp/copper6ssp_test.go @@ -9,8 +9,8 @@ import ( ) func TestJsonSamples(t *testing.T) { - bidder, buildErr := Builder(openrtb_ext.BidderEmtv, config.Adapter{ - Endpoint: "https://endpoint.copper6.com/pserver"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) + bidder, buildErr := Builder(openrtb_ext.BidderCopper6ssp, config.Adapter{ + Endpoint: "https://example.com"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) if buildErr != nil { t.Fatalf("Builder returned unexpected error %v", buildErr) diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/endpointId.json b/adapters/copper6ssp/copper6ssptest/exemplary/endpointId.json index 2ed8cee6e93..3dc82f836da 100644 --- a/adapters/copper6ssp/copper6ssptest/exemplary/endpointId.json +++ b/adapters/copper6ssp/copper6ssptest/exemplary/endpointId.json @@ -36,7 +36,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://endpoint.copper6.com/pserver", + "uri": "https://example.com", "body": { "id": "test-request-id", "imp": [ @@ -85,7 +85,7 @@ "id": "test_bid_id", "impid": "test-imp-id", "price": 0.27543, - "adm": "", + "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", @@ -115,7 +115,7 @@ "id": "test_bid_id", "impid": "test-imp-id", "price": 0.27543, - "adm": "", + "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/multi-format.json b/adapters/copper6ssp/copper6ssptest/exemplary/multi-format.json index a924a543c3f..9e897a9a1bb 100644 --- a/adapters/copper6ssp/copper6ssptest/exemplary/multi-format.json +++ b/adapters/copper6ssp/copper6ssptest/exemplary/multi-format.json @@ -47,7 +47,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://endpoint.copper6.com/pserver", + "uri": "https://example.com", "body": { "id": "test-request-id", "imp": [ diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json b/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json index c1c8a57eee1..6bed74e5bc9 100644 --- a/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json +++ b/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json @@ -32,7 +32,7 @@ } }, { - "id": "test-imp-id", + "id": "test-imp-id2", "tagid": "test", "banner": { "format": [ @@ -57,7 +57,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://endpoint.copper6.com/pserver", + "uri": "https://example.com", "body": { "id": "test-request-id", "imp": [ @@ -106,7 +106,7 @@ "id": "test_bid_id", "impid": "test-imp-id", "price": 0.27543, - "adm": "", + "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", @@ -129,7 +129,7 @@ }, { "expectedRequest": { - "uri": "https://endpoint.copper6.com/pserver", + "uri": "https://example.com", "body": { "id": "test-request-id", "imp": [ @@ -178,7 +178,7 @@ "id": "test_bid_id", "impid": "test-imp-id", "price": 0.27543, - "adm": "", + "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", @@ -208,7 +208,7 @@ "id": "test_bid_id", "impid": "test-imp-id", "price": 0.27543, - "adm": "", + "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", @@ -232,7 +232,7 @@ "id": "test_bid_id", "impid": "test-imp-id", "price": 0.27543, - "adm": "", + "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/simple-banner.json b/adapters/copper6ssp/copper6ssptest/exemplary/simple-banner.json index a224916898b..3bff225709d 100644 --- a/adapters/copper6ssp/copper6ssptest/exemplary/simple-banner.json +++ b/adapters/copper6ssp/copper6ssptest/exemplary/simple-banner.json @@ -36,7 +36,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://endpoint.copper6.com/pserver", + "uri": "https://example.com", "body": { "id": "test-request-id", "imp": [ @@ -85,7 +85,7 @@ "id": "test_bid_id", "impid": "test-imp-id", "price": 0.27543, - "adm": "", + "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", @@ -115,7 +115,7 @@ "id": "test_bid_id", "impid": "test-imp-id", "price": 0.27543, - "adm": "", + "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/simple-native.json b/adapters/copper6ssp/copper6ssptest/exemplary/simple-native.json index 79f87ad75f7..63b4a5c824a 100644 --- a/adapters/copper6ssp/copper6ssptest/exemplary/simple-native.json +++ b/adapters/copper6ssp/copper6ssptest/exemplary/simple-native.json @@ -28,7 +28,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://endpoint.copper6.com/pserver", + "uri": "https://example.com", "body": { "id": "test-request-id", "imp": [ @@ -69,7 +69,7 @@ "id": "test_bid_id", "impid": "test-imp-id", "price": 0.27543, - "adm": "", + "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", @@ -99,7 +99,7 @@ "id": "test_bid_id", "impid": "test-imp-id", "price": 0.27543, - "adm": "", + "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/simple-video.json b/adapters/copper6ssp/copper6ssptest/exemplary/simple-video.json index 2634344b622..60156082dc7 100644 --- a/adapters/copper6ssp/copper6ssptest/exemplary/simple-video.json +++ b/adapters/copper6ssp/copper6ssptest/exemplary/simple-video.json @@ -35,7 +35,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://endpoint.copper6.com/pserver", + "uri": "https://example.com", "body": { "id": "test-request-id", "device": { diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/simple-web-banner.json b/adapters/copper6ssp/copper6ssptest/exemplary/simple-web-banner.json index 1fdf447127d..3ff97037a82 100644 --- a/adapters/copper6ssp/copper6ssptest/exemplary/simple-web-banner.json +++ b/adapters/copper6ssp/copper6ssptest/exemplary/simple-web-banner.json @@ -36,7 +36,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://endpoint.copper6.com/pserver", + "uri": "https://example.com", "body": { "id": "test-request-id", "imp": [ @@ -85,7 +85,7 @@ "id": "test_bid_id", "impid": "test-imp-id", "price": 0.27543, - "adm": "", + "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", @@ -115,7 +115,7 @@ "id": "test_bid_id", "impid": "test-imp-id", "price": 0.27543, - "adm": "", + "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", diff --git a/adapters/copper6ssp/copper6ssptest/supplemental/bad_media_type.json b/adapters/copper6ssp/copper6ssptest/supplemental/bad_media_type.json index 16706b1af2e..3b61edd137d 100644 --- a/adapters/copper6ssp/copper6ssptest/supplemental/bad_media_type.json +++ b/adapters/copper6ssp/copper6ssptest/supplemental/bad_media_type.json @@ -22,7 +22,7 @@ }, "httpCalls": [{ "expectedRequest": { - "uri": "https://endpoint.copper6.com/pserver", + "uri": "https://example.com", "body": { "id": "test-request-id", "imp": [ @@ -58,7 +58,7 @@ "id": "test_bid_id", "impid": "test-imp-id", "price": 0.27543, - "adm": "", + "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", diff --git a/adapters/copper6ssp/copper6ssptest/supplemental/bad_response.json b/adapters/copper6ssp/copper6ssptest/supplemental/bad_response.json index 2b64fe150e4..cd4169c9974 100644 --- a/adapters/copper6ssp/copper6ssptest/supplemental/bad_response.json +++ b/adapters/copper6ssp/copper6ssptest/supplemental/bad_response.json @@ -34,7 +34,7 @@ }, "httpCalls": [{ "expectedRequest": { - "uri": "https://endpoint.copper6.com/pserver", + "uri": "https://example.com", "body": { "id": "test-request-id", "imp": [ diff --git a/adapters/copper6ssp/copper6ssptest/supplemental/no-valid-bidder-param.json b/adapters/copper6ssp/copper6ssptest/supplemental/no-valid-bidder-param.json new file mode 100644 index 00000000000..fbe564b6a26 --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/supplemental/no-valid-bidder-param.json @@ -0,0 +1,42 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + }, + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": { + "bidder": { + "endpointId": [] + } + } + } + ] + }, + "expectedMakeRequestsErrors": [ + { + "value": "json: cannot unmarshal array into Go struct field ImpExtCopper6ssp.endpointId of type string", + "comparison": "literal" + } + ] +} \ No newline at end of file diff --git a/adapters/copper6ssp/copper6ssptest/supplemental/no-valid-imp-ext.json b/adapters/copper6ssp/copper6ssptest/supplemental/no-valid-imp-ext.json new file mode 100644 index 00000000000..9d6710efe37 --- /dev/null +++ b/adapters/copper6ssp/copper6ssptest/supplemental/no-valid-imp-ext.json @@ -0,0 +1,38 @@ +{ + "mockBidRequest": { + "id": "test-request-id", + "device": { + "ip": "123.123.123.123", + "ua": "iPad" + }, + "app": { + "id": "1", + "bundle": "com.wls.testwlsapplication" + }, + "imp": [ + { + "id": "test-imp-id", + "tagid": "test", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + }, + { + "w": 300, + "h": 600 + } + ] + }, + "ext": "invalid" + } + ] + }, + "expectedMakeRequestsErrors": [ + { + "value": "json: cannot unmarshal string into Go value of type adapters.ExtImpBidder", + "comparison": "literal" + } + ] +} \ No newline at end of file diff --git a/adapters/copper6ssp/copper6ssptest/supplemental/no-valid-impressions.json b/adapters/copper6ssp/copper6ssptest/supplemental/no-valid-impressions.json deleted file mode 100644 index cc1edd685f9..00000000000 --- a/adapters/copper6ssp/copper6ssptest/supplemental/no-valid-impressions.json +++ /dev/null @@ -1,20 +0,0 @@ -{ - "mockBidRequest": { - "id": "test-request-id", - "imp": [], - "app": { - "id": "1", - "bundle": "com.wls.testwlsapplication" - }, - "device": { - "ip": "123.123.123.123", - "ifa": "sdjfksdf-dfsds-dsdg-dsgg" - } - }, - "expectedMakeRequestsErrors": [ - { - "value": "found no valid impressions", - "comparison": "literal" - } - ] -} diff --git a/adapters/copper6ssp/copper6ssptest/supplemental/status-204.json b/adapters/copper6ssp/copper6ssptest/supplemental/status-204.json index e165476651d..7dd1c65fd36 100644 --- a/adapters/copper6ssp/copper6ssptest/supplemental/status-204.json +++ b/adapters/copper6ssp/copper6ssptest/supplemental/status-204.json @@ -34,7 +34,7 @@ }, "httpCalls": [{ "expectedRequest": { - "uri": "https://endpoint.copper6.com/pserver", + "uri": "https://example.com", "body": { "id": "test-request-id", "imp": [ diff --git a/adapters/copper6ssp/copper6ssptest/supplemental/status-not-200.json b/adapters/copper6ssp/copper6ssptest/supplemental/status-not-200.json index da205b50b09..743f2996260 100644 --- a/adapters/copper6ssp/copper6ssptest/supplemental/status-not-200.json +++ b/adapters/copper6ssp/copper6ssptest/supplemental/status-not-200.json @@ -34,7 +34,7 @@ }, "httpCalls": [{ "expectedRequest": { - "uri": "https://endpoint.copper6.com/pserver", + "uri": "https://example.com", "body": { "id": "test-request-id", "imp": [ From 57ead97e28d3f38489c7d04238dbf9e143f5e311 Mon Sep 17 00:00:00 2001 From: Copper6 Date: Mon, 12 Aug 2024 14:10:05 +0300 Subject: [PATCH 5/7] upd test --- adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json b/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json index 6bed74e5bc9..ea0577966c2 100644 --- a/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json +++ b/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json @@ -134,7 +134,7 @@ "id": "test-request-id", "imp": [ { - "id": "test-imp-id", + "id": "test-imp-id2", "tagid": "test", "banner": { "format": [ From e2eb39a1bf24e6e5bfeb8590a332cf4471de7699 Mon Sep 17 00:00:00 2001 From: Copper6 Date: Mon, 12 Aug 2024 14:14:55 +0300 Subject: [PATCH 6/7] fixes --- adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json b/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json index ea0577966c2..e1a213f993d 100644 --- a/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json +++ b/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json @@ -165,7 +165,7 @@ "ua": "iPad" } }, - "impIDs":["test-imp-id"] + "impIDs":["test-imp-id2"] }, "mockResponse": { "status": 200, From 7762ff59fda2fc0fb2ec4d8a56f366ca7058aaa9 Mon Sep 17 00:00:00 2001 From: Copper6 Date: Wed, 21 Aug 2024 18:12:58 +0300 Subject: [PATCH 7/7] upd --- .../copper6ssptest/exemplary/multi-imp.json | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) diff --git a/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json b/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json index e1a213f993d..63828352744 100644 --- a/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json +++ b/adapters/copper6ssp/copper6ssptest/exemplary/multi-imp.json @@ -33,22 +33,22 @@ }, { "id": "test-imp-id2", - "tagid": "test", + "tagid": "test2", "banner": { "format": [ { - "w": 300, - "h": 250 + "w": 3000, + "h": 2500 }, { - "w": 300, - "h": 600 + "w": 3000, + "h": 6000 } ] }, "ext": { "bidder": { - "endpointId": "test" + "endpointId": "test2" } } } @@ -135,22 +135,22 @@ "imp": [ { "id": "test-imp-id2", - "tagid": "test", + "tagid": "test2", "banner": { "format": [ { - "w": 300, - "h": 250 + "w": 3000, + "h": 2500 }, { - "w": 300, - "h": 600 + "w": 3000, + "h": 6000 } ] }, "ext": { "bidder": { - "endpointId": "test", + "endpointId": "test2", "type": "network" } } @@ -176,15 +176,15 @@ "bid": [ { "id": "test_bid_id", - "impid": "test-imp-id", + "impid": "test-imp-id2", "price": 0.27543, "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", "mtype": 1, - "w": 300, - "h": 250, + "w": 3000, + "h": 2500, "ext": { "prebid": { "type": "banner" @@ -230,15 +230,15 @@ { "bid": { "id": "test_bid_id", - "impid": "test-imp-id", + "impid": "test-imp-id2", "price": 0.27543, "adm": "", "cid": "test_cid", "crid": "test_crid", "dealid": "test_dealid", "mtype": 1, - "w": 300, - "h": 250, + "w": 3000, + "h": 2500, "ext": { "prebid": { "type": "banner"