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&reg=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&reg=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&reg=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&reg=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&reg=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&reg=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  }`)