github.com/prebid/prebid-server@v0.275.0/adapters/avocet/avocet_test.go (about) 1 package avocet 2 3 import ( 4 "encoding/json" 5 "net/http" 6 "reflect" 7 "testing" 8 9 "github.com/prebid/openrtb/v19/adcom1" 10 "github.com/prebid/openrtb/v19/openrtb2" 11 "github.com/prebid/prebid-server/adapters" 12 "github.com/prebid/prebid-server/adapters/adapterstest" 13 "github.com/prebid/prebid-server/config" 14 "github.com/prebid/prebid-server/errortypes" 15 "github.com/prebid/prebid-server/openrtb_ext" 16 ) 17 18 func TestJsonSamples(t *testing.T) { 19 bidder, buildErr := Builder(openrtb_ext.BidderAvocet, config.Adapter{ 20 Endpoint: "https://bid.staging.avct.cloud/ortb/bid/5e722ee9bd6df11d063a8013"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"}) 21 22 if buildErr != nil { 23 t.Fatalf("Builder returned unexpected error %v", buildErr) 24 } 25 26 adapterstest.RunJSONBidderTest(t, "avocettest", bidder) 27 } 28 29 func TestAvocetAdapter_MakeRequests(t *testing.T) { 30 type fields struct { 31 Endpoint string 32 } 33 type args struct { 34 request *openrtb2.BidRequest 35 reqInfo *adapters.ExtraRequestInfo 36 } 37 type reqData []*adapters.RequestData 38 tests := []struct { 39 name string 40 fields fields 41 args args 42 want []*adapters.RequestData 43 wantErrs []error 44 }{ 45 { 46 name: "return nil if zero imps", 47 fields: fields{Endpoint: "https://bid.avct.cloud"}, 48 args: args{ 49 &openrtb2.BidRequest{}, 50 nil, 51 }, 52 want: nil, 53 wantErrs: nil, 54 }, 55 { 56 name: "makes POST request with JSON content", 57 fields: fields{Endpoint: "https://bid.avct.cloud"}, 58 args: args{ 59 &openrtb2.BidRequest{Imp: []openrtb2.Imp{{}}}, 60 nil, 61 }, 62 want: reqData{ 63 &adapters.RequestData{ 64 Method: http.MethodPost, 65 Uri: "https://bid.avct.cloud", 66 Body: []byte(`{"id":"","imp":[{"id":""}]}`), 67 Headers: map[string][]string{ 68 "Accept": {"application/json"}, 69 "Content-Type": {"application/json;charset=utf-8"}, 70 }, 71 }, 72 }, 73 wantErrs: nil, 74 }, 75 } 76 for _, tt := range tests { 77 t.Run(tt.name, func(t *testing.T) { 78 a := &AvocetAdapter{ 79 Endpoint: tt.fields.Endpoint, 80 } 81 got, got1 := a.MakeRequests(tt.args.request, tt.args.reqInfo) 82 if len(got) != len(tt.want) { 83 t.Errorf("AvocetAdapter.MakeRequests() got %v requests, wanted %v requests", len(got), len(tt.want)) 84 } 85 if len(got) == len(tt.want) { 86 for i := range tt.want { 87 if !reflect.DeepEqual(got[i], tt.want[i]) { 88 t.Errorf("AvocetAdapter.MakeRequests() got = %v, want %v", got[i], tt.want[i]) 89 } 90 } 91 } 92 if !reflect.DeepEqual(got1, tt.wantErrs) { 93 t.Errorf("AvocetAdapter.MakeRequests() got1 = %v, want %v", got1, tt.wantErrs) 94 } 95 }) 96 } 97 } 98 99 func TestAvocetAdapter_MakeBids(t *testing.T) { 100 type fields struct { 101 Endpoint string 102 } 103 type args struct { 104 internalRequest *openrtb2.BidRequest 105 externalRequest *adapters.RequestData 106 response *adapters.ResponseData 107 } 108 tests := []struct { 109 name string 110 fields fields 111 args args 112 want *adapters.BidderResponse 113 errs []error 114 }{ 115 { 116 name: "204 No Content indicates no bids", 117 fields: fields{Endpoint: "https://bid.avct.cloud"}, 118 args: args{ 119 nil, 120 nil, 121 &adapters.ResponseData{StatusCode: http.StatusNoContent}, 122 }, 123 want: nil, 124 errs: nil, 125 }, 126 { 127 name: "Non-200 return error", 128 fields: fields{Endpoint: "https://bid.avct.cloud"}, 129 args: args{ 130 nil, 131 nil, 132 &adapters.ResponseData{StatusCode: http.StatusBadRequest, Body: []byte("message")}, 133 }, 134 want: nil, 135 errs: []error{&errortypes.BadServerResponse{Message: "received status code: 400 error: message"}}, 136 }, 137 { 138 name: "200 response containing banner bids", 139 fields: fields{Endpoint: "https://bid.avct.cloud"}, 140 args: args{ 141 nil, 142 nil, 143 &adapters.ResponseData{StatusCode: http.StatusOK, Body: validBannerBidResponseBody}, 144 }, 145 want: &adapters.BidderResponse{ 146 Currency: "USD", 147 Bids: []*adapters.TypedBid{ 148 { 149 Bid: &validBannerBid, 150 BidType: openrtb_ext.BidTypeBanner, 151 }, 152 }, 153 }, 154 errs: nil, 155 }, 156 { 157 name: "200 response containing video bids", 158 fields: fields{Endpoint: "https://bid.avct.cloud"}, 159 args: args{ 160 nil, 161 nil, 162 &adapters.ResponseData{StatusCode: http.StatusOK, Body: validVideoBidResponseBody}, 163 }, 164 want: &adapters.BidderResponse{ 165 Currency: "USD", 166 Bids: []*adapters.TypedBid{ 167 { 168 Bid: &validVideoBid, 169 BidType: openrtb_ext.BidTypeVideo, 170 BidVideo: &openrtb_ext.ExtBidPrebidVideo{ 171 Duration: 30, 172 }, 173 }, 174 }, 175 }, 176 errs: nil, 177 }, 178 } 179 for _, tt := range tests { 180 t.Run(tt.name, func(t *testing.T) { 181 a := &AvocetAdapter{ 182 Endpoint: tt.fields.Endpoint, 183 } 184 got, got1 := a.MakeBids(tt.args.internalRequest, tt.args.externalRequest, tt.args.response) 185 if !reflect.DeepEqual(got, tt.want) { 186 gotb, _ := json.Marshal(got) 187 wantb, _ := json.Marshal(tt.want) 188 t.Errorf("AvocetAdapter.MakeBids() got = %s, want %s", string(gotb), string(wantb)) 189 } 190 if !reflect.DeepEqual(got1, tt.errs) { 191 t.Errorf("AvocetAdapter.MakeBids() got1 = %v, want %v", got1, tt.errs) 192 } 193 }) 194 } 195 } 196 197 func Test_getBidType(t *testing.T) { 198 type args struct { 199 bid openrtb2.Bid 200 ext avocetBidExt 201 } 202 tests := []struct { 203 name string 204 args args 205 want openrtb_ext.BidType 206 }{ 207 { 208 name: "VPAID 1.0", 209 args: args{openrtb2.Bid{API: adcom1.APIVPAID10}, avocetBidExt{}}, 210 want: openrtb_ext.BidTypeVideo, 211 }, 212 { 213 name: "VPAID 2.0", 214 args: args{openrtb2.Bid{API: adcom1.APIVPAID20}, avocetBidExt{}}, 215 want: openrtb_ext.BidTypeVideo, 216 }, 217 { 218 name: "other", 219 args: args{openrtb2.Bid{}, avocetBidExt{}}, 220 want: openrtb_ext.BidTypeBanner, 221 }, 222 } 223 for _, tt := range tests { 224 t.Run(tt.name, func(t *testing.T) { 225 if got := getBidType(tt.args.bid, tt.args.ext); !reflect.DeepEqual(got, tt.want) { 226 t.Errorf("getBidType() = %v, want %v", got, tt.want) 227 } 228 }) 229 } 230 } 231 232 var validBannerBid = openrtb2.Bid{ 233 AdM: "<iframe src=\"http://ads.staging.avct.cloud/sv?pp=${AUCTION_PRICE}&uuid=0df2c449-6d85-4179-b5d5-37f2f91caa24&ty=h&crid=5b51e49634f2021f127ff7c9&tacid=5b51e4ed89654741306813a8&aid=749d36d7-c993-455f-aefd-ffd8a7e3ccf_0&accid=5b51dd1634f2021f127ff7c0&brid=5b51e20f34f2021f127ff7c4&ioid=5b51e22089654741306813a1&caid=5b51e2d689654741306813a4&it=1&iobsid=496e8cff35b2c0110029534d&ext_aid=749d36d7-c993-455f-aefd-ffd8a7e3ccf_0&bp=15.64434783&bt=1591874537316649768&h=250&w=300&vpr=0&vdp=0&domain=example.com&gco=54510b3b816269000061a0f7&stid=542d2c1615e3c013de53a6e2&glat=0&glong=0&bip4=3232238090&ext_siid=5ea89200c865f911007f1b0e&ext_pid=1&ext_sid=5ea84df8c865f911007f1ade&ext_plid=5ea9601ac865f911007f1b6a&optv=latest:latest&invsrc=5e722ee9bd6df11d063a8013&ug=0d&ca=0&biid=requestd-54644474bf-l7gx4|eu-central-1-staging®=eu-central-1&ck=1_5d99a849\" height=\"250\" width=\"300\" marginwidth=0 marginheight=0 hspace=0 vspace=0 frameborder=0 scrolling=\"no\"></iframe>", 234 ADomain: []string{"avocet.io"}, 235 CID: "5b51e2d689654741306813a4", 236 CrID: "5b51e49634f2021f127ff7c9", 237 H: 250, 238 ID: "bc708396-9202-437b-b726-08b9864cb8b8", 239 ImpID: "test-imp-id", 240 IURL: "https://cdn.staging.avocet.io/snapshots/5b51dd1634f2021f127ff7c0/5b51e49634f2021f127ff7c9.jpeg", 241 Language: "en", 242 Price: 15.64434783, 243 W: 300, 244 } 245 246 var validBannerBidResponseBody = []byte(`{ 247 "bidid": "dd87f80c-16a0-43c8-a673-b94b3ea4d417", 248 "id": "test-request-id", 249 "seatbid": [ 250 { 251 "bid": [ 252 { 253 "adm": "<iframe src=\"http://ads.staging.avct.cloud/sv?pp=${AUCTION_PRICE}&uuid=0df2c449-6d85-4179-b5d5-37f2f91caa24&ty=h&crid=5b51e49634f2021f127ff7c9&tacid=5b51e4ed89654741306813a8&aid=749d36d7-c993-455f-aefd-ffd8a7e3ccf_0&accid=5b51dd1634f2021f127ff7c0&brid=5b51e20f34f2021f127ff7c4&ioid=5b51e22089654741306813a1&caid=5b51e2d689654741306813a4&it=1&iobsid=496e8cff35b2c0110029534d&ext_aid=749d36d7-c993-455f-aefd-ffd8a7e3ccf_0&bp=15.64434783&bt=1591874537316649768&h=250&w=300&vpr=0&vdp=0&domain=example.com&gco=54510b3b816269000061a0f7&stid=542d2c1615e3c013de53a6e2&glat=0&glong=0&bip4=3232238090&ext_siid=5ea89200c865f911007f1b0e&ext_pid=1&ext_sid=5ea84df8c865f911007f1ade&ext_plid=5ea9601ac865f911007f1b6a&optv=latest:latest&invsrc=5e722ee9bd6df11d063a8013&ug=0d&ca=0&biid=requestd-54644474bf-l7gx4|eu-central-1-staging®=eu-central-1&ck=1_5d99a849\" height=\"250\" width=\"300\" marginwidth=0 marginheight=0 hspace=0 vspace=0 frameborder=0 scrolling=\"no\"></iframe>", 254 "adomain": ["avocet.io"], 255 "cid": "5b51e2d689654741306813a4", 256 "crid": "5b51e49634f2021f127ff7c9", 257 "h": 250, 258 "id": "bc708396-9202-437b-b726-08b9864cb8b8", 259 "impid": "test-imp-id", 260 "iurl": "https://cdn.staging.avocet.io/snapshots/5b51dd1634f2021f127ff7c0/5b51e49634f2021f127ff7c9.jpeg", 261 "language": "en", 262 "price": 15.64434783, 263 "w": 300 264 } 265 ], 266 "seat": "TEST_SEAT_ID" 267 } 268 ] 269 }`) 270 271 var validVideoBid = openrtb2.Bid{ 272 AdM: "<VAST version=\"3.0\"><Ad id=\"5ec530e32d57fe1100f17d87\"><Wrapper><AdSystem>Avocet</AdSystem><VASTAdTagURI><![CDATA[http://ads.staging.avct.cloud/vast?x=1&uuid=0df2c449-6d85-4179-b5d5-37f2f91caa24&ty=h&crid=5ec530e32d57fe1100f17d87&tacid=5ec531d32d57fe1100f17d89&aid=749d36d7-c993-455f-aefd-ffd8a7e3ccf_0&accid=5b51dd1634f2021f127ff7c0&brid=5b51e20f34f2021f127ff7c4&ioid=5b51e22089654741306813a1&caid=5b51e2d689654741306813a4&it=2&iobsid=496e8cff35b2c0110029534d&ext_aid=749d36d7-c993-455f-aefd-ffd8a7e3ccf_0&bp=15.64434783&bt=1591875033134290518&h=396&w=600&vpr=0&vdp=0&domain=example.com&gco=54510b3b816269000061a0f7&stid=542d2c1615e3c013de53a6e2&glat=0&glong=0&bip4=3232238090&ext_siid=5ea89200c865f911007f1b0e&ext_pid=1&ext_sid=5ea84df8c865f911007f1ade&ext_plid=5ea9601ac865f911007f1b6a&optv=latest:latest&invsrc=5e722ee9bd6df11d063a8013&ug=0d&ca=0&biid=requestd-54644474bf-l7gx4|eu-central-1-staging®=eu-central-1&pixel=1&ck=1_c343bf14]]></VASTAdTagURI><Impression><![CDATA[http://ads.staging.avct.cloud/sv?pp=${AUCTION_PRICE}&uuid=0df2c449-6d85-4179-b5d5-37f2f91caa24&ty=h&crid=5ec530e32d57fe1100f17d87&tacid=5ec531d32d57fe1100f17d89&aid=749d36d7-c993-455f-aefd-ffd8a7e3ccf_0&accid=5b51dd1634f2021f127ff7c0&brid=5b51e20f34f2021f127ff7c4&ioid=5b51e22089654741306813a1&caid=5b51e2d689654741306813a4&it=2&iobsid=496e8cff35b2c0110029534d&ext_aid=749d36d7-c993-455f-aefd-ffd8a7e3ccf_0&bp=15.64434783&bt=1591875033134290518&h=396&w=600&vpr=0&vdp=0&domain=example.com&gco=54510b3b816269000061a0f7&stid=542d2c1615e3c013de53a6e2&glat=0&glong=0&bip4=3232238090&ext_siid=5ea89200c865f911007f1b0e&ext_pid=1&ext_sid=5ea84df8c865f911007f1ade&ext_plid=5ea9601ac865f911007f1b6a&optv=latest:latest&invsrc=5e722ee9bd6df11d063a8013&ug=0d&ca=0&biid=requestd-54644474bf-l7gx4|eu-central-1-staging®=eu-central-1&pixel=1&ck=1_c343bf14]]></Impression><Creatives><Creative AdId=\"5ec530e32d57fe1100f17d87\"><Linear><TrackingEvents></TrackingEvents><VideoClicks></VideoClicks></Linear></Creative></Creatives></Wrapper></Ad></VAST>", 273 ADomain: []string{"avocet.io"}, 274 CID: "5b51e2d689654741306813a4", 275 CrID: "5ec530e32d57fe1100f17d87", 276 H: 396, 277 ID: "3d4c2d45-5a8c-43b8-9e15-4f48ac45204f", 278 ImpID: "dfp-ad--top-above-nav", 279 IURL: "https://cdn.staging.avocet.io/snapshots/5b51dd1634f2021f127ff7c0/5ec530e32d57fe1100f17d87.jpeg", 280 Language: "en", 281 Price: 15.64434783, 282 W: 600, 283 Ext: []byte(`{"avocet":{"duration":30}}`), 284 } 285 286 var validVideoBidResponseBody = []byte(`{ 287 "bidid": "dd87f80c-16a0-43c8-a673-b94b3ea4d417", 288 "id": "test-request-id", 289 "seatbid": [ 290 { 291 "bid": [ 292 { 293 "adm": "<VAST version=\"3.0\"><Ad id=\"5ec530e32d57fe1100f17d87\"><Wrapper><AdSystem>Avocet</AdSystem><VASTAdTagURI><![CDATA[http://ads.staging.avct.cloud/vast?x=1&uuid=0df2c449-6d85-4179-b5d5-37f2f91caa24&ty=h&crid=5ec530e32d57fe1100f17d87&tacid=5ec531d32d57fe1100f17d89&aid=749d36d7-c993-455f-aefd-ffd8a7e3ccf_0&accid=5b51dd1634f2021f127ff7c0&brid=5b51e20f34f2021f127ff7c4&ioid=5b51e22089654741306813a1&caid=5b51e2d689654741306813a4&it=2&iobsid=496e8cff35b2c0110029534d&ext_aid=749d36d7-c993-455f-aefd-ffd8a7e3ccf_0&bp=15.64434783&bt=1591875033134290518&h=396&w=600&vpr=0&vdp=0&domain=example.com&gco=54510b3b816269000061a0f7&stid=542d2c1615e3c013de53a6e2&glat=0&glong=0&bip4=3232238090&ext_siid=5ea89200c865f911007f1b0e&ext_pid=1&ext_sid=5ea84df8c865f911007f1ade&ext_plid=5ea9601ac865f911007f1b6a&optv=latest:latest&invsrc=5e722ee9bd6df11d063a8013&ug=0d&ca=0&biid=requestd-54644474bf-l7gx4|eu-central-1-staging®=eu-central-1&pixel=1&ck=1_c343bf14]]></VASTAdTagURI><Impression><![CDATA[http://ads.staging.avct.cloud/sv?pp=${AUCTION_PRICE}&uuid=0df2c449-6d85-4179-b5d5-37f2f91caa24&ty=h&crid=5ec530e32d57fe1100f17d87&tacid=5ec531d32d57fe1100f17d89&aid=749d36d7-c993-455f-aefd-ffd8a7e3ccf_0&accid=5b51dd1634f2021f127ff7c0&brid=5b51e20f34f2021f127ff7c4&ioid=5b51e22089654741306813a1&caid=5b51e2d689654741306813a4&it=2&iobsid=496e8cff35b2c0110029534d&ext_aid=749d36d7-c993-455f-aefd-ffd8a7e3ccf_0&bp=15.64434783&bt=1591875033134290518&h=396&w=600&vpr=0&vdp=0&domain=example.com&gco=54510b3b816269000061a0f7&stid=542d2c1615e3c013de53a6e2&glat=0&glong=0&bip4=3232238090&ext_siid=5ea89200c865f911007f1b0e&ext_pid=1&ext_sid=5ea84df8c865f911007f1ade&ext_plid=5ea9601ac865f911007f1b6a&optv=latest:latest&invsrc=5e722ee9bd6df11d063a8013&ug=0d&ca=0&biid=requestd-54644474bf-l7gx4|eu-central-1-staging®=eu-central-1&pixel=1&ck=1_c343bf14]]></Impression><Creatives><Creative AdId=\"5ec530e32d57fe1100f17d87\"><Linear><TrackingEvents></TrackingEvents><VideoClicks></VideoClicks></Linear></Creative></Creatives></Wrapper></Ad></VAST>", 294 "adomain": ["avocet.io"], 295 "cid": "5b51e2d689654741306813a4", 296 "crid": "5ec530e32d57fe1100f17d87", 297 "h": 396, 298 "id": "3d4c2d45-5a8c-43b8-9e15-4f48ac45204f", 299 "impid": "dfp-ad--top-above-nav", 300 "iurl": "https://cdn.staging.avocet.io/snapshots/5b51dd1634f2021f127ff7c0/5ec530e32d57fe1100f17d87.jpeg", 301 "language": "en", 302 "price": 15.64434783, 303 "w": 600, 304 "ext": {"avocet":{"duration":30}} 305 } 306 ], 307 "seat": "TEST_SEAT_ID" 308 } 309 ] 310 }`)