test #433
@@ -18,6 +18,16 @@ class RecommendationScorePolicy {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun calculateCheerCreatorNewBoost(debutAt: LocalDateTime, now: LocalDateTime): Double {
|
||||||
|
val days = ChronoUnit.DAYS.between(debutAt.toLocalDate(), now.toLocalDate())
|
||||||
|
return when {
|
||||||
|
days <= RecommendationScoreSpec.NEW_BOOST_10_DAY_LIMIT -> RecommendationScoreSpec.CHEER_NEW_BOOST_10_DAYS
|
||||||
|
days <= RecommendationScoreSpec.NEW_BOOST_20_DAY_LIMIT -> RecommendationScoreSpec.CHEER_NEW_BOOST_20_DAYS
|
||||||
|
days <= RecommendationScoreSpec.NEW_BOOST_30_DAY_LIMIT -> RecommendationScoreSpec.CHEER_NEW_BOOST_30_DAYS
|
||||||
|
else -> RecommendationScoreSpec.DEFAULT_NEW_BOOST
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fun calculateDebutCreatorScore(
|
fun calculateDebutCreatorScore(
|
||||||
followIncrease: Long,
|
followIncrease: Long,
|
||||||
contentActivityScore: Long,
|
contentActivityScore: Long,
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ object RecommendationScoreSpec {
|
|||||||
const val AI_ACTIVE_USER_WEIGHT = 0.35
|
const val AI_ACTIVE_USER_WEIGHT = 0.35
|
||||||
const val AI_FOLLOW_INCREASE_WEIGHT = 0.20
|
const val AI_FOLLOW_INCREASE_WEIGHT = 0.20
|
||||||
|
|
||||||
const val CHEER_DONATION_AMOUNT_WEIGHT = 0.6
|
const val CHEER_DONATION_AMOUNT_WEIGHT = 0.45
|
||||||
const val CHEER_FAN_TALK_WEIGHT = 0.3
|
const val CHEER_FAN_TALK_WEIGHT = 0.3
|
||||||
const val CHEER_DONATION_COUNT_WEIGHT = 0.1
|
const val CHEER_DONATION_COUNT_WEIGHT = 0.1
|
||||||
|
|
||||||
@@ -27,5 +27,8 @@ object RecommendationScoreSpec {
|
|||||||
const val AI_NEW_BOOST_10_DAYS = 1.15
|
const val AI_NEW_BOOST_10_DAYS = 1.15
|
||||||
const val AI_NEW_BOOST_20_DAYS = 1.10
|
const val AI_NEW_BOOST_20_DAYS = 1.10
|
||||||
const val AI_NEW_BOOST_30_DAYS = 1.05
|
const val AI_NEW_BOOST_30_DAYS = 1.05
|
||||||
|
const val CHEER_NEW_BOOST_10_DAYS = 1.15
|
||||||
|
const val CHEER_NEW_BOOST_20_DAYS = 1.10
|
||||||
|
const val CHEER_NEW_BOOST_30_DAYS = 1.05
|
||||||
const val DEFAULT_NEW_BOOST = 1.0
|
const val DEFAULT_NEW_BOOST = 1.0
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -78,18 +78,37 @@ class RecommendationScorePolicyTest {
|
|||||||
@Test
|
@Test
|
||||||
@DisplayName("최근 응원 추천 점수는 후원 금액, 팬 Talk 수, 후원 수에 가중치를 적용한다")
|
@DisplayName("최근 응원 추천 점수는 후원 금액, 팬 Talk 수, 후원 수에 가중치를 적용한다")
|
||||||
fun shouldCalculateCheerScore() {
|
fun shouldCalculateCheerScore() {
|
||||||
assertEquals(0.6, RecommendationScoreSpec.CHEER_DONATION_AMOUNT_WEIGHT, 0.0001)
|
assertEquals(0.45, RecommendationScoreSpec.CHEER_DONATION_AMOUNT_WEIGHT, 0.0001)
|
||||||
assertEquals(0.3, RecommendationScoreSpec.CHEER_FAN_TALK_WEIGHT, 0.0001)
|
assertEquals(0.3, RecommendationScoreSpec.CHEER_FAN_TALK_WEIGHT, 0.0001)
|
||||||
assertEquals(0.1, RecommendationScoreSpec.CHEER_DONATION_COUNT_WEIGHT, 0.0001)
|
assertEquals(0.1, RecommendationScoreSpec.CHEER_DONATION_COUNT_WEIGHT, 0.0001)
|
||||||
|
|
||||||
val score = policy.calculateCheerScore(
|
assertEquals(0.0, policy.calculateCheerScore(0, 0, 0, 1.0), 0.0001)
|
||||||
donationAmount = 1000,
|
assertEquals(45.0, policy.calculateCheerScore(100, 0, 0, 1.0), 0.0001)
|
||||||
fanTalkCount = 20,
|
assertEquals(3.0, policy.calculateCheerScore(0, 10, 0, 1.0), 0.0001)
|
||||||
donationCount = 10,
|
assertEquals(1.0, policy.calculateCheerScore(0, 0, 10, 1.0), 0.0001)
|
||||||
newBoost = 1.2
|
assertEquals(49.0, policy.calculateCheerScore(100, 10, 10, 1.0), 0.0001)
|
||||||
)
|
assertEquals(56.35, policy.calculateCheerScore(100, 10, 10, 1.15), 0.0001)
|
||||||
|
}
|
||||||
|
|
||||||
assertEquals(728.4, score, 0.0001)
|
@Test
|
||||||
|
@DisplayName("최근 응원 크리에이터 신규 부스트는 데뷔일 기준 10일/20일/30일 구간을 적용한다")
|
||||||
|
fun shouldApplyCheerCreatorNewBoostByDebutDays() {
|
||||||
|
val now = LocalDateTime.of(2026, 5, 30, 12, 0)
|
||||||
|
|
||||||
|
assertEquals(1.15, RecommendationScoreSpec.CHEER_NEW_BOOST_10_DAYS, 0.0001)
|
||||||
|
assertEquals(1.10, RecommendationScoreSpec.CHEER_NEW_BOOST_20_DAYS, 0.0001)
|
||||||
|
assertEquals(1.05, RecommendationScoreSpec.CHEER_NEW_BOOST_30_DAYS, 0.0001)
|
||||||
|
assertEquals(1.15, policy.calculateCheerCreatorNewBoost(now, now), 0.0001)
|
||||||
|
assertEquals(1.15, policy.calculateCheerCreatorNewBoost(now.minusDays(10), now), 0.0001)
|
||||||
|
assertEquals(1.10, policy.calculateCheerCreatorNewBoost(now.minusDays(11), now), 0.0001)
|
||||||
|
assertEquals(1.10, policy.calculateCheerCreatorNewBoost(now.minusDays(20), now), 0.0001)
|
||||||
|
assertEquals(1.05, policy.calculateCheerCreatorNewBoost(now.minusDays(21), now), 0.0001)
|
||||||
|
assertEquals(1.05, policy.calculateCheerCreatorNewBoost(now.minusDays(30), now), 0.0001)
|
||||||
|
assertEquals(1.0, policy.calculateCheerCreatorNewBoost(now.minusDays(31), now), 0.0001)
|
||||||
|
|
||||||
|
assertEquals(1.5, policy.calculateCreatorNewBoost(now.minusDays(10), now), 0.0001)
|
||||||
|
assertEquals(1.3, policy.calculateCreatorNewBoost(now.minusDays(20), now), 0.0001)
|
||||||
|
assertEquals(1.2, policy.calculateCreatorNewBoost(now.minusDays(30), now), 0.0001)
|
||||||
}
|
}
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
|
|||||||
Reference in New Issue
Block a user