|
5 | 5 | import com.swyp.picke.domain.ad.enums.AdNetwork; |
6 | 6 | import com.swyp.picke.domain.ad.enums.AdSlotCode; |
7 | 7 | import com.swyp.picke.domain.ad.enums.AdStatus; |
| 8 | +import com.swyp.picke.domain.ad.enums.AdSource; |
8 | 9 | import com.swyp.picke.domain.ad.enums.AdTargetOs; |
9 | 10 | import com.swyp.picke.domain.ad.repository.AdCreativeRepository; |
10 | 11 | import java.time.LocalDate; |
@@ -147,6 +148,44 @@ void findServableAds_filtersByTargetOs() { |
147 | 148 | assertThat(result).extracting(AdResponse::code).containsExactlyInAnyOrder("ios00001", "all00001"); |
148 | 149 | } |
149 | 150 |
|
| 151 | + private AdCreative syncedAdpick(String code, String externalId) { |
| 152 | + AdCreative ad = creative(code, AdStatus.ACTIVE, 100, null, null); |
| 153 | + ReflectionTestUtils.setField(ad, "network", AdNetwork.ADPICK); |
| 154 | + ReflectionTestUtils.setField(ad, "source", AdSource.ADPICK_API); |
| 155 | + ReflectionTestUtils.setField(ad, "externalId", externalId); |
| 156 | + return ad; |
| 157 | + } |
| 158 | + |
| 159 | + @Test |
| 160 | + void excludesInstallCampaignsEvenWhenShoppingCannotFillRequestedSize() { |
| 161 | + var shopping = syncedAdpick("shop0001", "sh012345abcd"); |
| 162 | + var install = syncedAdpick("app00001", "ukjd9nru"); |
| 163 | + var signup = syncedAdpick("join0001", "hmvdx3t3"); |
| 164 | + var coupang = creative("coup0001", AdStatus.ACTIVE, 1, null, null); |
| 165 | + when(adCreativeRepository.findAllBySlotAndStatus(AdSlotCode.HOME_FEED, AdStatus.ACTIVE)) |
| 166 | + .thenReturn(List.of(shopping, install, signup, coupang)); |
| 167 | + |
| 168 | + assertThat(adQueryService.findServableAds(AdSlotCode.HOME_FEED, AdTargetOs.ALL, 10)) |
| 169 | + .extracting(AdResponse::code).containsExactlyInAnyOrder("shop0001", "coup0001"); |
| 170 | + } |
| 171 | + |
| 172 | + @Test |
| 173 | + void doesNotFallbackToInstallAdsWhenThereAreNoShoppingProducts() { |
| 174 | + when(adCreativeRepository.findAllBySlotAndStatus(AdSlotCode.HOME_FEED, AdStatus.ACTIVE)) |
| 175 | + .thenReturn(List.of(syncedAdpick("app00001", "ukjd9nru"), |
| 176 | + syncedAdpick("bad00001", null))); |
| 177 | + assertThat(adQueryService.findServableAds(AdSlotCode.HOME_FEED, AdTargetOs.ANDROID, 10)).isEmpty(); |
| 178 | + } |
| 179 | + |
| 180 | + @Test |
| 181 | + void landingAlsoExcludesInstallCampaigns() { |
| 182 | + when(adCreativeRepository.findAllByStatusOrderByIdDesc(AdStatus.ACTIVE)) |
| 183 | + .thenReturn(List.of(syncedAdpick("shop0001", "sh012345abcd"), |
| 184 | + syncedAdpick("app00001", "ukjd9nru"))); |
| 185 | + assertThat(adQueryService.findLandingAds()).extracting(AdResponse::code) |
| 186 | + .containsExactly("shop0001"); |
| 187 | + } |
| 188 | + |
150 | 189 | @Test |
151 | 190 | @DisplayName("노출 집계는 같은 날 반복 호출하면 기존 행을 누적한다") |
152 | 191 | void recordImpressions_incrementsExistingRow() { |
|
0 commit comments