Skip to content

Commit 4db1d94

Browse files
committed
Add units
1 parent 479e3a0 commit 4db1d94

12 files changed

Lines changed: 526 additions & 96 deletions

src/main/java/org/prebid/server/settings/FileApplicationSettings.java

Lines changed: 16 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -221,7 +221,7 @@ public Future<StoredDataResult<Profile>> getProfiles(String accountId,
221221

222222
final List<String> errors = new ArrayList<>();
223223
final Map<String, Profile> requestProfiles = getProfiles(accountId, requestIds, Profile.Type.REQUEST, errors);
224-
final Map<String, Profile> impProfiles = getProfiles(accountId, requestIds, Profile.Type.IMP, errors);
224+
final Map<String, Profile> impProfiles = getProfiles(accountId, impIds, Profile.Type.IMP, errors);
225225

226226
return Future.succeededFuture(StoredDataResult.of(
227227
requestProfiles,
@@ -237,14 +237,10 @@ private Map<String, Profile> getProfiles(String accountId,
237237
final Map<String, Profile> result = new HashMap<>();
238238

239239
for (String id : ids) {
240-
final Set<StoredItem<Profile>> profiles = SetUtils.predicatedSet(
241-
profileIdToProfile.getOrDefault(id, Collections.emptySet()),
242-
storedItem -> storedItem.getData().getType() == type);
240+
final Set<StoredItem<Profile>> profiles = profilesOfTypeWithId(type, id);
243241

244242
try {
245-
final StoredItem<Profile> profile = StoredItemResolver
246-
.resolve(type.toString(), accountId, id, profiles);
247-
243+
final StoredItem<Profile> profile = StoredItemResolver.resolve("profile", accountId, id, profiles);
248244
result.put(id, profile.getData());
249245
} catch (PreBidException e) {
250246
errors.add(e.getMessage());
@@ -254,6 +250,19 @@ private Map<String, Profile> getProfiles(String accountId,
254250
return Collections.unmodifiableMap(result);
255251
}
256252

253+
private Set<StoredItem<Profile>> profilesOfTypeWithId(Profile.Type type, String id) {
254+
final Set<StoredItem<Profile>> allProfiles = profileIdToProfile.get(id);
255+
if (CollectionUtils.isEmpty(allProfiles)
256+
|| allProfiles.stream().allMatch(storedItem -> storedItem.getData().getType() == type)) {
257+
258+
return allProfiles;
259+
}
260+
261+
return allProfiles.stream()
262+
.filter(storedItem -> storedItem.getData().getType() == type)
263+
.collect(Collectors.toSet());
264+
}
265+
257266
@Override
258267
public Future<StoredResponseDataResult> getStoredResponses(Set<String> responseIds, Timeout timeout) {
259268
if (CollectionUtils.isEmpty(responseIds)) {

src/main/java/org/prebid/server/settings/helper/DatabaseProfilesResultMapper.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -101,13 +101,11 @@ public static StoredDataResult<Profile> map(RowSet<Row> rowSet,
101101

102102
return StoredDataResult.of(
103103
storedItemsOrAddError(
104-
Profile.Type.REQUEST,
105104
accountId,
106105
requestIds,
107106
requestIdToProfiles,
108107
errors),
109108
storedItemsOrAddError(
110-
Profile.Type.IMP,
111109
accountId,
112110
impIds,
113111
impIdToProfiles,
@@ -138,7 +136,6 @@ private static void addStoredItem(String accountId,
138136
}
139137

140138
private static Map<String, Profile> storedItemsOrAddError(
141-
Profile.Type type,
142139
String accountId,
143140
Set<String> searchIds,
144141
Map<String, Set<StoredItem<Profile>>> foundIdToStoredItems,
@@ -159,7 +156,7 @@ private static Map<String, Profile> storedItemsOrAddError(
159156
for (String id : searchIds) {
160157
try {
161158
final StoredItem<Profile> resolvedStoredItem = StoredItemResolver
162-
.resolve(type.toString(), accountId, id, foundIdToStoredItems.get(id));
159+
.resolve("profile", accountId, id, foundIdToStoredItems.get(id));
163160

164161
result.put(id, resolvedStoredItem.getData());
165162
} catch (PreBidException e) {

src/main/java/org/prebid/server/settings/helper/DatabaseStoredDataResultMapper.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -151,7 +151,7 @@ private static Map<String, String> storedItemsOrAddError(StoredDataType type,
151151
for (String id : searchIds) {
152152
try {
153153
final StoredItem<String> resolvedStoredItem = StoredItemResolver
154-
.resolve(type.toString(), accountId, id, foundIdToStoredItems.get(id));
154+
.resolve("stored " + type.toString(), accountId, id, foundIdToStoredItems.get(id));
155155

156156
result.put(id, resolvedStoredItem.getData());
157157
} catch (PreBidException e) {

src/main/java/org/prebid/server/settings/helper/StoredItemResolver.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,22 +33,22 @@ private StoredItemResolver() {
3333
*/
3434
public static <T> StoredItem<T> resolve(String type, String accountId, String id, Set<StoredItem<T>> storedItems) {
3535
if (CollectionUtils.isEmpty(storedItems)) {
36-
throw new PreBidException("No stored %s found for id: %s".formatted(type, id));
36+
throw new PreBidException("No %s found for id: %s".formatted(type, id));
3737
}
3838

3939
// at least one stored item has account
4040
if (storedItems.size() > 1) {
4141
if (StringUtils.isEmpty(accountId)) {
4242
// we cannot choose stored item among multiple without account
4343
throw new PreBidException(
44-
"Multiple stored %ss found for id: %s but no account was specified".formatted(type, id));
44+
"Multiple %ss found for id: %s but no account was specified".formatted(type, id));
4545
}
4646

4747
return storedItems.stream()
4848
.filter(storedItem -> Objects.equals(storedItem.getAccountId(), accountId))
4949
.findAny()
5050
.orElseThrow(() -> new PreBidException(
51-
"No stored %s found among multiple id: %s for account: %s".formatted(type, id, accountId)));
51+
"No %s found among multiple id: %s for account: %s".formatted(type, id, accountId)));
5252
}
5353

5454
// only one stored item found
@@ -60,6 +60,6 @@ public static <T> StoredItem<T> resolve(String type, String accountId, String id
6060
return storedItem;
6161
}
6262

63-
throw new PreBidException("No stored %s found for id: %s for account: %s".formatted(type, id, accountId));
63+
throw new PreBidException("No %s found for id: %s for account: %s".formatted(type, id, accountId));
6464
}
6565
}

src/test/java/org/prebid/server/auction/requestfactory/AmpRequestFactoryTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1743,6 +1743,27 @@ public void shouldUpdateTimeout() {
17431743
.isEqualTo(10000L);
17441744
}
17451745

1746+
@Test
1747+
public void shouldUseProfilesResult() {
1748+
// given
1749+
givenBidRequest();
1750+
1751+
given(profilesProcessor.process(any(), any())).willAnswer(
1752+
invocation -> Future.succeededFuture(((BidRequest) invocation.getArgument(1)).toBuilder()
1753+
.source(Source.builder().tid("uniqTid").build())
1754+
.build()));
1755+
1756+
// when
1757+
final Future<AuctionContext> future = target.fromRequest(routingContext, 0L);
1758+
1759+
// then
1760+
assertThat(future).isSucceeded();
1761+
assertThat(future.result())
1762+
.extracting(AuctionContext::getBidRequest)
1763+
.extracting(BidRequest::getSource)
1764+
.isEqualTo(Source.builder().tid("uniqTid").build());
1765+
}
1766+
17461767
private void givenBidRequest(UnaryOperator<BidRequest.BidRequestBuilder> storedBidRequestBuilderCustomizer,
17471768
Imp... imps) {
17481769

src/test/java/org/prebid/server/auction/requestfactory/AuctionRequestFactoryTest.java

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -812,6 +812,27 @@ public void shouldUpdateTimeout() {
812812
.isEqualTo(10000L);
813813
}
814814

815+
@Test
816+
public void shouldUseProfilesResult() {
817+
// given
818+
givenValidBidRequest();
819+
820+
given(profilesProcessor.process(any(), any())).willAnswer(
821+
invocation -> Future.succeededFuture(((BidRequest) invocation.getArgument(1)).toBuilder()
822+
.source(Source.builder().tid("uniqTid").build())
823+
.build()));
824+
825+
// when
826+
target.enrichAuctionContext(defaultActionContext);
827+
828+
// then
829+
verify(paramsResolver).resolve(
830+
argThat(bidRequest -> bidRequest.getSource().equals(Source.builder().tid("uniqTid").build())),
831+
any(),
832+
any(),
833+
anyBoolean());
834+
}
835+
815836
private void givenBidRequest(BidRequest bidRequest) {
816837
try {
817838
given(requestBody.asString()).willReturn(mapper.writeValueAsString(bidRequest));

src/test/java/org/prebid/server/auction/requestfactory/Ortb2RequestFactoryTest.java

Lines changed: 30 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -547,40 +547,53 @@ public void shouldFetchAccountFromStoredAndReturnFailedFutureIfStoredLookupIsFai
547547
}
548548

549549
@Test
550-
public void shouldFetchAccountFromStoredAndReturnEmptyAccountIfStoredLookupIsFailed() {
551-
// given
552-
final BidRequest receivedBidRequest = givenBidRequest(identity());
553-
given(storedRequestProcessor.processAuctionRequest(any(), any()))
554-
.willReturn(Future.failedFuture(new RuntimeException("error")));
555-
550+
public void fetchAccountWithoutStoredRequestLookupShouldNeverCallStoredProcessor() {
556551
// when
557-
final Future<Account> result = target.fetchAccount(
552+
target.fetchAccountWithoutStoredRequestLookup(
558553
AuctionContext.builder()
559554
.httpRequest(httpRequest)
560-
.bidRequest(receivedBidRequest)
555+
.bidRequest(givenBidRequest(identity()))
561556
.timeoutContext(TimeoutContext.of(0, null, 0))
562557
.build());
563558

564559
// then
565-
verify(storedRequestProcessor).processAuctionRequest("", receivedBidRequest);
566-
verifyNoInteractions(applicationSettings);
567-
568-
assertThat(result.failed()).isTrue();
569-
assertThat(result.cause()).hasMessage("error");
560+
verifyNoInteractions(storedRequestProcessor);
570561
}
571562

572563
@Test
573-
public void fetchAccountWithoutStoredRequestLookupShouldNeverCallStoredProcessor() {
564+
public void shouldFetchAccountFromProfileIfStoredLookupIsTrueAndAccountIsNotFoundPreviously() {
565+
// given
566+
final BidRequest receivedBidRequest = givenBidRequest(identity());
567+
568+
final String accountId = "accountId";
569+
final BidRequest mergedBidRequest = givenBidRequest(builder -> builder
570+
.site(Site.builder()
571+
.publisher(Publisher.builder().id(accountId).build())
572+
.build()));
573+
574+
given(storedRequestProcessor.processAuctionRequest(any(), any()))
575+
.willAnswer(invocation -> Future.succeededFuture(
576+
AuctionStoredResult.of(false, invocation.getArgument(1))));
577+
given(profilesProcessor.process(any(), any()))
578+
.willReturn(Future.succeededFuture(mergedBidRequest));
579+
580+
final Account fetchedAccount = Account.builder().id(accountId).status(AccountStatus.active).build();
581+
given(applicationSettings.getAccountById(eq(accountId), any()))
582+
.willReturn(Future.succeededFuture(fetchedAccount));
583+
574584
// when
575-
target.fetchAccountWithoutStoredRequestLookup(
585+
final Future<Account> result = target.fetchAccount(
576586
AuctionContext.builder()
577587
.httpRequest(httpRequest)
578-
.bidRequest(givenBidRequest(identity()))
588+
.bidRequest(receivedBidRequest)
579589
.timeoutContext(TimeoutContext.of(0, null, 0))
580590
.build());
581591

582592
// then
583-
verifyNoInteractions(storedRequestProcessor);
593+
verify(storedRequestProcessor).processAuctionRequest("", receivedBidRequest);
594+
verify(applicationSettings).getAccountById(eq(accountId), any());
595+
596+
assertThat(result.result()).isEqualTo(fetchedAccount);
584597
}
585598

586599
@Test

src/test/java/org/prebid/server/metric/MetricsTest.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1571,6 +1571,26 @@ public void shouldIncrementPrebidCacheCreativeTtlHistogram() {
15711571
.isEqualTo(1);
15721572
}
15731573

1574+
@Test
1575+
public void shouldIncrementUpdateProfileMetric() {
1576+
// when
1577+
metrics.updateProfileMetric(MetricName.limit_exceeded);
1578+
1579+
// then
1580+
assertThat(metricRegistry.counter("profiles.limit_exceeded").getCount())
1581+
.isEqualTo(1);
1582+
}
1583+
1584+
@Test
1585+
public void shouldIncrementUpdateAccountProfileMetric() {
1586+
// when
1587+
metrics.updateAccountProfileMetric("accountId", MetricName.limit_exceeded);
1588+
1589+
// then
1590+
assertThat(metricRegistry.counter("account.accountId.profiles.limit_exceeded").getCount())
1591+
.isEqualTo(1);
1592+
}
1593+
15741594
private void verifyCreatesConfiguredCounterType(Consumer<Metrics> metricsConsumer) {
15751595
final EnumMap<CounterType, Class<? extends Metric>> counterTypeClasses = new EnumMap<>(CounterType.class);
15761596
counterTypeClasses.put(CounterType.counter, Counter.class);

0 commit comments

Comments
 (0)