From a372402b10940fd4ede80911366295c78ea7efa4 Mon Sep 17 00:00:00 2001 From: Thomas Sormonte Date: Wed, 1 Oct 2025 15:27:40 +0200 Subject: [PATCH 1/7] Sparteo: add required query params to adapter endpoint # Conflicts: # macros/macros.go # Conflicts: # adapters/sparteo/sparteo.go # adapters/sparteo/sparteo_test.go # static/bidder-info/sparteo.yaml --- adapters/sparteo/sparteo.go | 241 ++++-- adapters/sparteo/sparteo_test.go | 751 +++++++++++++++++- .../sparteotest/exemplary/banner-app.json | 242 ++++++ .../sparteo/sparteotest/exemplary/banner.json | 22 +- .../sparteo/sparteotest/exemplary/native.json | 22 +- .../sparteo/sparteotest/exemplary/video.json | 22 +- .../supplemental/filter-empty-seat-bids.json | 19 +- .../supplemental/filter-invalid-bid-type.json | 19 +- .../supplemental/filter-no-seat-bids.json | 19 +- .../supplemental/invalid-bidder-ext.json | 61 -- .../supplemental/invalid-json-response.json | 19 +- .../supplemental/invalid-publisher-ext.json | 18 +- .../sparteotest/supplemental/status_204.json | 19 +- .../sparteotest/supplemental/status_400.json | 19 +- .../sparteotest/supplemental/status_500.json | 19 +- macros/macros.go | 4 + static/bidder-info/sparteo.yaml | 4 +- 17 files changed, 1336 insertions(+), 184 deletions(-) create mode 100644 adapters/sparteo/sparteotest/exemplary/banner-app.json delete mode 100644 adapters/sparteo/sparteotest/supplemental/invalid-bidder-ext.json diff --git a/adapters/sparteo/sparteo.go b/adapters/sparteo/sparteo.go index 0653e2c4d7e..0f15e3f6aff 100644 --- a/adapters/sparteo/sparteo.go +++ b/adapters/sparteo/sparteo.go @@ -3,6 +3,9 @@ package sparteo import ( "fmt" "net/http" + "net/url" + "strings" + "text/template" "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/prebid-server/v4/adapters" @@ -13,19 +16,25 @@ import ( ) type adapter struct { - endpoint string - bidderName string + endpoint *template.Template } type extBidWrapper struct { Prebid openrtb_ext.ExtBidPrebid `json:"prebid"` } +const unknownValue = "unknown" + func Builder(bidderName openrtb_ext.BidderName, cfg config.Adapter, server config.Server) (adapters.Bidder, error) { - return &adapter{ - endpoint: cfg.Endpoint, - bidderName: string(bidderName), - }, nil + template, err := template.New("endpointTemplate").Parse(cfg.Endpoint) + if err != nil { + return nil, fmt.Errorf("unable to parse endpoint url template: %v", err) + } + + bidder := &adapter{ + endpoint: template, + } + return bidder, nil } func parseExt(imp *openrtb2.Imp) (*openrtb_ext.ExtImpSparteo, error) { @@ -47,6 +56,7 @@ func parseExt(imp *openrtb2.Imp) (*openrtb_ext.ExtImpSparteo, error) { func (a *adapter) MakeRequests(req *openrtb2.BidRequest, reqInfo *adapters.ExtraRequestInfo) ([]*adapters.RequestData, []error) { request := *req + var errs []error request.Imp = make([]openrtb2.Imp, len(req.Imp)) copy(request.Imp, req.Imp) @@ -54,25 +64,53 @@ func (a *adapter) MakeRequests(req *openrtb2.BidRequest, reqInfo *adapters.Extra if req.Site != nil { siteCopy := *req.Site request.Site = &siteCopy + if req.Site.Publisher != nil { + pubCopy := *req.Site.Publisher + request.Site.Publisher = &pubCopy + } } - - if req.Site != nil && req.Site.Publisher != nil { - publisherCopy := *req.Site.Publisher - request.Site.Publisher = &publisherCopy + if req.App != nil { + appCopy := *req.App + request.App = &appCopy + if req.App.Publisher != nil { + pubCopy := *req.App.Publisher + request.App.Publisher = &pubCopy + } } - var errs []error - var siteNetworkId string + var siteDomain, appDomain, bundle string + if request.Site != nil { + if sd := resolveSiteDomain(request.Site); sd != nil { + siteDomain = *sd + if siteDomain == unknownValue { + errs = append(errs, &errortypes.BadInput{ + Message: "Domain not found. Missing the site.domain or the site.page field", + }) + } + } + } else if request.App != nil { + if ad := resolveAppDomain(request.App); ad != nil { + appDomain = *ad + } + if b := resolveBundle(request.App); b != nil { + bundle = *b + if bundle == unknownValue { + errs = append(errs, &errortypes.BadInput{ + Message: "Bundle not found. Missing the app.bundle field.", + }) + } + } + } + var networkID string for i, imp := range request.Imp { extImpSparteo, err := parseExt(&imp) if err != nil { errs = append(errs, err) continue } - - if siteNetworkId == "" && extImpSparteo.NetworkId != "" { - siteNetworkId = extImpSparteo.NetworkId + if networkID == "" && extImpSparteo.NetworkId != "" { + networkID = extImpSparteo.NetworkId } var extMap map[string]interface{} @@ -93,12 +131,10 @@ func (a *adapter) MakeRequests(req *openrtb2.BidRequest, reqInfo *adapters.Extra sparteoMap["params"] = paramsMap } - bidderObj, ok := extMap["bidder"].(map[string]interface{}) - if ok { + if bidderObj, ok := extMap["bidder"].(map[string]interface{}); ok { delete(extMap, "bidder") - - for key, value := range bidderObj { - paramsMap[key] = value + for k, v := range bidderObj { + paramsMap[k] = v } } @@ -107,40 +143,29 @@ func (a *adapter) MakeRequests(req *openrtb2.BidRequest, reqInfo *adapters.Extra errs = append(errs, fmt.Errorf("ignoring imp id=%s, error while marshaling updated ext, err: %s", imp.ID, err)) continue } - request.Imp[i].Ext = updatedExt } - if request.Site != nil && request.Site.Publisher != nil && siteNetworkId != "" { - var pubExt map[string]interface{} - if request.Site.Publisher.Ext != nil { - if err := jsonutil.Unmarshal(request.Site.Publisher.Ext, &pubExt); err != nil { - pubExt = make(map[string]interface{}) - } - } else { - pubExt = make(map[string]interface{}) - } - - var paramsMap map[string]interface{} - if raw, ok := pubExt["params"]; ok { - if paramsMap, ok = raw.(map[string]interface{}); !ok { - paramsMap = make(map[string]interface{}) - } - } else { - paramsMap = make(map[string]interface{}) - } - - paramsMap["networkId"] = siteNetworkId - pubExt["params"] = paramsMap + var pub *openrtb2.Publisher + var pubExt string + + if request.Site != nil { + pub = ensurePublisher(&request.Site.Publisher) + pubExt = "site.publisher.ext" + } else if request.App != nil { + pub = ensurePublisher(&request.App.Publisher) + pubExt = "app.publisher.ext" + } else { + request.Site = &openrtb2.Site{} + pub = ensurePublisher(&request.Site.Publisher) + pubExt = "site.publisher.ext" + } - updatedPubExt, err := jsonutil.Marshal(pubExt) - if err != nil { - errs = append(errs, &errortypes.BadInput{ - Message: fmt.Sprintf("Error marshaling site.publisher.ext: %s", err), - }) - } else { - request.Site.Publisher.Ext = jsonutil.RawMessage(updatedPubExt) - } + ext, err := updatePublisherExtension(&pub.Ext, networkID, pubExt) + if err != nil { + errs = append(errs, err) + } else { + pub.Ext = ext } body, err := jsonutil.Marshal(request) @@ -149,9 +174,14 @@ func (a *adapter) MakeRequests(req *openrtb2.BidRequest, reqInfo *adapters.Extra return nil, errs } + uri, err := a.buildEndpointURL(networkID, siteDomain, appDomain, bundle) + if err != nil { + return nil, []error{err} + } + requestData := &adapters.RequestData{ Method: http.MethodPost, - Uri: a.endpoint, + Uri: uri, Body: body, ImpIDs: openrtb_ext.GetImpIDs(request.Imp), Headers: http.Header{ @@ -162,6 +192,115 @@ func (a *adapter) MakeRequests(req *openrtb2.BidRequest, reqInfo *adapters.Extra return []*adapters.RequestData{requestData}, errs } +func normalizeHostname(host string) string { + host = strings.TrimSpace(host) + if host == "" { + return "" + } + + u, err := url.Parse(host) + if err != nil || u.Hostname() == "" { + if i := strings.Index(host, ":"); i >= 0 { + host = host[:i] + } else if i := strings.Index(host, "/"); i >= 0 { + host = host[:i] + } + } else { + host = u.Hostname() + } + + host = strings.ToLower(host) + host = strings.TrimSuffix(host, ".") + host = strings.TrimPrefix(host, "www.") + + if host == "null" { + return "" + } + return host +} + +func strPtr(s string) *string { return &s } + +func resolveSiteDomain(site *openrtb2.Site) *string { + if site != nil { + if d := normalizeHostname(site.Domain); d != "" { + return strPtr(d) + } + if fromPage := normalizeHostname(site.Page); fromPage != "" { + return strPtr(fromPage) + } + return strPtr(unknownValue) + } + return nil +} + +func resolveAppDomain(app *openrtb2.App) *string { + if app != nil { + if d := normalizeHostname(app.Domain); d != "" { + return strPtr(d) + } + return strPtr(unknownValue) + } + return nil +} + +func resolveBundle(app *openrtb2.App) *string { + if app == nil { + return nil + } + + raw := app.Bundle + if strings.TrimSpace(raw) == "" { + return strPtr(unknownValue) + } + + b := strings.TrimSpace(raw) + if strings.EqualFold(b, "null") { + return strPtr(unknownValue) + } + + return strPtr(b) +} + +func ensurePublisher(p **openrtb2.Publisher) *openrtb2.Publisher { + if *p == nil { + *p = &openrtb2.Publisher{} + } + + return *p +} + +func updatePublisherExtension(targetExt *jsonutil.RawMessage, networkID, fieldPath string) ([]byte, error) { + var pubExt map[string]interface{} + if *targetExt != nil { + if err := jsonutil.Unmarshal(*targetExt, &pubExt); err != nil { + pubExt = make(map[string]interface{}) + } + } else { + pubExt = make(map[string]interface{}) + } + + params, ok := pubExt["params"].(map[string]interface{}) + if !ok { + params = make(map[string]interface{}) + pubExt["params"] = params + } + params["networkId"] = networkID + + updated, err := jsonutil.Marshal(pubExt) + if err != nil { + return nil, &errortypes.BadInput{ + Message: fmt.Sprintf("Error marshaling %s: %s", fieldPath, err), + } + } + return updated, nil +} + +func (a *adapter) buildEndpointURL(networkId string, siteDomain string, appDomain string, bundle string) (string, error) { + endpointParams := macros.EndpointTemplateParams{NetworkId: networkId, SiteDomain: siteDomain, AppDomain: appDomain, Bundle: bundle} + return macros.ResolveMacros(a.endpoint, endpointParams) +} + func (a *adapter) MakeBids(req *openrtb2.BidRequest, reqData *adapters.RequestData, respData *adapters.ResponseData) (*adapters.BidderResponse, []error) { if adapters.IsResponseStatusCodeNoContent(respData) { return nil, nil diff --git a/adapters/sparteo/sparteo_test.go b/adapters/sparteo/sparteo_test.go index 8e9524dabd6..fc054545199 100644 --- a/adapters/sparteo/sparteo_test.go +++ b/adapters/sparteo/sparteo_test.go @@ -1,7 +1,9 @@ package sparteo import ( + "bytes" "encoding/json" + "errors" "testing" "github.com/prebid/openrtb/v20/openrtb2" @@ -12,26 +14,48 @@ import ( "github.com/stretchr/testify/require" ) -// TestBuilder verifies that the Builder function correctly creates a bidder instance. -// It checks for errors, ensures the returned bidder is not nil, and confirms that the endpoint -// in the adapter is set according to the configuration. +// TestBuilder verifies that the Builder function correctly creates a bidder instance +// and that the endpoint template renders fields using the new macros. func TestBuilder(t *testing.T) { - cfg := config.Adapter{Endpoint: "https://bid-test.sparteo.com/s2s-auction"} + cfg := config.Adapter{ + Endpoint: "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}", + } bidder, err := Builder(openrtb_ext.BidderSparteo, cfg, config.Server{GvlID: 1028}) - require.NoError(t, err, "Builder returned an error") assert.NotNil(t, bidder, "Bidder is nil") sparteoAdapter, ok := bidder.(*adapter) require.True(t, ok, "Expected *adapter, got %T", bidder) - assert.Equal(t, "https://bid-test.sparteo.com/s2s-auction", sparteoAdapter.endpoint, "Endpoint is not correctly set") + var endpointBuffer bytes.Buffer + templateData := struct { + NetworkId string + SiteDomain string + AppDomain string + Bundle string + }{ + NetworkId: "networkID", + SiteDomain: "dev.sparteo.com", + AppDomain: "", + Bundle: "com.sparteo.app", + } + err = sparteoAdapter.endpoint.Execute(&endpointBuffer, templateData) + require.NoError(t, err) + expectedEndpoint := "https://bid-test.sparteo.com/s2s-auction?network_id=networkID&site_domain=dev.sparteo.com&bundle=com.sparteo.app" + assert.Equal(t, expectedEndpoint, endpointBuffer.String(), "Endpoint is not correctly set") +} + +// TestEndpointTemplateMalformed verifies that the Builder returns an error when the endpoint template is malformed. +func TestEndpointTemplateMalformed(t *testing.T) { + _, buildErr := Builder(openrtb_ext.BidderSmrtconnect, config.Adapter{ + Endpoint: "{{Malformed}}"}, config.Server{ExternalUrl: "http://bid-test.sparteo.com.com", GvlID: 196}) + assert.Error(t, buildErr) } // TestJsonSamples runs JSON sample tests using the shared adapterstest framework. func TestJsonSamples(t *testing.T) { bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{ - Endpoint: "https://bid-test.sparteo.com/s2s-auction", + Endpoint: "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}", }, config.Server{GvlID: 1028}) require.NoError(t, err, "Builder returned an error") @@ -73,3 +97,716 @@ func TestGetMediaType_NilExt(t *testing.T) { assert.Error(t, err, "Expected error for nil extension") assert.Equal(t, openrtb_ext.BidType(""), result, "Expected empty result for nil extension") } + +// TestMakeRequests_ResolvesMacros verifies that the adapter correctly resolves macros in the endpoint URL for Site traffic. +func TestMakeRequests_ResolvesMacros(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{ + Endpoint: endpoint, + }, config.Server{GvlID: 1028}) + require.NoError(t, err, "Builder returned an error") + + in := &openrtb2.BidRequest{ + ID: "req-qp-1", + Site: &openrtb2.Site{ + Domain: "dev.sparteo.com", + }, + Imp: []openrtb2.Imp{ + { + ID: "imp-1", + Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`), + }, + }, + } + + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1, "Expected exactly one outgoing request") + assert.Empty(t, errs, "Unexpected adapter errors") + + expectedURI := "https://bid-test.sparteo.com/s2s-auction?network_id=networkID&site_domain=dev.sparteo.com" + assert.Equal(t, expectedURI, reqs[0].Uri) +} + +// TestMakeRequests_AppBundleMacro verifies that the adapter correctly resolves app_domain and bundle for App traffic. +func TestMakeRequests_AppBundleMacro(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + ID: "req-app-bundle-1", + App: &openrtb2.App{ + Domain: "dev.sparteo.com", + Bundle: "com.sparteo.app", + Publisher: &openrtb2.Publisher{ + ID: "sparteo", + }, + }, + Imp: []openrtb2.Imp{{ + ID: "imp-1", + Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`), + }}, + } + + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + assert.Empty(t, errs) + + expected := "https://bid-test.sparteo.com/s2s-auction?network_id=networkID&app_domain=dev.sparteo.com&bundle=com.sparteo.app" + assert.Equal(t, expected, reqs[0].Uri, "endpoint should include app_domain and bundle for App traffic") +} + +// TestMakeRequests_AppBundleMissing_AppendsUnknown verifies that when app.bundle is empty or missing we send bundle=unknown (and warn). +func TestMakeRequests_AppBundleMissing_AppendsUnknown(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + ID: "req-app-nobundle-1", + App: &openrtb2.App{ + Domain: "dev.sparteo.com", + Publisher: &openrtb2.Publisher{ID: "sparteo"}, + }, + Imp: []openrtb2.Imp{{ + ID: "imp-1", + Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`), + }}, + } + + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Len(t, errs, 1) + + expected := "https://bid-test.sparteo.com/s2s-auction?network_id=networkID&app_domain=dev.sparteo.com&bundle=unknown" + assert.Equal(t, expected, reqs[0].Uri, "endpoint should contain bundle=unknown when app.bundle is empty") +} + +// TestMakeRequests_SiteDomain verifies that the adapter uses site.Domain and does not include app fields for Site traffic. +func TestMakeRequests_SiteDomain(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{ + Endpoint: endpoint, + }, config.Server{GvlID: 1028}) + require.NoError(t, err, "Builder returned an error") + + in := &openrtb2.BidRequest{ + ID: "req-fallback-1", + Site: &openrtb2.Site{ + Domain: "dev.sparteo.com", + }, + Imp: []openrtb2.Imp{ + { + ID: "imp-1", + Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`), + }, + }, + } + + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1, "Expected exactly one outgoing request") + assert.Empty(t, errs, "Unexpected adapter errors") + + expectedURI := "https://bid-test.sparteo.com/s2s-auction?network_id=networkID&site_domain=dev.sparteo.com" + assert.Equal(t, expectedURI, reqs[0].Uri) +} + +// TestMakeRequests_DomainPrecedence_SiteDomainWins verifies that Site wins over App when both exist. +func TestMakeRequests_DomainPrecedence_SiteDomainWins(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + ID: "req-domain-1", + Site: &openrtb2.Site{ + Domain: "site.sparteo.com", + Publisher: &openrtb2.Publisher{ + Domain: "site-pub.sparteo.com", + }, + }, + App: &openrtb2.App{ + Domain: "app.sparteo.com", + Publisher: &openrtb2.Publisher{ + Domain: "app-pub.should-not-be-used", + }, + }, + Imp: []openrtb2.Imp{ + {ID: "imp-1", Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`)}, + }, + } + + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Empty(t, errs) + + assert.Equal(t, + "https://bid-test.sparteo.com/s2s-auction?network_id=networkID&site_domain=site.sparteo.com", + reqs[0].Uri, + ) +} + +// TestMakeRequests_SitePresentWithEmptyDomain_UsesUnknownNotApp verifies that when Site exists but has no domain/page, we send site_domain=unknown and do NOT use App. +func TestMakeRequests_SitePresentWithEmptyDomain_UsesUnknownNotApp(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + ID: "req-domain-2", + Site: &openrtb2.Site{ + Domain: "", + Publisher: &openrtb2.Publisher{ + Domain: "dev.sparteo.com", + }, + }, + App: &openrtb2.App{ + Domain: "app.sparteo.com", + }, + Imp: []openrtb2.Imp{ + {ID: "imp-1", Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`)}, + }, + } + + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Len(t, errs, 1) + + assert.Equal(t, + "https://bid-test.sparteo.com/s2s-auction?network_id=networkID&site_domain=unknown", + reqs[0].Uri, + ) +} + +// TestMakeRequests_DomainPrecedence_AppDomainWhenNoSite verifies that if there is no Site, we use app.domain (and include bundle if present). +func TestMakeRequests_DomainPrecedence_AppDomainWhenNoSite(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + ID: "req-domain-3", + Site: nil, + App: &openrtb2.App{ + Domain: "app.sparteo.com", + Bundle: "com.sparteo.app", + Publisher: &openrtb2.Publisher{ + Domain: "app-pub.should-not-be-used", + }, + }, + Imp: []openrtb2.Imp{ + {ID: "imp-1", Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`)}, + }, + } + + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Empty(t, errs) + + assert.Equal(t, + "https://bid-test.sparteo.com/s2s-auction?network_id=networkID&app_domain=app.sparteo.com&bundle=com.sparteo.app", + reqs[0].Uri, + ) +} + +// TestMakeRequests_SitePageWhenNoSiteDomainNoApp verifies that if there is Site without domain but page is present, we use site.page. +func TestMakeRequests_SitePageWhenNoSiteDomainNoApp(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + ID: "req-domain-page", + Site: &openrtb2.Site{ + Domain: "", + Page: "https://www.dev.sparteo.com:3000/some/path?x=1", + }, + App: nil, + Imp: []openrtb2.Imp{ + {ID: "imp-1", Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`)}, + }, + } + + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Empty(t, errs) + + assert.Equal(t, + "https://bid-test.sparteo.com/s2s-auction?network_id=networkID&site_domain=dev.sparteo.com", + reqs[0].Uri, + ) +} + +// TestNormalizeHostname_PortAndPathAndURL verifies normalizeHostname behavior. +func TestNormalizeHostname_PortAndPathAndURL(t *testing.T) { + base := "dev.sparteo.com" + + tests := []struct { + name string + in string + out string + }{ + // Bare host + port + {"host_with_port", "www." + base + ":8080", base}, + {"host_upper_with_tls_port", "DEV.SPARTEO.COM:443", base}, + {"host_trailing_dot_with_port", base + ".:8443", base}, + + // Bare host + path + {"host_with_path", base + "/some/path?x=1", base}, + {"www_host_with_path", "www." + base + "/p", base}, + + // Bare host + port + path + {"host_with_port_and_path", base + ":8080/p?q=1", base}, + {"www_host_with_port_and_path", "www." + base + ":3000/some/path", base}, + + // Absolute URLs + {"https_url", "https://www." + base + "/x", base}, + {"http_url_with_port", "http://WWW." + base + ":8080/abc", base}, + + // Scheme-relative URL + {"scheme_relative", "//www." + base + "/x", base}, + + // Odd spacing around URLs/hosts + {"spaced_https_url", " https://www." + base + ":3000/x ", base}, + } + + for _, tc := range tests { + t.Run(tc.name, func(t *testing.T) { + got := normalizeHostname(tc.in) + assert.Equal(t, tc.out, got) + }) + } +} + +// --- Helper for reading publisher.ext.params.networkId in output JSON --- +func readNetworkIDFromPublisherExt(t *testing.T, ext json.RawMessage) (string, bool) { + if len(ext) == 0 { + return "", false + } + var m map[string]interface{} + require.NoError(t, json.Unmarshal(ext, &m)) + params, _ := m["params"].(map[string]interface{}) + if params == nil { + return "", false + } + val, _ := params["networkId"].(string) + if val == "" { + return "", false + } + return val, true +} + +// When site exists but site.publisher is nil, the adapter must create publisher and upsert networkId into site.publisher.ext +func TestMakeRequests_UpdatePublisherExtension_CreatesSitePublisherIfMissing(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + ID: "req-upsert-site", + Site: &openrtb2.Site{ + Domain: "site.sparteo.com", + Publisher: nil, + }, + Imp: []openrtb2.Imp{ + {ID: "imp-1", Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`)}, + }, + } + + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Empty(t, errs) + + var out openrtb2.BidRequest + require.NoError(t, json.Unmarshal(reqs[0].Body, &out)) + + require.NotNil(t, out.Site) + require.NotNil(t, out.Site.Publisher, "publisher should be created when missing") + val, ok := readNetworkIDFromPublisherExt(t, out.Site.Publisher.Ext) + require.True(t, ok, "site.publisher.ext.params.networkId should exist") + assert.Equal(t, "networkID", val) +} + +// When no site is present, create app.publisher if missing and upsert networkId into app.publisher.ext +func TestMakeRequests_UpdatePublisherExtension_CreatesAppPublisherIfMissingWhenNoSite(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + ID: "req-upsert-app", + Site: nil, + App: &openrtb2.App{ + Domain: "app.sparteo.com", + Bundle: "com.sparteo.app", + Publisher: nil, + }, + Imp: []openrtb2.Imp{ + {ID: "imp-1", Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`)}, + }, + } + + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Empty(t, errs) + + var out openrtb2.BidRequest + require.NoError(t, json.Unmarshal(reqs[0].Body, &out)) + + require.Nil(t, out.Site) + require.NotNil(t, out.App) + require.NotNil(t, out.App.Publisher, "app.publisher should be created when missing") + val, ok := readNetworkIDFromPublisherExt(t, out.App.Publisher.Ext) + require.True(t, ok, "app.publisher.ext.params.networkId should exist") + assert.Equal(t, "networkID", val) +} + +// TestMakeRequests_UpdatePublisherExtension_PrefersSiteOverApp verifies that we prefer Site when both Site and App exist; only Site should receive the networkId +func TestMakeRequests_UpdatePublisherExtension_PrefersSiteOverApp(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + ID: "req-upsert-prefer-site", + Site: &openrtb2.Site{ + Domain: "site.sparteo.com", + Publisher: &openrtb2.Publisher{}, + }, + App: &openrtb2.App{ + Domain: "app.sparteo.com", + Publisher: &openrtb2.Publisher{}, + }, + Imp: []openrtb2.Imp{ + {ID: "imp-1", Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`)}, + }, + } + + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Empty(t, errs) + + var out openrtb2.BidRequest + require.NoError(t, json.Unmarshal(reqs[0].Body, &out)) + + require.NotNil(t, out.Site) + require.NotNil(t, out.Site.Publisher) + siteVal, siteOk := readNetworkIDFromPublisherExt(t, out.Site.Publisher.Ext) + require.True(t, siteOk) + assert.Equal(t, "networkID", siteVal) + + if out.App != nil && out.App.Publisher != nil { + _, appOk := readNetworkIDFromPublisherExt(t, out.App.Publisher.Ext) + assert.False(t, appOk, "app.publisher.ext should not contain networkId when site exists") + } +} + +// TestMakeRequests_NoSiteNoApp_NoDomainParam_NoWarning verifies that with neither Site nor App we don't send domain params and produce no warnings. +func TestMakeRequests_NoSiteNoApp_NoDomainParam_NoWarning(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}" + + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + ID: "req-domain-missing", + Imp: []openrtb2.Imp{ + {ID: "imp-1", Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`)}, + }, + } + + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + + require.Len(t, reqs, 1) + require.Len(t, errs, 0) + + assert.Equal(t, + "https://bid-test.sparteo.com/s2s-auction?network_id=networkID", + reqs[0].Uri, + ) +} + +// TestMakeRequests_SitePageLiteralNull_TreatedAsMissingDomain verifies that a literal "null" in site.page is treated as an unknown site domain. +func TestMakeRequests_SitePageLiteralNull_TreatedAsMissingDomain(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}" + + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + ID: "req-page-null", + Site: &openrtb2.Site{ + Domain: "", + Page: "null", + }, + Imp: []openrtb2.Imp{ + {ID: "imp-1", Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`)}, + }, + } + + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + + require.Len(t, reqs, 1) + require.Len(t, errs, 1) + assert.Equal(t, + "https://bid-test.sparteo.com/s2s-auction?network_id=networkID&site_domain=unknown", + reqs[0].Uri, + ) + + var badInput *errortypes.BadInput + require.True(t, errors.As(errs[0], &badInput)) + assert.Contains(t, badInput.Error(), "Domain not found") +} + +// TestMakeRequests_AppBundle_NormalizationVariants ensures blank/whitespace/"null" bundles normalize to "unknown" with a single warning. +func TestMakeRequests_AppBundle_NormalizationVariants(t *testing.T) { + endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + cases := []struct { + name string + bundle string + }{ + {"empty", ""}, + {"spaces", " "}, + {"lower_null", "null"}, + {"weird_case", "NuLl"}, + } + for _, tc := range cases { + t.Run(tc.name, func(t *testing.T) { + in := &openrtb2.BidRequest{ + App: &openrtb2.App{Domain: "dev.sparteo.com", Bundle: tc.bundle, Publisher: &openrtb2.Publisher{}}, + Imp: []openrtb2.Imp{{ID: "i1", Ext: json.RawMessage(`{"bidder":{"networkId":"n"}}`)}}, + } + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Len(t, errs, 1) + assert.Contains(t, reqs[0].Uri, "app_domain=dev.sparteo.com") + assert.Contains(t, reqs[0].Uri, "bundle=unknown") + var badInput *errortypes.BadInput + require.True(t, errors.As(errs[0], &badInput)) + assert.Contains(t, badInput.Error(), "Bundle not found") + }) + } +} + +// TestMakeRequests_SitePresent_IgnoresAppFields ensures when Site is present, only site_domain is sent and app fields are ignored. +func TestMakeRequests_SitePresent_IgnoresAppFields(t *testing.T) { + endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + Site: &openrtb2.Site{Domain: "site.sparteo.com"}, + App: &openrtb2.App{Domain: "app.sparteo.com", Bundle: "com.app"}, + Imp: []openrtb2.Imp{{ID: "i1", Ext: json.RawMessage(`{"bidder":{"networkId":"N"}}`)}}, + } + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Empty(t, errs) + assert.Equal(t, "https://host/s2s?network_id=N&site_domain=site.sparteo.com", reqs[0].Uri) +} + +// TestMakeRequests_SiteWithPageFallback_IgnoresApp ensures Site.Page is used when Site.Domain is empty and App is ignored when Site exists. +func TestMakeRequests_SiteWithPageFallback_IgnoresApp(t *testing.T) { + endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + Site: &openrtb2.Site{Domain: "", Page: "https://www.example.com:8080/p"}, + App: &openrtb2.App{Domain: "app.sparteo.com", Bundle: "com.app"}, + Imp: []openrtb2.Imp{{ID: "i1", Ext: json.RawMessage(`{"bidder":{"networkId":"N"}}`)}}, + } + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Empty(t, errs) + assert.Equal(t, "https://host/s2s?network_id=N&site_domain=example.com", reqs[0].Uri) +} + +// TestMakeRequests_AppMissingBundle_WarnsAndUnknown ensures App with missing bundle yields bundle=unknown and one bundle warning. +func TestMakeRequests_AppMissingBundle_WarnsAndUnknown(t *testing.T) { + endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + App: &openrtb2.App{Domain: "dev.sparteo.com", Bundle: "", Publisher: &openrtb2.Publisher{}}, + Imp: []openrtb2.Imp{{ID: "i1", Ext: json.RawMessage(`{"bidder":{"networkId":"N"}}`)}}, + } + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Len(t, errs, 1) + assert.Equal(t, "https://host/s2s?network_id=N&app_domain=dev.sparteo.com&bundle=unknown", reqs[0].Uri) + var badInput *errortypes.BadInput + require.True(t, errors.As(errs[0], &badInput)) + assert.Contains(t, badInput.Error(), "Bundle not found") +} + +// TestMakeRequests_ExtRewrite_MovesBidderIntoSparteoParams verifies bidder object is moved under sparteo.params and bidder is removed. +func TestMakeRequests_ExtRewrite_MovesBidderIntoSparteoParams(t *testing.T) { + endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}" + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + Site: &openrtb2.Site{Domain: "dev.sparteo.com"}, + Imp: []openrtb2.Imp{{ID: "i1", Ext: json.RawMessage(`{"bidder":{"a":1}}`)}}, + } + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Empty(t, errs) + + var out openrtb2.BidRequest + require.NoError(t, json.Unmarshal(reqs[0].Body, &out)) + var ext map[string]any + require.NoError(t, json.Unmarshal(out.Imp[0].Ext, &ext)) + _, hasBidder := ext["bidder"] + assert.False(t, hasBidder) + sparteoNode, ok := ext["sparteo"].(map[string]any) + require.True(t, ok) + params, ok := sparteoNode["params"].(map[string]any) + require.True(t, ok) + assert.Equal(t, float64(1), params["a"]) +} + +// TestMakeRequests_ExtRewrite_PreservesExistingSparteoParams verifies existing sparteo.params keys are preserved when merging bidder fields. +func TestMakeRequests_ExtRewrite_PreservesExistingSparteoParams(t *testing.T) { + endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}" + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + Site: &openrtb2.Site{Domain: "dev.sparteo.com"}, + Imp: []openrtb2.Imp{{ + ID: "i1", + Ext: json.RawMessage(`{"sparteo":{"params":{"keep":true}},"bidder":{"add":42}}`), + }}, + } + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Empty(t, errs) + + var out openrtb2.BidRequest + require.NoError(t, json.Unmarshal(reqs[0].Body, &out)) + var ext map[string]any + require.NoError(t, json.Unmarshal(out.Imp[0].Ext, &ext)) + sparteoNode, ok := ext["sparteo"].(map[string]any) + require.True(t, ok) + params, ok := sparteoNode["params"].(map[string]any) + require.True(t, ok) + assert.Equal(t, true, params["keep"]) + assert.Equal(t, float64(42), params["add"]) +} + +// TestMakeRequests_NetworkId_FirstNonEmptyWins verifies the first non-empty networkId across imps is used. +func TestMakeRequests_NetworkId_FirstNonEmptyWins(t *testing.T) { + endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}" + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + Site: &openrtb2.Site{Domain: "dev.sparteo.com"}, + Imp: []openrtb2.Imp{ + {ID: "i1", Ext: json.RawMessage(`{"bidder":{"networkId":""}}`)}, + {ID: "i2", Ext: json.RawMessage(`{"bidder":{"networkId":"N2"}}`)}, + {ID: "i3", Ext: json.RawMessage(`{"bidder":{"networkId":"N3"}}`)}, + }, + } + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Empty(t, errs) + assert.Equal(t, "https://host/s2s?network_id=N2&site_domain=dev.sparteo.com", reqs[0].Uri) +} + +// TestMakeRequests_AllImpsBadExt_AggregatesErrors verifies a request is still built when all imps have bad ext and errors are aggregated. +func TestMakeRequests_AllImpsBadExt_AggregatesErrors(t *testing.T) { + endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}" + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + in := &openrtb2.BidRequest{ + Site: &openrtb2.Site{Domain: "dev.sparteo.com"}, + Imp: []openrtb2.Imp{ + {ID: "i1", Ext: json.RawMessage(`not-json`)}, + {ID: "i2", Ext: json.RawMessage(`{"bidder":}`)}, + }, + } + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Len(t, errs, 2) + assert.Equal(t, "https://host/s2s?network_id=&site_domain=dev.sparteo.com", reqs[0].Uri) +} + +// TestMakeRequests_UpdatePublisherExtension_PreservesOtherKeys verifies publisher.ext keeps existing keys while adding params.networkId. +func TestMakeRequests_UpdatePublisherExtension_PreservesOtherKeys(t *testing.T) { + endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}" + bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) + require.NoError(t, err) + + startExt := json.RawMessage(`{"params":{"foo":"bar"},"other":123}`) + in := &openrtb2.BidRequest{ + Site: &openrtb2.Site{ + Domain: "dev.sparteo.com", + Publisher: &openrtb2.Publisher{Ext: startExt}, + }, + Imp: []openrtb2.Imp{{ID: "i1", Ext: json.RawMessage(`{"bidder":{"networkId":"N"}}`)}}, + } + reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) + require.Len(t, reqs, 1) + require.Empty(t, errs) + + var out openrtb2.BidRequest + require.NoError(t, json.Unmarshal(reqs[0].Body, &out)) + var m map[string]any + require.NoError(t, json.Unmarshal(out.Site.Publisher.Ext, &m)) + params, _ := m["params"].(map[string]any) + require.NotNil(t, params) + assert.Equal(t, "bar", params["foo"]) + assert.Equal(t, float64(123), m["other"]) + assert.Equal(t, "N", params["networkId"]) +} + +// TestMakeBids_SkipsAudioBids verifies bids with prebid.type=audio are skipped with no returned errors. +func TestMakeBids_SkipsAudioBids(t *testing.T) { + a := &adapter{} + body := []byte(`{"cur":"USD","seatbid":[{"bid":[{"impid":"1","price":1,"crid":"c","ext":{"prebid":{"type":"audio"}}}]}]}`) + br, errs := a.MakeBids(&openrtb2.BidRequest{}, &adapters.RequestData{}, &adapters.ResponseData{StatusCode: 200, Body: body}) + require.NoError(t, nil) + require.Nil(t, errs) + require.NotNil(t, br) + assert.Equal(t, 0, len(br.Bids)) +} + +// TestMakeBids_SetsMTypeAndCurrency verifies mtype is set correctly for banner/video/native and currency is propagated. +func TestMakeBids_SetsMTypeAndCurrency(t *testing.T) { + a := &adapter{} + body := []byte(`{ + "cur":"EUR", + "seatbid":[{"bid":[ + {"impid":"b1","price":1,"crid":"c1","ext":{"prebid":{"type":"banner"}}}, + {"impid":"v1","price":2,"crid":"c2","ext":{"prebid":{"type":"video"}}}, + {"impid":"n1","price":3,"crid":"c3","ext":{"prebid":{"type":"native"}}} + ]}] + }`) + br, errs := a.MakeBids(&openrtb2.BidRequest{}, &adapters.RequestData{}, &adapters.ResponseData{StatusCode: 200, Body: body}) + require.Nil(t, errs) + require.NotNil(t, br) + require.Equal(t, "EUR", br.Currency) + require.Equal(t, 3, len(br.Bids)) + assert.Equal(t, openrtb2.MarkupBanner, br.Bids[0].Bid.MType) + assert.Equal(t, openrtb2.MarkupVideo, br.Bids[1].Bid.MType) + assert.Equal(t, openrtb2.MarkupNative, br.Bids[2].Bid.MType) +} diff --git a/adapters/sparteo/sparteotest/exemplary/banner-app.json b/adapters/sparteo/sparteotest/exemplary/banner-app.json new file mode 100644 index 00000000000..1e88391f3e1 --- /dev/null +++ b/adapters/sparteo/sparteotest/exemplary/banner-app.json @@ -0,0 +1,242 @@ +{ + "mockBidRequest": { + "id": "request-id", + "imp": [ + { + "id": "div-banner-id", + "banner": { + "topframe": 1, + "format": [ + { + "w": 300, + "h": 250 + } + ] + }, + "ext": { + "bidder": { + "networkId": "networkId" + } + } + } + ], + "app": { + "domain": "dev.sparteo.com", + "bundle": "com.sparteo.app", + "publisher": { + "domain": "dev.sparteo.com", + "id": "sparteo" + } + }, + "device": { + "w": 1920, + "h": 1080, + "dnt": 0, + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36", + "language": "fr", + "ext": { + "vpw": 1056, + "vph": 934 + }, + "sua": { + "source": 1, + "platform": { + "brand": "macOS" + }, + "browsers": [ + { + "brand": "Chromium", + "version": [ + "134" + ] + }, + { + "brand": "Not:A-Brand", + "version": [ + "24" + ] + }, + { + "brand": "Google Chrome", + "version": [ + "134" + ] + } + ], + "mobile": 0 + } + }, + "ext": { + "prebid": { + "server": { + "datacenter": "", + "externalurl": "", + "gvlid": 1028 + } + }, + "tmaxmax": 5000 + }, + "tmax": 5000 + }, + "httpCalls": [ + { + "expectedRequest": { + "uri": "https://bid-test.sparteo.com/s2s-auction?network_id=networkId&app_domain=dev.sparteo.com&bundle=com.sparteo.app", + "body": { + "id": "request-id", + "imp": [ + { + "id": "div-banner-id", + "banner": { + "format": [ + { + "w": 300, + "h": 250 + } + ], + "topframe": 1 + }, + "ext": { + "sparteo": { + "params": { + "networkId": "networkId" + } + } + } + } + ], + "app": { + "domain": "dev.sparteo.com", + "bundle": "com.sparteo.app", + "publisher": { + "domain": "dev.sparteo.com", + "id": "sparteo", + "ext": { + "params": { + "networkId": "networkId" + } + } + } + }, + "device": { + "dnt": 0, + "ua": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/134.0.0.0 Safari/537.36", + "sua": { + "browsers": [ + { + "brand": "Chromium", + "version": [ + "134" + ] + }, + { + "brand": "Not:A-Brand", + "version": [ + "24" + ] + }, + { + "brand": "Google Chrome", + "version": [ + "134" + ] + } + ], + "platform": { + "brand": "macOS" + }, + "mobile": 0, + "source": 1 + }, + "h": 1080, + "w": 1920, + "language": "fr", + "ext": { + "vpw": 1056, + "vph": 934 + } + }, + "tmax": 5000, + "ext": { + "prebid": { + "server": { + "externalurl": "", + "gvlid": 1028, + "datacenter": "" + } + }, + "tmaxmax": 5000 + } + }, + "impIDs": [ + "div-banner-id" + ] + }, + "mockResponse": { + "status": 200, + "body": { + "id": "request-id", + "seatbid": [ + { + "seat": "sparteo", + "bid": [ + { + "id": "137dd2bd-3015-407a-ab50-384aa2c706d7", + "impid": "div-banner-id", + "price": 0.10797, + "nurl": "https://dev.sparteo.com/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", + "adm": "", + "adomain": [ + "testpage-ad" + ], + "crid": "banner_creative_test", + "w": 300, + "h": 250, + "ext": { + "ft": "passthrough", + "prebid": { + "type": "banner" + } + } + } + ] + + } + ], + "cur": "EUR" + } + } + } + ], + "expectedBidResponses": [ + { + "id": "request-id", + "bids": [ + { + "bid": { + "id": "137dd2bd-3015-407a-ab50-384aa2c706d7", + "impid": "div-banner-id", + "mtype": 1, + "price": 0.10797, + "nurl": "https://dev.sparteo.com/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", + "adm": "", + "adomain": [ + "testpage-ad" + ], + "crid": "banner_creative_test", + "w": 300, + "h": 250, + "ext": { + "ft": "passthrough", + "prebid": { + "type": "banner" + } + } + }, + "type": "banner" + } + ], + "cur": "EUR" + } + ] +} \ No newline at end of file diff --git a/adapters/sparteo/sparteotest/exemplary/banner.json b/adapters/sparteo/sparteotest/exemplary/banner.json index 78fa09afc76..f68f57b6339 100644 --- a/adapters/sparteo/sparteotest/exemplary/banner.json +++ b/adapters/sparteo/sparteotest/exemplary/banner.json @@ -21,13 +21,13 @@ } ], "site": { - "domain": "dev.sparteo.com:4444", + "domain": "dev.sparteo.com", "publisher": { - "domain": "dev.sparteo.com:4444", + "domain": "dev.sparteo.com", "id": "sparteo" }, - "page": "https://dev.sparteo.com:4444/page/test/", - "ref": "https://dev.sparteo.com:4444/page/test/" + "page": "https://dev.sparteo.com/page/test/", + "ref": "https://dev.sparteo.com/page/test/" }, "device": { "w": 1920, @@ -82,7 +82,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://bid-test.sparteo.com/s2s-auction", + "uri": "https://bid-test.sparteo.com/s2s-auction?network_id=networkId&site_domain=dev.sparteo.com", "body": { "id": "request-id", "imp": [ @@ -107,12 +107,12 @@ } ], "site": { - "domain": "dev.sparteo.com:4444", - "page": "https://dev.sparteo.com:4444/page/test/", - "ref": "https://dev.sparteo.com:4444/page/test/", + "domain": "dev.sparteo.com", + "page": "https://dev.sparteo.com/page/test/", + "ref": "https://dev.sparteo.com/page/test/", "publisher": { "id": "sparteo", - "domain": "dev.sparteo.com:4444", + "domain": "dev.sparteo.com", "ext": { "params": { "networkId": "networkId" @@ -186,7 +186,7 @@ "id": "137dd2bd-3015-407a-ab50-384aa2c706d7", "impid": "div-banner-id", "price": 0.10797, - "nurl": "https://dev.sparteo.com:4444/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", + "nurl": "https://dev.sparteo.com/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", "adm": "", "adomain": [ "testpage-ad" @@ -220,7 +220,7 @@ "impid": "div-banner-id", "mtype": 1, "price": 0.10797, - "nurl": "https://dev.sparteo.com:4444/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", + "nurl": "https://dev.sparteo.com/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", "adm": "", "adomain": [ "testpage-ad" diff --git a/adapters/sparteo/sparteotest/exemplary/native.json b/adapters/sparteo/sparteotest/exemplary/native.json index 2f5b9bcc346..bcbbf8b6ab7 100644 --- a/adapters/sparteo/sparteotest/exemplary/native.json +++ b/adapters/sparteo/sparteotest/exemplary/native.json @@ -15,13 +15,13 @@ } ], "site": { - "domain": "dev.sparteo.com:4444", + "domain": "dev.sparteo.com", "publisher": { - "domain": "dev.sparteo.com:4444", + "domain": "dev.sparteo.com", "id": "sparteo" }, - "page": "https://dev.sparteo.com:4444/page/test/", - "ref": "https://dev.sparteo.com:4444/page/test/" + "page": "https://dev.sparteo.com/page/test/", + "ref": "https://dev.sparteo.com/page/test/" }, "device": { "w": 1920, @@ -76,7 +76,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://bid-test.sparteo.com/s2s-auction", + "uri": "https://bid-test.sparteo.com/s2s-auction?network_id=networkId&site_domain=dev.sparteo.com", "body": { "id": "request-id", "imp": [ @@ -95,12 +95,12 @@ } ], "site": { - "domain": "dev.sparteo.com:4444", - "page": "https://dev.sparteo.com:4444/page/test/", - "ref": "https://dev.sparteo.com:4444/page/test/", + "domain": "dev.sparteo.com", + "page": "https://dev.sparteo.com/page/test/", + "ref": "https://dev.sparteo.com/page/test/", "publisher": { "id": "sparteo", - "domain": "dev.sparteo.com:4444", + "domain": "dev.sparteo.com", "ext": { "params": { "networkId": "networkId" @@ -174,7 +174,7 @@ "id": "137dd2bd-3015-407a-ab50-384aa2c706d7", "impid": "div-native-id", "price": 0.10797, - "nurl": "https://dev.sparteo.com:4444/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", + "nurl": "https://dev.sparteo.com/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", "adm": "", "adomain": [ "testpage-ad" @@ -207,7 +207,7 @@ "impid": "div-native-id", "mtype": 4, "price": 0.10797, - "nurl": "https://dev.sparteo.com:4444/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", + "nurl": "https://dev.sparteo.com/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", "adm": "", "adomain": [ "testpage-ad" diff --git a/adapters/sparteo/sparteotest/exemplary/video.json b/adapters/sparteo/sparteotest/exemplary/video.json index f69d6463096..12a8c578be4 100644 --- a/adapters/sparteo/sparteotest/exemplary/video.json +++ b/adapters/sparteo/sparteotest/exemplary/video.json @@ -43,13 +43,13 @@ } ], "site": { - "domain": "dev.sparteo.com:4444", + "domain": "dev.sparteo.com", "publisher": { - "domain": "dev.sparteo.com:4444", + "domain": "dev.sparteo.com", "id": "sparteo" }, - "page": "https://dev.sparteo.com:4444/page/test/", - "ref": "https://dev.sparteo.com:4444/page/test/" + "page": "https://dev.sparteo.com/page/test/", + "ref": "https://dev.sparteo.com/page/test/" }, "device": { "w": 1920, @@ -104,7 +104,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://bid-test.sparteo.com/s2s-auction", + "uri": "https://bid-test.sparteo.com/s2s-auction?network_id=networkId&site_domain=dev.sparteo.com", "body": { "id": "request-id", "imp": [ @@ -146,12 +146,12 @@ } ], "site": { - "domain": "dev.sparteo.com:4444", - "page": "https://dev.sparteo.com:4444/page/test/", - "ref": "https://dev.sparteo.com:4444/page/test/", + "domain": "dev.sparteo.com", + "page": "https://dev.sparteo.com/page/test/", + "ref": "https://dev.sparteo.com/page/test/", "publisher": { "id": "sparteo", - "domain": "dev.sparteo.com:4444", + "domain": "dev.sparteo.com", "ext": { "params": { "networkId": "networkId" @@ -225,7 +225,7 @@ "id": "137dd2bd-3015-407a-ab50-384aa2c706d7", "impid": "div-video-id", "price": 0.10797, - "nurl": "https://dev.sparteo.com:4444/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", + "nurl": "https://dev.sparteo.com/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", "adm": "", "adomain": [ "testpage-ad" @@ -258,7 +258,7 @@ "impid": "div-video-id", "mtype": 2, "price": 0.10797, - "nurl": "https://dev.sparteo.com:4444/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", + "nurl": "https://dev.sparteo.com/event/sparteo/0a98964d-1cf9-4802-93e9-c59c18f497fa?d=kyGjrlVurDF3FlG8d7juZXMzNlGoZA06b75fJDG9dyF3LTd9LzPxLRHzMzFzMfwfdlifNfF9L7AlLzreYS96MTH9JTP7NRdtNRU4LS8lYTPwZTMlLRPyYTUfJDGjdEPfNfFvdzGzJWA8Y6Qob75fJDG8YSF3FirvJWe9rEHtY7xoZW49JzKuLSFsFmBiFgnfZCV7JmMwYXG9ZW1uY70tNgP9MRPfJDGwrSF3Fle9rEBzGTMBGTGCGTGCZCV7JmMwYXG9ZW1uY70tGTMBMRP9MDUyQmBeZ7UjLiZzZXG7ZXFtrC1td7VyrlVyJWGoZCQobldjLiZzZXG7ZXGUb8MjdmZjdiGoZCQoblrDYW4uZXFfJDGfdmFfNfFfJDGuhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGwhWPfNfGjYlY4ZTi6ZD8iMCMeJTQeLRKtNWL9YS8iLzK8LTPwMzL7ZRYfJDGib6LfNfGtYWMOUyFsFlQfFgnfrW4qbl06bfFsFmVib75fNfG8bltub6ruFfwfrWQ9FgnfZCVzh6QvdDFsFlAfrDF3WyGzd6HtY70tYl1tbW0uZXj9hXojdj0eXzUwFfwfd6MwJWMvbWGvJXB8YlZ8rEVyZV0jbXB9kV18LDFsFlrsb7GebDFsFmBfdy8fhWPtdlA9ZV0OPV1xLRHwFfwfdlV7ZW48ZV0BXzKwLDFsFlGoZD8vdEQaT6B9hW8KXzP8Fj9sFmByZWQzFgo2Flrsb7GebKxjrlVPdlVPdlViFgnxJDGobXBLZXZjbAByZVByZWPfNgKsFlMyZWAadCVyX7jtdDF3LS58MzYsFlGobCxeYlxjX6Bjdj0obXHfNgKsFlVzrCjtYXQjZA0yZXZjbmVjFgnwJgF5NSwfrljvrXMskV0yZXZjbmVadlA9hW1fNgKsFmrobj0yYXQjFgnwJgHyMSwfbWAyZ7juX6ByZWPfNgHuLRH8JDGfhWQadEGoY7UfNgHuLX9sFlGohSF3FlQorf8fYW4uZXFfJDGwbELfNjsfLzHwkRF8LDGrJDGwbXPfNjsfYlAublVyFj9sFlVsdyF3WyFzLRB5LgUwFfwfLzHwkRKwLDFsFgLwLEcxLgUfJDFzLRB5LTUwFj9sFlVtrDF3WyGfYW4uZXFfXSwfYlQzFgobFlAikW08bCjqZSFsFlAwdC4jkEVzFfwfZ6GoZDFsFl0lrC8jZCjeFfwfb74jrCAmFfwfb6BjbmcfJDGyhXMjFfwfdmVfhWMvbfFsFmMtYXG9YWQzZXG7ZXFfJDGzbWjsZXrebmQjZDFsFmVudmVskSGrJDGtYfF3ZlAsd7UsFlZ9dyF3WyGPYXMzVCeyb6VmhKZvdl8erDGrJDGydyF3LD55MSwfYlifNfFxLzriZRGfZD9zLRK8JTPwM7KtYWF8LD9zNRQeYTGgMzH7ZRdfJDGfdDF3LD5xJDGlrDF3FjBed6MUhEGvrWrnQl0ybWA9Fm9=", "adm": "", "adomain": [ "testpage-ad" diff --git a/adapters/sparteo/sparteotest/supplemental/filter-empty-seat-bids.json b/adapters/sparteo/sparteotest/supplemental/filter-empty-seat-bids.json index ded36e22d4f..ba66d5820b4 100644 --- a/adapters/sparteo/sparteotest/supplemental/filter-empty-seat-bids.json +++ b/adapters/sparteo/sparteotest/supplemental/filter-empty-seat-bids.json @@ -19,12 +19,15 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com" + } }, "httpCalls": [ { "expectedRequest": { - "uri": "https://bid-test.sparteo.com/s2s-auction", + "uri": "https://bid-test.sparteo.com/s2s-auction?network_id=networkId&site_domain=dev.sparteo.com", "body": { "id": "test-request-id", "imp": [ @@ -47,7 +50,17 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com", + "publisher": { + "ext": { + "params": { + "networkId": "networkId" + } + } + } + } }, "impIDs": [ "div-banner-id" diff --git a/adapters/sparteo/sparteotest/supplemental/filter-invalid-bid-type.json b/adapters/sparteo/sparteotest/supplemental/filter-invalid-bid-type.json index 851fcf1860d..ab31a8e67e0 100644 --- a/adapters/sparteo/sparteotest/supplemental/filter-invalid-bid-type.json +++ b/adapters/sparteo/sparteotest/supplemental/filter-invalid-bid-type.json @@ -19,12 +19,15 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com" + } }, "httpCalls": [ { "expectedRequest": { - "uri": "https://bid-test.sparteo.com/s2s-auction", + "uri": "https://bid-test.sparteo.com/s2s-auction?network_id=networkId&site_domain=dev.sparteo.com", "body": { "id": "test-request-id", "imp": [ @@ -47,7 +50,17 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com", + "publisher": { + "ext": { + "params": { + "networkId": "networkId" + } + } + } + } }, "impIDs": ["div-banner-id"] }, diff --git a/adapters/sparteo/sparteotest/supplemental/filter-no-seat-bids.json b/adapters/sparteo/sparteotest/supplemental/filter-no-seat-bids.json index 21e3f356296..0660aee07c8 100644 --- a/adapters/sparteo/sparteotest/supplemental/filter-no-seat-bids.json +++ b/adapters/sparteo/sparteotest/supplemental/filter-no-seat-bids.json @@ -19,12 +19,15 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com" + } }, "httpCalls": [ { "expectedRequest": { - "uri": "https://bid-test.sparteo.com/s2s-auction", + "uri": "https://bid-test.sparteo.com/s2s-auction?network_id=networkId&site_domain=dev.sparteo.com", "body": { "id": "test-request-id", "imp": [ @@ -47,7 +50,17 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com", + "publisher": { + "ext": { + "params": { + "networkId": "networkId" + } + } + } + } }, "impIDs": [ "div-banner-id" diff --git a/adapters/sparteo/sparteotest/supplemental/invalid-bidder-ext.json b/adapters/sparteo/sparteotest/supplemental/invalid-bidder-ext.json deleted file mode 100644 index 61d1d610025..00000000000 --- a/adapters/sparteo/sparteotest/supplemental/invalid-bidder-ext.json +++ /dev/null @@ -1,61 +0,0 @@ -{ - "mockBidRequest": { - "id": "test-request-id", - "imp": [ - { - "id": "div-banner-id", - "banner": { - "topframe": 1, - "format": [ - { - "w": 300, - "h": 250 - } - ] - }, - "ext": { - "bidder": "not an object" - } - } - ] - }, - "httpCalls": [ - { - "expectedRequest": { - "uri": "https://bid-test.sparteo.com/s2s-auction", - "body": { - "id": "test-request-id", - "imp": [ - { - "id": "div-banner-id", - "banner": { - "topframe": 1, - "format": [ - { - "w": 300, - "h": 250 - } - ] - }, - "ext": { - "bidder": "not an object" - } - } - ] - }, - "ImpIDs": ["div-banner-id"] - }} - ], - "expectedMakeRequestsErrors": [ - { - "value": "^ignoring imp id=div-banner-id, error while decoding impExt", - "comparison": "regex" - } - ], - "expectedMakeBidsErrors": [ - { - "value": "Unexpected status code: 0. Run with request.debug = 1 for more info", - "comparison": "literal" - } - ] -} \ No newline at end of file diff --git a/adapters/sparteo/sparteotest/supplemental/invalid-json-response.json b/adapters/sparteo/sparteotest/supplemental/invalid-json-response.json index 12ad55425b9..adb997a5038 100644 --- a/adapters/sparteo/sparteotest/supplemental/invalid-json-response.json +++ b/adapters/sparteo/sparteotest/supplemental/invalid-json-response.json @@ -19,12 +19,15 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com" + } }, "httpCalls": [ { "expectedRequest": { - "uri": "https://bid-test.sparteo.com/s2s-auction", + "uri": "https://bid-test.sparteo.com/s2s-auction?network_id=networkId&site_domain=dev.sparteo.com", "body": { "id": "test-request-id", "imp": [ @@ -47,7 +50,17 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com", + "publisher": { + "ext": { + "params": { + "networkId": "networkId" + } + } + } + } }, "impIDs": [ "div-banner-id" diff --git a/adapters/sparteo/sparteotest/supplemental/invalid-publisher-ext.json b/adapters/sparteo/sparteotest/supplemental/invalid-publisher-ext.json index 5d2bb2148c3..73a196772a3 100644 --- a/adapters/sparteo/sparteotest/supplemental/invalid-publisher-ext.json +++ b/adapters/sparteo/sparteotest/supplemental/invalid-publisher-ext.json @@ -21,12 +21,12 @@ } ], "site": { - "domain": "dev.sparteo.com:4444", - "page": "https://dev.sparteo.com:4444/page/test/", - "ref": "https://dev.sparteo.com:4444/page/test/", + "domain": "dev.sparteo.com", + "page": "https://dev.sparteo.com/page/test/", + "ref": "https://dev.sparteo.com/page/test/", "publisher": { "id": "sparteo", - "domain": "dev.sparteo.com:4444", + "domain": "dev.sparteo.com", "ext": "not an object" } } @@ -34,7 +34,7 @@ "httpCalls": [ { "expectedRequest": { - "uri": "https://bid-test.sparteo.com/s2s-auction", + "uri": "https://bid-test.sparteo.com/s2s-auction?network_id=networkId&site_domain=dev.sparteo.com", "body": { "id": "test-request-id", "imp": [ @@ -59,10 +59,10 @@ } ], "site": { - "domain": "dev.sparteo.com:4444", - "page": "https://dev.sparteo.com:4444/page/test/", + "domain": "dev.sparteo.com", + "page": "https://dev.sparteo.com/page/test/", "publisher": { - "domain": "dev.sparteo.com:4444", + "domain": "dev.sparteo.com", "ext": { "params": { "networkId": "networkId" @@ -70,7 +70,7 @@ }, "id": "sparteo" }, - "ref": "https://dev.sparteo.com:4444/page/test/" + "ref": "https://dev.sparteo.com/page/test/" } }, "impIDs": [ diff --git a/adapters/sparteo/sparteotest/supplemental/status_204.json b/adapters/sparteo/sparteotest/supplemental/status_204.json index 171eec08ed6..7358403bf68 100644 --- a/adapters/sparteo/sparteotest/supplemental/status_204.json +++ b/adapters/sparteo/sparteotest/supplemental/status_204.json @@ -19,12 +19,15 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com" + } }, "httpCalls": [ { "expectedRequest": { - "uri": "https://bid-test.sparteo.com/s2s-auction", + "uri": "https://bid-test.sparteo.com/s2s-auction?network_id=networkId&site_domain=dev.sparteo.com", "body": { "id": "request-id", "imp": [ @@ -47,7 +50,17 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com", + "publisher": { + "ext": { + "params": { + "networkId": "networkId" + } + } + } + } }, "impIDs": [ "div-banner-id" diff --git a/adapters/sparteo/sparteotest/supplemental/status_400.json b/adapters/sparteo/sparteotest/supplemental/status_400.json index 26f24b68be6..d97b7f083c8 100644 --- a/adapters/sparteo/sparteotest/supplemental/status_400.json +++ b/adapters/sparteo/sparteotest/supplemental/status_400.json @@ -19,12 +19,15 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com" + } }, "httpCalls": [ { "expectedRequest": { - "uri": "https://bid-test.sparteo.com/s2s-auction", + "uri": "https://bid-test.sparteo.com/s2s-auction?network_id=networkId&site_domain=dev.sparteo.com", "body": { "id": "request-id", "imp": [ @@ -47,7 +50,17 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com", + "publisher": { + "ext": { + "params": { + "networkId": "networkId" + } + } + } + } }, "impIDs": [ "div-banner-id" diff --git a/adapters/sparteo/sparteotest/supplemental/status_500.json b/adapters/sparteo/sparteotest/supplemental/status_500.json index ec3c68e56b1..bee2affa482 100644 --- a/adapters/sparteo/sparteotest/supplemental/status_500.json +++ b/adapters/sparteo/sparteotest/supplemental/status_500.json @@ -19,12 +19,15 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com" + } }, "httpCalls": [ { "expectedRequest": { - "uri": "https://bid-test.sparteo.com/s2s-auction", + "uri": "https://bid-test.sparteo.com/s2s-auction?network_id=networkId&site_domain=dev.sparteo.com", "body": { "id": "request-id", "imp": [ @@ -47,7 +50,17 @@ } } } - ] + ], + "site": { + "domain": "dev.sparteo.com", + "publisher": { + "ext": { + "params": { + "networkId": "networkId" + } + } + } + } }, "impIDs": [ "div-banner-id" diff --git a/macros/macros.go b/macros/macros.go index 0c6e08cae0e..90e754532a5 100644 --- a/macros/macros.go +++ b/macros/macros.go @@ -25,6 +25,10 @@ type EndpointTemplateParams struct { PartnerId string Region string PlacementID string + NetworkId string + SiteDomain string + AppDomain string + Bundle string } // UserSyncPrivacy specifies privacy policy macros, represented as strings, for user sync urls. diff --git a/static/bidder-info/sparteo.yaml b/static/bidder-info/sparteo.yaml index c1f862ed06a..4714d485a58 100644 --- a/static/bidder-info/sparteo.yaml +++ b/static/bidder-info/sparteo.yaml @@ -13,7 +13,7 @@ capabilities: - banner - video - native -endpoint: "https://bid.sparteo.com/s2s-auction" +endpoint: "https://bid.sparteo.com/s2s-auction?network_id={{.NetworkId}}&{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" userSync: iframe: - url: "https://sync.sparteo.com/s2s_sync?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirect_url={{.RedirectURL}}" \ No newline at end of file + url: "https://sync.sparteo.com/s2s_sync?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirect_url={{.RedirectURL}}" From fd78c6089073bc31e6b2c96fdef4dd3930a63aed Mon Sep 17 00:00:00 2001 From: Thomas Sormonte Date: Mon, 3 Nov 2025 12:12:09 +0100 Subject: [PATCH 2/7] Code Review ccorbo --- adapters/sparteo/sparteo.go | 44 ++++++++++++++++----------------- static/bidder-info/sparteo.yaml | 2 +- 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/adapters/sparteo/sparteo.go b/adapters/sparteo/sparteo.go index 0f15e3f6aff..7fcd9f7dcd0 100644 --- a/adapters/sparteo/sparteo.go +++ b/adapters/sparteo/sparteo.go @@ -150,14 +150,17 @@ func (a *adapter) MakeRequests(req *openrtb2.BidRequest, reqInfo *adapters.Extra var pubExt string if request.Site != nil { - pub = ensurePublisher(&request.Site.Publisher) + pub = ensurePublisher(request.Site.Publisher) + request.Site.Publisher = pub pubExt = "site.publisher.ext" } else if request.App != nil { - pub = ensurePublisher(&request.App.Publisher) + pub = ensurePublisher(request.App.Publisher) + request.App.Publisher = pub pubExt = "app.publisher.ext" } else { request.Site = &openrtb2.Site{} - pub = ensurePublisher(&request.Site.Publisher) + pub = ensurePublisher(request.Site.Publisher) + request.Site.Publisher = pub pubExt = "site.publisher.ext" } @@ -219,17 +222,15 @@ func normalizeHostname(host string) string { return host } -func strPtr(s string) *string { return &s } - func resolveSiteDomain(site *openrtb2.Site) *string { if site != nil { if d := normalizeHostname(site.Domain); d != "" { - return strPtr(d) + return ptrutil.ToPtr(d) } if fromPage := normalizeHostname(site.Page); fromPage != "" { - return strPtr(fromPage) + return ptrutil.ToPtr(fromPage) } - return strPtr(unknownValue) + return ptrutil.ToPtr(unknownValue) } return nil } @@ -237,9 +238,9 @@ func resolveSiteDomain(site *openrtb2.Site) *string { func resolveAppDomain(app *openrtb2.App) *string { if app != nil { if d := normalizeHostname(app.Domain); d != "" { - return strPtr(d) + return ptrutil.ToPtr(d) } - return strPtr(unknownValue) + return ptrutil.ToPtr(unknownValue) } return nil } @@ -251,32 +252,31 @@ func resolveBundle(app *openrtb2.App) *string { raw := app.Bundle if strings.TrimSpace(raw) == "" { - return strPtr(unknownValue) + return ptrutil.ToPtr(unknownValue) } b := strings.TrimSpace(raw) if strings.EqualFold(b, "null") { - return strPtr(unknownValue) + return ptrutil.ToPtr(unknownValue) } - return strPtr(b) + return ptrutil.ToPtr(b) } -func ensurePublisher(p **openrtb2.Publisher) *openrtb2.Publisher { - if *p == nil { - *p = &openrtb2.Publisher{} +func ensurePublisher(p *openrtb2.Publisher) *openrtb2.Publisher { + if p == nil { + p = &openrtb2.Publisher{} + } + if p.Ext == nil { + p.Ext = jsonutil.RawMessage("{}") } - return *p + return p } func updatePublisherExtension(targetExt *jsonutil.RawMessage, networkID, fieldPath string) ([]byte, error) { var pubExt map[string]interface{} - if *targetExt != nil { - if err := jsonutil.Unmarshal(*targetExt, &pubExt); err != nil { - pubExt = make(map[string]interface{}) - } - } else { + if err := jsonutil.Unmarshal(*targetExt, &pubExt); err != nil { pubExt = make(map[string]interface{}) } diff --git a/static/bidder-info/sparteo.yaml b/static/bidder-info/sparteo.yaml index 4714d485a58..59a7dab3d54 100644 --- a/static/bidder-info/sparteo.yaml +++ b/static/bidder-info/sparteo.yaml @@ -13,7 +13,7 @@ capabilities: - banner - video - native -endpoint: "https://bid.sparteo.com/s2s-auction?network_id={{.NetworkId}}&{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" +endpoint: "https://bid.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" userSync: iframe: url: "https://sync.sparteo.com/s2s_sync?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirect_url={{.RedirectURL}}" From c12bd7412dd735e82746ba238443d115fb0a0569 Mon Sep 17 00:00:00 2001 From: Thomas Sormonte Date: Thu, 13 Nov 2025 10:36:01 +0100 Subject: [PATCH 3/7] Code Review ccorbo 2 --- adapters/sparteo/sparteo.go | 50 ++++++++++++---- adapters/sparteo/sparteo_test.go | 99 ++++++++++++-------------------- static/bidder-info/sparteo.yaml | 2 +- 3 files changed, 77 insertions(+), 74 deletions(-) diff --git a/adapters/sparteo/sparteo.go b/adapters/sparteo/sparteo.go index 7fcd9f7dcd0..e8529a7d7be 100644 --- a/adapters/sparteo/sparteo.go +++ b/adapters/sparteo/sparteo.go @@ -5,7 +5,6 @@ import ( "net/http" "net/url" "strings" - "text/template" "github.com/prebid/openrtb/v20/openrtb2" "github.com/prebid/prebid-server/v4/adapters" @@ -16,7 +15,7 @@ import ( ) type adapter struct { - endpoint *template.Template + endpoint string } type extBidWrapper struct { @@ -26,13 +25,8 @@ type extBidWrapper struct { const unknownValue = "unknown" func Builder(bidderName openrtb_ext.BidderName, cfg config.Adapter, server config.Server) (adapters.Bidder, error) { - template, err := template.New("endpointTemplate").Parse(cfg.Endpoint) - if err != nil { - return nil, fmt.Errorf("unable to parse endpoint url template: %v", err) - } - bidder := &adapter{ - endpoint: template, + endpoint: cfg.Endpoint, } return bidder, nil } @@ -297,8 +291,44 @@ func updatePublisherExtension(targetExt *jsonutil.RawMessage, networkID, fieldPa } func (a *adapter) buildEndpointURL(networkId string, siteDomain string, appDomain string, bundle string) (string, error) { - endpointParams := macros.EndpointTemplateParams{NetworkId: networkId, SiteDomain: siteDomain, AppDomain: appDomain, Bundle: bundle} - return macros.ResolveMacros(a.endpoint, endpointParams) + parsed, err := url.Parse(a.endpoint) + if err != nil { + return "", fmt.Errorf("invalid endpoint URL %q: %w", a.endpoint, err) + } + + hasSite := siteDomain != "" + hasAppOrBundle := appDomain != "" || bundle != "" + + var b strings.Builder + + b.WriteString("network_id=") + b.WriteString(url.QueryEscape(networkId)) + + if hasSite { + v := siteDomain + if v == "" { + v = unknownValue + } + b.WriteString("&site_domain=") + b.WriteString(url.QueryEscape(v)) + } else if hasAppOrBundle { + ad := appDomain + if ad == "" { + ad = unknownValue + } + bd := bundle + if bd == "" { + bd = unknownValue + } + + b.WriteString("&app_domain=") + b.WriteString(url.QueryEscape(ad)) + b.WriteString("&bundle=") + b.WriteString(url.QueryEscape(bd)) + } + + parsed.RawQuery = b.String() + return parsed.String(), nil } func (a *adapter) MakeBids(req *openrtb2.BidRequest, reqData *adapters.RequestData, respData *adapters.ResponseData) (*adapters.BidderResponse, []error) { diff --git a/adapters/sparteo/sparteo_test.go b/adapters/sparteo/sparteo_test.go index fc054545199..004e6c326a4 100644 --- a/adapters/sparteo/sparteo_test.go +++ b/adapters/sparteo/sparteo_test.go @@ -1,7 +1,6 @@ package sparteo import ( - "bytes" "encoding/json" "errors" "testing" @@ -18,44 +17,18 @@ import ( // and that the endpoint template renders fields using the new macros. func TestBuilder(t *testing.T) { cfg := config.Adapter{ - Endpoint: "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}", + Endpoint: "https://bid-test.sparteo.com/s2s-auction", } - bidder, err := Builder(openrtb_ext.BidderSparteo, cfg, config.Server{GvlID: 1028}) - require.NoError(t, err, "Builder returned an error") - assert.NotNil(t, bidder, "Bidder is nil") - - sparteoAdapter, ok := bidder.(*adapter) - require.True(t, ok, "Expected *adapter, got %T", bidder) - - var endpointBuffer bytes.Buffer - templateData := struct { - NetworkId string - SiteDomain string - AppDomain string - Bundle string - }{ - NetworkId: "networkID", - SiteDomain: "dev.sparteo.com", - AppDomain: "", - Bundle: "com.sparteo.app", + bidder, err := Builder(openrtb_ext.BidderSparteo, cfg, config.Server{}) + if assert.NoError(t, err) { + assert.NotNil(t, bidder) } - err = sparteoAdapter.endpoint.Execute(&endpointBuffer, templateData) - require.NoError(t, err) - expectedEndpoint := "https://bid-test.sparteo.com/s2s-auction?network_id=networkID&site_domain=dev.sparteo.com&bundle=com.sparteo.app" - assert.Equal(t, expectedEndpoint, endpointBuffer.String(), "Endpoint is not correctly set") -} - -// TestEndpointTemplateMalformed verifies that the Builder returns an error when the endpoint template is malformed. -func TestEndpointTemplateMalformed(t *testing.T) { - _, buildErr := Builder(openrtb_ext.BidderSmrtconnect, config.Adapter{ - Endpoint: "{{Malformed}}"}, config.Server{ExternalUrl: "http://bid-test.sparteo.com.com", GvlID: 196}) - assert.Error(t, buildErr) } // TestJsonSamples runs JSON sample tests using the shared adapterstest framework. func TestJsonSamples(t *testing.T) { bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{ - Endpoint: "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}", + Endpoint: "https://bid-test.sparteo.com/s2s-auction", }, config.Server{GvlID: 1028}) require.NoError(t, err, "Builder returned an error") @@ -98,9 +71,9 @@ func TestGetMediaType_NilExt(t *testing.T) { assert.Equal(t, openrtb_ext.BidType(""), result, "Expected empty result for nil extension") } -// TestMakeRequests_ResolvesMacros verifies that the adapter correctly resolves macros in the endpoint URL for Site traffic. -func TestMakeRequests_ResolvesMacros(t *testing.T) { - endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" +// TestMakeRequests_ResolvesQueryParams verifies that the adapter correctly resolves macros in the endpoint URL for Site traffic. +func TestMakeRequests_ResolvesQueryParams(t *testing.T) { + endpoint := "https://bid-test.sparteo.com/s2s-auction" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{ Endpoint: endpoint, @@ -130,7 +103,7 @@ func TestMakeRequests_ResolvesMacros(t *testing.T) { // TestMakeRequests_AppBundleMacro verifies that the adapter correctly resolves app_domain and bundle for App traffic. func TestMakeRequests_AppBundleMacro(t *testing.T) { - endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s-auction" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -160,7 +133,7 @@ func TestMakeRequests_AppBundleMacro(t *testing.T) { // TestMakeRequests_AppBundleMissing_AppendsUnknown verifies that when app.bundle is empty or missing we send bundle=unknown (and warn). func TestMakeRequests_AppBundleMissing_AppendsUnknown(t *testing.T) { - endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s-auction" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -187,7 +160,7 @@ func TestMakeRequests_AppBundleMissing_AppendsUnknown(t *testing.T) { // TestMakeRequests_SiteDomain verifies that the adapter uses site.Domain and does not include app fields for Site traffic. func TestMakeRequests_SiteDomain(t *testing.T) { - endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s-auction" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{ Endpoint: endpoint, @@ -217,7 +190,7 @@ func TestMakeRequests_SiteDomain(t *testing.T) { // TestMakeRequests_DomainPrecedence_SiteDomainWins verifies that Site wins over App when both exist. func TestMakeRequests_DomainPrecedence_SiteDomainWins(t *testing.T) { - endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s-auction" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -253,7 +226,7 @@ func TestMakeRequests_DomainPrecedence_SiteDomainWins(t *testing.T) { // TestMakeRequests_SitePresentWithEmptyDomain_UsesUnknownNotApp verifies that when Site exists but has no domain/page, we send site_domain=unknown and do NOT use App. func TestMakeRequests_SitePresentWithEmptyDomain_UsesUnknownNotApp(t *testing.T) { - endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s-auction" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -286,7 +259,7 @@ func TestMakeRequests_SitePresentWithEmptyDomain_UsesUnknownNotApp(t *testing.T) // TestMakeRequests_DomainPrecedence_AppDomainWhenNoSite verifies that if there is no Site, we use app.domain (and include bundle if present). func TestMakeRequests_DomainPrecedence_AppDomainWhenNoSite(t *testing.T) { - endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s-auction" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -318,7 +291,7 @@ func TestMakeRequests_DomainPrecedence_AppDomainWhenNoSite(t *testing.T) { // TestMakeRequests_SitePageWhenNoSiteDomainNoApp verifies that if there is Site without domain but page is present, we use site.page. func TestMakeRequests_SitePageWhenNoSiteDomainNoApp(t *testing.T) { - endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s-auction" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -406,7 +379,7 @@ func readNetworkIDFromPublisherExt(t *testing.T, ext json.RawMessage) (string, b // When site exists but site.publisher is nil, the adapter must create publisher and upsert networkId into site.publisher.ext func TestMakeRequests_UpdatePublisherExtension_CreatesSitePublisherIfMissing(t *testing.T) { - endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s-auction" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -438,7 +411,7 @@ func TestMakeRequests_UpdatePublisherExtension_CreatesSitePublisherIfMissing(t * // When no site is present, create app.publisher if missing and upsert networkId into app.publisher.ext func TestMakeRequests_UpdatePublisherExtension_CreatesAppPublisherIfMissingWhenNoSite(t *testing.T) { - endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s-auction" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -473,7 +446,7 @@ func TestMakeRequests_UpdatePublisherExtension_CreatesAppPublisherIfMissingWhenN // TestMakeRequests_UpdatePublisherExtension_PrefersSiteOverApp verifies that we prefer Site when both Site and App exist; only Site should receive the networkId func TestMakeRequests_UpdatePublisherExtension_PrefersSiteOverApp(t *testing.T) { - endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s-auction" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -514,7 +487,7 @@ func TestMakeRequests_UpdatePublisherExtension_PrefersSiteOverApp(t *testing.T) // TestMakeRequests_NoSiteNoApp_NoDomainParam_NoWarning verifies that with neither Site nor App we don't send domain params and produce no warnings. func TestMakeRequests_NoSiteNoApp_NoDomainParam_NoWarning(t *testing.T) { - endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s-auction" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -539,7 +512,7 @@ func TestMakeRequests_NoSiteNoApp_NoDomainParam_NoWarning(t *testing.T) { // TestMakeRequests_SitePageLiteralNull_TreatedAsMissingDomain verifies that a literal "null" in site.page is treated as an unknown site domain. func TestMakeRequests_SitePageLiteralNull_TreatedAsMissingDomain(t *testing.T) { - endpoint := "https://bid-test.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s-auction" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -571,7 +544,7 @@ func TestMakeRequests_SitePageLiteralNull_TreatedAsMissingDomain(t *testing.T) { // TestMakeRequests_AppBundle_NormalizationVariants ensures blank/whitespace/"null" bundles normalize to "unknown" with a single warning. func TestMakeRequests_AppBundle_NormalizationVariants(t *testing.T) { - endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -604,7 +577,7 @@ func TestMakeRequests_AppBundle_NormalizationVariants(t *testing.T) { // TestMakeRequests_SitePresent_IgnoresAppFields ensures when Site is present, only site_domain is sent and app fields are ignored. func TestMakeRequests_SitePresent_IgnoresAppFields(t *testing.T) { - endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -616,40 +589,40 @@ func TestMakeRequests_SitePresent_IgnoresAppFields(t *testing.T) { reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) require.Len(t, reqs, 1) require.Empty(t, errs) - assert.Equal(t, "https://host/s2s?network_id=N&site_domain=site.sparteo.com", reqs[0].Uri) + assert.Equal(t, "https://bid-test.sparteo.com/s2s?network_id=N&site_domain=site.sparteo.com", reqs[0].Uri) } // TestMakeRequests_SiteWithPageFallback_IgnoresApp ensures Site.Page is used when Site.Domain is empty and App is ignored when Site exists. func TestMakeRequests_SiteWithPageFallback_IgnoresApp(t *testing.T) { - endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) in := &openrtb2.BidRequest{ Site: &openrtb2.Site{Domain: "", Page: "https://www.example.com:8080/p"}, App: &openrtb2.App{Domain: "app.sparteo.com", Bundle: "com.app"}, - Imp: []openrtb2.Imp{{ID: "i1", Ext: json.RawMessage(`{"bidder":{"networkId":"N"}}`)}}, + Imp: []openrtb2.Imp{{ID: "i1", Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`)}}, } reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) require.Len(t, reqs, 1) require.Empty(t, errs) - assert.Equal(t, "https://host/s2s?network_id=N&site_domain=example.com", reqs[0].Uri) + assert.Equal(t, "https://bid-test.sparteo.com/s2s?network_id=networkID&site_domain=example.com", reqs[0].Uri) } // TestMakeRequests_AppMissingBundle_WarnsAndUnknown ensures App with missing bundle yields bundle=unknown and one bundle warning. func TestMakeRequests_AppMissingBundle_WarnsAndUnknown(t *testing.T) { - endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) in := &openrtb2.BidRequest{ App: &openrtb2.App{Domain: "dev.sparteo.com", Bundle: "", Publisher: &openrtb2.Publisher{}}, - Imp: []openrtb2.Imp{{ID: "i1", Ext: json.RawMessage(`{"bidder":{"networkId":"N"}}`)}}, + Imp: []openrtb2.Imp{{ID: "i1", Ext: json.RawMessage(`{"bidder":{"networkId":"networkID"}}`)}}, } reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) require.Len(t, reqs, 1) require.Len(t, errs, 1) - assert.Equal(t, "https://host/s2s?network_id=N&app_domain=dev.sparteo.com&bundle=unknown", reqs[0].Uri) + assert.Equal(t, "https://bid-test.sparteo.com/s2s?network_id=networkID&app_domain=dev.sparteo.com&bundle=unknown", reqs[0].Uri) var badInput *errortypes.BadInput require.True(t, errors.As(errs[0], &badInput)) assert.Contains(t, badInput.Error(), "Bundle not found") @@ -657,7 +630,7 @@ func TestMakeRequests_AppMissingBundle_WarnsAndUnknown(t *testing.T) { // TestMakeRequests_ExtRewrite_MovesBidderIntoSparteoParams verifies bidder object is moved under sparteo.params and bidder is removed. func TestMakeRequests_ExtRewrite_MovesBidderIntoSparteoParams(t *testing.T) { - endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -684,7 +657,7 @@ func TestMakeRequests_ExtRewrite_MovesBidderIntoSparteoParams(t *testing.T) { // TestMakeRequests_ExtRewrite_PreservesExistingSparteoParams verifies existing sparteo.params keys are preserved when merging bidder fields. func TestMakeRequests_ExtRewrite_PreservesExistingSparteoParams(t *testing.T) { - endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -713,7 +686,7 @@ func TestMakeRequests_ExtRewrite_PreservesExistingSparteoParams(t *testing.T) { // TestMakeRequests_NetworkId_FirstNonEmptyWins verifies the first non-empty networkId across imps is used. func TestMakeRequests_NetworkId_FirstNonEmptyWins(t *testing.T) { - endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -728,12 +701,12 @@ func TestMakeRequests_NetworkId_FirstNonEmptyWins(t *testing.T) { reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) require.Len(t, reqs, 1) require.Empty(t, errs) - assert.Equal(t, "https://host/s2s?network_id=N2&site_domain=dev.sparteo.com", reqs[0].Uri) + assert.Equal(t, "https://bid-test.sparteo.com/s2s?network_id=N2&site_domain=dev.sparteo.com", reqs[0].Uri) } // TestMakeRequests_AllImpsBadExt_AggregatesErrors verifies a request is still built when all imps have bad ext and errors are aggregated. func TestMakeRequests_AllImpsBadExt_AggregatesErrors(t *testing.T) { - endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) @@ -747,12 +720,12 @@ func TestMakeRequests_AllImpsBadExt_AggregatesErrors(t *testing.T) { reqs, errs := bidder.MakeRequests(in, &adapters.ExtraRequestInfo{}) require.Len(t, reqs, 1) require.Len(t, errs, 2) - assert.Equal(t, "https://host/s2s?network_id=&site_domain=dev.sparteo.com", reqs[0].Uri) + assert.Equal(t, "https://bid-test.sparteo.com/s2s?network_id=&site_domain=dev.sparteo.com", reqs[0].Uri) } // TestMakeRequests_UpdatePublisherExtension_PreservesOtherKeys verifies publisher.ext keeps existing keys while adding params.networkId. func TestMakeRequests_UpdatePublisherExtension_PreservesOtherKeys(t *testing.T) { - endpoint := "https://host/s2s?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}" + endpoint := "https://bid-test.sparteo.com/s2s" bidder, err := Builder(openrtb_ext.BidderSparteo, config.Adapter{Endpoint: endpoint}, config.Server{GvlID: 1028}) require.NoError(t, err) diff --git a/static/bidder-info/sparteo.yaml b/static/bidder-info/sparteo.yaml index 59a7dab3d54..744779dda40 100644 --- a/static/bidder-info/sparteo.yaml +++ b/static/bidder-info/sparteo.yaml @@ -13,7 +13,7 @@ capabilities: - banner - video - native -endpoint: "https://bid.sparteo.com/s2s-auction?network_id={{.NetworkId}}{{if .SiteDomain}}&site_domain={{.SiteDomain}}{{end}}{{if .AppDomain}}&app_domain={{.AppDomain}}{{end}}{{if .Bundle}}&bundle={{.Bundle}}{{end}}" +endpoint: "https://bid.sparteo.com/s2s-auction" userSync: iframe: url: "https://sync.sparteo.com/s2s_sync?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirect_url={{.RedirectURL}}" From 86cbef91daee706d88a5a4c34bb9b9a1b656dc24 Mon Sep 17 00:00:00 2001 From: Thomas Sormonte Date: Wed, 25 Feb 2026 09:28:47 +0100 Subject: [PATCH 4/7] Go fmt after conflict resolution --- macros/macros.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/macros/macros.go b/macros/macros.go index 90e754532a5..2473be05e73 100644 --- a/macros/macros.go +++ b/macros/macros.go @@ -25,7 +25,7 @@ type EndpointTemplateParams struct { PartnerId string Region string PlacementID string - NetworkId string + NetworkId string SiteDomain string AppDomain string Bundle string From af631d10e1b861468eb3696f43fcbe0dbe725534 Mon Sep 17 00:00:00 2001 From: Thomas Sormonte Date: Fri, 6 Mar 2026 11:52:28 +0100 Subject: [PATCH 5/7] Fix import to V4 module --- adapters/sparteo/sparteo_test.go | 2 ++ 1 file changed, 2 insertions(+) diff --git a/adapters/sparteo/sparteo_test.go b/adapters/sparteo/sparteo_test.go index 004e6c326a4..8157c898154 100644 --- a/adapters/sparteo/sparteo_test.go +++ b/adapters/sparteo/sparteo_test.go @@ -6,8 +6,10 @@ import ( "testing" "github.com/prebid/openrtb/v20/openrtb2" + "github.com/prebid/prebid-server/v4/adapters" "github.com/prebid/prebid-server/v4/adapters/adapterstest" "github.com/prebid/prebid-server/v4/config" + "github.com/prebid/prebid-server/v4/errortypes" "github.com/prebid/prebid-server/v4/openrtb_ext" "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" From fece903394641e874c04d81c2e1b9ed7cbddd41b Mon Sep 17 00:00:00 2001 From: Thomas Sormonte Date: Fri, 20 Mar 2026 14:18:25 +0100 Subject: [PATCH 6/7] Fix missing ptrutil import in Sparteo adapter The ptrutil package was used by domain/bundle resolution helpers but not imported, causing a build failure. --- adapters/sparteo/sparteo.go | 1 + 1 file changed, 1 insertion(+) diff --git a/adapters/sparteo/sparteo.go b/adapters/sparteo/sparteo.go index e8529a7d7be..0a8f0fb2862 100644 --- a/adapters/sparteo/sparteo.go +++ b/adapters/sparteo/sparteo.go @@ -12,6 +12,7 @@ import ( "github.com/prebid/prebid-server/v4/errortypes" "github.com/prebid/prebid-server/v4/openrtb_ext" "github.com/prebid/prebid-server/v4/util/jsonutil" + "github.com/prebid/prebid-server/v4/util/ptrutil" ) type adapter struct { From 873e6e812e224c0292e1b296d5513d43fde5f8a5 Mon Sep 17 00:00:00 2001 From: Thomas Sormonte Date: Thu, 9 Apr 2026 10:07:30 +0200 Subject: [PATCH 7/7] Add GPP query params to Sparteo iframe sync URL --- static/bidder-info/sparteo.yaml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/static/bidder-info/sparteo.yaml b/static/bidder-info/sparteo.yaml index 744779dda40..f9270be7219 100644 --- a/static/bidder-info/sparteo.yaml +++ b/static/bidder-info/sparteo.yaml @@ -16,4 +16,4 @@ capabilities: endpoint: "https://bid.sparteo.com/s2s-auction" userSync: iframe: - url: "https://sync.sparteo.com/s2s_sync?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&redirect_url={{.RedirectURL}}" + url: "https://sync.sparteo.com/s2s_sync?gdpr={{.GDPR}}&gdpr_consent={{.GDPRConsent}}&us_privacy={{.USPrivacy}}&gpp={{.GPP}}&gpp_sid={{.GPPSID}}&redirect_url={{.RedirectURL}}"