From 760fbfc012f32401136574c19a1513c162a3b98e Mon Sep 17 00:00:00 2001 From: Oleksandr Zhevedenko Date: Wed, 7 Feb 2024 20:24:50 -0500 Subject: [PATCH] Unit tests --- .../Ortb2RequestFactoryTest.java | 290 ++++++++++++++++++ 1 file changed, 290 insertions(+) diff --git a/src/test/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactoryTest.java b/src/test/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactoryTest.java index a65a86cd29a..4d180fd3ac8 100644 --- a/src/test/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactoryTest.java +++ b/src/test/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactoryTest.java @@ -7,6 +7,7 @@ import com.iab.openrtb.request.Dooh; import com.iab.openrtb.request.Geo; import com.iab.openrtb.request.Publisher; +import com.iab.openrtb.request.Regs; import com.iab.openrtb.request.Site; import io.vertx.core.Future; import io.vertx.core.MultiMap; @@ -59,6 +60,9 @@ import org.prebid.server.privacy.model.PrivacyContext; import org.prebid.server.proto.openrtb.ext.request.ExtPublisher; import org.prebid.server.proto.openrtb.ext.request.ExtPublisherPrebid; +import org.prebid.server.proto.openrtb.ext.request.ExtRegs; +import org.prebid.server.proto.openrtb.ext.request.ExtRegsDsa; +import org.prebid.server.proto.openrtb.ext.request.ExtRegsDsaTransparency; import org.prebid.server.proto.openrtb.ext.request.ExtRequest; import org.prebid.server.proto.openrtb.ext.request.ExtRequestPrebid; import org.prebid.server.proto.openrtb.ext.request.ExtRequestTargeting; @@ -66,8 +70,12 @@ import org.prebid.server.settings.ApplicationSettings; import org.prebid.server.settings.model.Account; import org.prebid.server.settings.model.AccountAuctionConfig; +import org.prebid.server.settings.model.AccountDsaConfig; +import org.prebid.server.settings.model.AccountPrivacyConfig; import org.prebid.server.settings.model.AccountStatus; import org.prebid.server.settings.model.AccountTargetingConfig; +import org.prebid.server.settings.model.DefaultDsa; +import org.prebid.server.settings.model.DsaTransparency; import org.prebid.server.validation.RequestValidator; import org.prebid.server.validation.model.ValidationResult; @@ -1452,6 +1460,288 @@ public void updateTimeoutShouldReturnContextWithUpdatedTimeoutAndBidRequestTmax( assertThat(result.getTimeout()).isEqualTo(updatedTimeout); } + @Test + public void enrichBidRequestWithAccountAndPrivacyDataShouldAddDsaFromAccountWhenRequestLacksDsa() { + // given + final String accountId = "accId"; + final BidRequest bidRequest = givenBidRequest(builder -> builder + .imp(emptyList()) + .site(Site.builder() + .publisher(Publisher.builder().id(accountId).build()) + .build())); + + final PrivacyContext privacyContext = PrivacyContext.of( + Privacy.builder() + .gdpr("") + .consentString("") + .ccpa(Ccpa.EMPTY) + .coppa(0) + .build(), + TcfContext.empty(), + ""); + + final Account account = Account.builder() + .id(accountId) + .privacy(AccountPrivacyConfig.of(null, + null, + AccountDsaConfig.of(DefaultDsa.of(0, + 1, + 2, + List.of(DsaTransparency.of("", + List.of(0)))), + null), + null, + null)) + .build(); + given(applicationSettings.getAccountById(any(), any())).willReturn(Future.succeededFuture(account)); + + final AuctionContext auctionContext = AuctionContext.builder() + .bidRequest(bidRequest) + .account(account) + .privacyContext(privacyContext) + .build(); + + // when + final BidRequest result = target.enrichBidRequestWithAccountAndPrivacyData(auctionContext); + + // then + assertThat(result) + .extracting(BidRequest::getRegs) + .extracting(Regs::getExt) + .extracting(ExtRegs::getDsa) + .satisfies(dsa -> { + assertThat(dsa.getRequired()).isEqualTo(0); + assertThat(dsa.getPubrender()).isEqualTo(1); + assertThat(dsa.getDatatopub()).isEqualTo(2); + assertThat(dsa.getTransparency()).satisfies(transparencies -> + assertThat(transparencies).isEqualTo(List.of(ExtRegsDsaTransparency.of("", + List.of(0))))); + }); + } + + @Test + public void enrichBidRequestWithAccountAndPrivacyDataShouldNotAddDsaFromAccountWhenAccountLacksDefaultDsa() { + // given + final String accountId = "accId"; + final BidRequest bidRequest = givenBidRequest(builder -> builder + .imp(emptyList()) + .site(Site.builder() + .publisher(Publisher.builder().id(accountId).build()) + .build())); + + final PrivacyContext privacyContext = PrivacyContext.of( + Privacy.builder() + .gdpr("") + .consentString("") + .ccpa(Ccpa.EMPTY) + .coppa(0) + .build(), + TcfContext.empty(), + ""); + + final Account account = Account.builder() + .id(accountId) + .privacy(AccountPrivacyConfig.of(null, + null, + AccountDsaConfig.of(null, + null), + null, + null)) + .build(); + given(applicationSettings.getAccountById(any(), any())).willReturn(Future.succeededFuture(account)); + + final AuctionContext auctionContext = AuctionContext.builder() + .bidRequest(bidRequest) + .account(account) + .privacyContext(privacyContext) + .build(); + + // when + final BidRequest result = target.enrichBidRequestWithAccountAndPrivacyData(auctionContext); + + // then + assertThat(result) + .extracting(BidRequest::getRegs) + .isNull(); + } + + @Test + public void enrichBidRequestWithAccountAndPrivacyDataShouldNotAddDsaFromAccountWhenRequestContainsDsa() { + // given + final String accountId = "accId"; + final BidRequest bidRequest = givenBidRequest(builder -> builder + .imp(emptyList()) + .site(Site.builder() + .publisher(Publisher.builder().id(accountId).build()) + .build()) + .regs(Regs.builder().ext(ExtRegs.of(null, + null, + null, + ExtRegsDsa.of(0, + 1, + 2, + List.of(ExtRegsDsaTransparency.of("", List.of(0)))))) + .build()) + ); + + final PrivacyContext privacyContext = PrivacyContext.of( + Privacy.builder() + .gdpr("") + .consentString("") + .ccpa(Ccpa.EMPTY) + .coppa(0) + .build(), + TcfContext.empty(), + ""); + + final Account account = Account.builder() + .id(accountId) + .privacy(AccountPrivacyConfig.of(null, + null, + AccountDsaConfig.of(DefaultDsa.of(3, + 4, + 5, + List.of(DsaTransparency.of("domain", + List.of(1)))), + null), + null, + null)) + .build(); + given(applicationSettings.getAccountById(any(), any())).willReturn(Future.succeededFuture(account)); + + final AuctionContext auctionContext = AuctionContext.builder() + .bidRequest(bidRequest) + .account(account) + .privacyContext(privacyContext) + .build(); + + // when + final BidRequest result = target.enrichBidRequestWithAccountAndPrivacyData(auctionContext); + + // then + assertThat(result) + .extracting(BidRequest::getRegs) + .extracting(Regs::getExt) + .extracting(ExtRegs::getDsa) + .satisfies(dsa -> { + assertThat(dsa.getRequired()).isEqualTo(0); + assertThat(dsa.getPubrender()).isEqualTo(1); + assertThat(dsa.getDatatopub()).isEqualTo(2); + assertThat(dsa.getTransparency()).satisfies(transparencies -> + assertThat(transparencies).isEqualTo(List.of(ExtRegsDsaTransparency.of("", + List.of(0))))); + }); + } + + @Test + public void enrichBidRequestWithAccountAndPrivacyDataShouldAddDsaFromAccountWhenGdprScopingEnabledAndMatches() { + // given + final String accountId = "accId"; + final BidRequest bidRequest = givenBidRequest(builder -> builder + .imp(emptyList()) + .site(Site.builder() + .publisher(Publisher.builder().id(accountId).build()) + .build())); + + final PrivacyContext privacyContext = PrivacyContext.of( + Privacy.builder() + .gdpr("") + .consentString("") + .ccpa(Ccpa.EMPTY) + .coppa(0) + .build(), + TcfContext.builder().inGdprScope(true).build(), + ""); + + final Account account = Account.builder() + .id(accountId) + .privacy(AccountPrivacyConfig.of(null, + null, + AccountDsaConfig.of(DefaultDsa.of(0, + 1, + 2, + List.of(DsaTransparency.of("", + List.of(0)))), + true), + null, + null)) + .build(); + given(applicationSettings.getAccountById(any(), any())).willReturn(Future.succeededFuture(account)); + + final AuctionContext auctionContext = AuctionContext.builder() + .bidRequest(bidRequest) + .account(account) + .privacyContext(privacyContext) + .build(); + + // when + final BidRequest result = target.enrichBidRequestWithAccountAndPrivacyData(auctionContext); + + // then + assertThat(result) + .extracting(BidRequest::getRegs) + .extracting(Regs::getExt) + .extracting(ExtRegs::getDsa) + .satisfies(dsa -> { + assertThat(dsa.getRequired()).isEqualTo(0); + assertThat(dsa.getPubrender()).isEqualTo(1); + assertThat(dsa.getDatatopub()).isEqualTo(2); + assertThat(dsa.getTransparency()).satisfies(transparencies -> + assertThat(transparencies).isEqualTo(List.of(ExtRegsDsaTransparency.of("", + List.of(0))))); + }); + } + + @Test + public void enrichBidRequestWithAccountAndPrivacyDataShouldAddDsaFromAccountWhenGdprScopingEnabledAndDoesntMatch() { + // given + final String accountId = "accId"; + final BidRequest bidRequest = givenBidRequest(builder -> builder + .imp(emptyList()) + .site(Site.builder() + .publisher(Publisher.builder().id(accountId).build()) + .build())); + + final PrivacyContext privacyContext = PrivacyContext.of( + Privacy.builder() + .gdpr("") + .consentString("") + .ccpa(Ccpa.EMPTY) + .coppa(0) + .build(), + TcfContext.builder().inGdprScope(false).build(), + ""); + + final Account account = Account.builder() + .id(accountId) + .privacy(AccountPrivacyConfig.of(null, + null, + AccountDsaConfig.of(DefaultDsa.of(0, + 1, + 2, + List.of(DsaTransparency.of("", + List.of(0)))), + true), + null, + null)) + .build(); + given(applicationSettings.getAccountById(any(), any())).willReturn(Future.succeededFuture(account)); + + final AuctionContext auctionContext = AuctionContext.builder() + .bidRequest(bidRequest) + .account(account) + .privacyContext(privacyContext) + .build(); + + // when + final BidRequest result = target.enrichBidRequestWithAccountAndPrivacyData(auctionContext); + + // then + assertThat(result) + .extracting(BidRequest::getRegs) + .isNull(); + } + private static String bidRequestToString(BidRequest bidRequest) { try { return mapper.writeValueAsString(bidRequest);