Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

New Adapter: Zentotem #4053

Open
wants to merge 26 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
9aef1ae
zentotem: add adapter
GermanBogatov Jul 2, 2024
6fdcc11
zentotem: add adapter
GermanBogatov Jul 10, 2024
3edd765
zentotem: add adapter
GermanBogatov Jul 11, 2024
9ec095a
zentotem: add adapter
GermanBogatov Jul 12, 2024
a7d9462
zentotem: add adapter
GermanBogatov Jul 30, 2024
36a4b0f
zentotem: add adapter
GermanBogatov Jul 30, 2024
9c6b5e3
zentotem: add adapter
GermanBogatov Aug 1, 2024
b3caeaa
Merge branch 'prebid:master' into master
zentotem Aug 16, 2024
153ebf5
zentotem: add adapter
GermanBogatov Aug 20, 2024
f075a67
Merge remote-tracking branch 'origin/master'
GermanBogatov Aug 20, 2024
6f3f47c
zentotem: add adapter
GermanBogatov Aug 20, 2024
536f118
zentotem: fix after review
GermanBogatov Aug 22, 2024
b5cb591
zentotem: fix after review
GermanBogatov Aug 22, 2024
573c59e
zentotem: add adapter
GermanBogatov Jul 2, 2024
f8ee4ed
zentotem: add adapter
GermanBogatov Jul 10, 2024
4bee7d9
zentotem: add adapter
GermanBogatov Jul 11, 2024
5cb43d2
zentotem: add adapter
GermanBogatov Jul 12, 2024
b6bc533
zentotem: add adapter
GermanBogatov Jul 30, 2024
39567ab
zentotem: add adapter
GermanBogatov Jul 30, 2024
93e3969
zentotem: add adapter
GermanBogatov Aug 1, 2024
bd22820
zentotem: add adapter
GermanBogatov Aug 20, 2024
2b0b9b1
zentotem: add adapter
GermanBogatov Aug 20, 2024
7a2144a
zentotem: fix after review
GermanBogatov Aug 22, 2024
d4290d3
zentotem: fix after review
GermanBogatov Aug 22, 2024
764f48a
zentotem: replace v2 to v3
GermanBogatov Nov 13, 2024
dc73050
Merge remote-tracking branch 'origin/master'
GermanBogatov Nov 13, 2024
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
45 changes: 45 additions & 0 deletions adapters/zentotem/params_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
package zentotem

import (
"encoding/json"
"github.com/prebid/prebid-server/v3/openrtb_ext"
"testing"
)

//Zentotem doesn't currently require any custom fields. This file is included for conformity only
//We do include an unused, non-required custom param in static/bidder-params/zentotem.json, but only to hinder the prebid server from crashing by looking for at least 1 custom param

// This file actually intends to test static/bidder-params/zentotem.json
//
// These also validate the format of the external API: request.imp[i].ext.prebid.bidder.zentotem
// TestValidParams makes sure that the Zentotem 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.BidderZentotem, json.RawMessage(validParam)); err != nil {
t.Errorf("Schema rejected Zentotem params: %s", validParam)
}
}
}

// TestInvalidParams makes sure that the Zentotem 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.BidderZentotem, json.RawMessage(invalidParam)); err == nil {
t.Errorf("Schema allowed unexpected params: %s", invalidParam)
}
}
}

var validParams = []string{}

var invalidParams = []string{}
93 changes: 93 additions & 0 deletions adapters/zentotem/zentotem.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,93 @@
package zentotem

import (
"encoding/json"
"fmt"
"github.com/prebid/openrtb/v20/openrtb2"
"github.com/prebid/prebid-server/v3/adapters"
"github.com/prebid/prebid-server/v3/config"
"github.com/prebid/prebid-server/v3/openrtb_ext"
)

type adapter struct {
endpoint string
}

// Builder builds a new instance of the {bidder} adapter for the given bidder with the given config.
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, requestInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) {
requests := make([]*adapters.RequestData, 0, len(request.Imp))
var errors []error

requestCopy := *request
for _, imp := range request.Imp {
requestCopy.Imp = []openrtb2.Imp{imp}

requestJSON, err := json.Marshal(request)
if err != nil {
errors = append(errors, err)
continue
}

requestData := &adapters.RequestData{
Method: "POST",
Uri: a.endpoint,
Body: requestJSON,
ImpIDs: []string{imp.ID},
}
requests = append(requests, requestData)
}
return requests, errors
}

func getMediaTypeForBid(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
}

return "", fmt.Errorf("could not define media type for impression: %s", bid.ImpID)
}

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))
bidResponse.Currency = response.Cur
var errors []error
for _, seatBid := range response.SeatBid {
for i := range seatBid.Bid {
bidType, err := getMediaTypeForBid(seatBid.Bid[i])
if err != nil {
errors = append(errors, err)
continue
}

bidResponse.Bids = append(bidResponse.Bids, &adapters.TypedBid{
Bid: &seatBid.Bid[i],
BidType: bidType,
})
}
}
return bidResponse, nil
}
71 changes: 71 additions & 0 deletions adapters/zentotem/zentotem_test.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,71 @@
package zentotem

import (
"github.com/prebid/openrtb/v20/openrtb2"
"github.com/prebid/prebid-server/v3/adapters/adapterstest"
"github.com/prebid/prebid-server/v3/config"
"github.com/prebid/prebid-server/v3/openrtb_ext"
"github.com/stretchr/testify/assert"
"testing"
)

func TestJsonSamples(t *testing.T) {
bidder, buildErr := Builder(openrtb_ext.BidderZentotem, config.Adapter{
Endpoint: "https://rtb.zentotem.net/bid?sspuid=cqlnvfk00bhs0b6rci6g"}, config.Server{ExternalUrl: "http://hosturl.com", GvlID: 1, DataCenter: "2"})

if buildErr != nil {
t.Fatalf("Builder returned unexpected error %v", buildErr)
}

adapterstest.RunJSONBidderTest(t, "zentotemtest", bidder)
}

func TestGetMediaTypeForBid(t *testing.T) {
tests := []struct {
name string
bid openrtb2.Bid
wantType openrtb_ext.BidType
wantErr bool
}{
{
name: "get bid native type",
bid: openrtb2.Bid{
MType: 4,
},
wantType: openrtb_ext.BidTypeNative,
wantErr: false,
},
{
name: "get bid banner type",
bid: openrtb2.Bid{
MType: 1,
},
wantType: openrtb_ext.BidTypeBanner,
wantErr: false,
},
{
name: "get bid video type",
bid: openrtb2.Bid{
MType: 2,
},
wantType: openrtb_ext.BidTypeVideo,
wantErr: false,
},
{
name: "fail",
wantType: "",
wantErr: true,
},
}

for _, tt := range tests {
t.Run(tt.name, func(t *testing.T) {
bType, err := getMediaTypeForBid(tt.bid)
if (err != nil) != tt.wantErr {
t.Errorf("getMediaTypeForBid error = %v, wantErr %v", err, tt.wantErr)
}

assert.Equal(t, bType, tt.wantType)
})
}
}
Loading
Loading