package io.kaif.model.article; import static java.util.Arrays.asList; import static org.junit.Assert.*; import java.time.Duration; import java.time.Instant; import java.util.List; import org.junit.Before; import org.junit.Test; import org.springframework.beans.factory.annotation.Autowired; import io.kaif.flake.FlakeId; import io.kaif.model.account.Account; import io.kaif.model.zone.ZoneInfo; import io.kaif.rank.HotRanking; import io.kaif.test.DbIntegrationTests; public class ArticleDaoTest extends DbIntegrationTests { @Autowired private ArticleDao dao; private Account account; @Test public void hotRanking() throws Exception { assertHotRanking(0, 0, dayAt(1, 1)); assertHotRanking(10, 20, dayAt(3, 1)); assertHotRanking(390, 100, dayAt(12, 9)); assertHotRanking(2390, 81, dayAt(5, 25)); } private void assertHotRanking(long upVoted, long downVoted, Instant createTime) { assertEquals(HotRanking.score(upVoted, downVoted, createTime), dao.hotRanking(upVoted, downVoted, createTime), 0.001d); } @Test public void listHotZonesCacheForSameSize() throws Exception { ZoneInfo z1 = savedZoneDefault("zone1"); savedArticle(z1, account, "foo-title"); Instant articleSince = Instant.now().minus(Duration.ofDays(20)); List<ZoneInfo> cachedForSize10 = dao.listHotZonesWithCache(10, articleSince); assertSame(cachedForSize10, dao.listHotZonesWithCache(10, articleSince)); assertNotSame(cachedForSize10, dao.listHotZonesWithCache(20, articleSince)); } @Test public void loadArticleWithCache() throws Exception { ZoneInfo z1 = savedZoneDefault("zone1"); Article article = savedArticle(z1, account, "foo-title"); Article cached = dao.loadArticleWithCache(article.getArticleId()); assertEquals(article, cached); assertSame(cached, dao.loadArticleWithCache(article.getArticleId())); // modify trigger evict dao.markAsDeleted(article); assertNotSame(cached, dao.loadArticleWithCache(article.getArticleId())); } @Test public void listHotZonesWithCache() throws Exception { assertEquals(0, dao.listHotZonesWithCache(999, Instant.now()).size()); ZoneInfo z1 = savedZoneDefault("zone1"); ZoneInfo z2 = savedZoneDefault("zone2"); ZoneInfo z3 = savedZoneDefault("zone3"); ZoneInfo k = savedZoneKaif("kaif-x"); savedZoneDefault("zone4"); //no article Instant twoDaysAgo = dayAt(3, 1); Instant yesterday = dayAt(3, 2); Instant today = dayAt(3, 3); savedArticleWithId(z1, twoDaysAgo.minusSeconds(1)); savedArticleWithId(z1, twoDaysAgo.minusSeconds(2)); savedArticleWithId(z1, yesterday.plusSeconds(1)); savedArticleWithId(z1, yesterday.plusSeconds(2)); savedArticleWithId(z1, today.plusSeconds(1)); savedArticleWithId(z1, today.plusSeconds(2)); savedArticleWithId(z2, today.plusSeconds(3)); savedArticleWithId(z3, today.plusSeconds(4)); savedArticleWithId(z3, today.plusSeconds(5)); savedArticleWithId(z3, today.plusSeconds(6)); savedArticleWithId(k, yesterday.plusSeconds(3)); assertEquals(asList(z1, z3, z2), dao.listHotZonesWithCache(10, yesterday)); assertEquals(asList(z1, z3), dao.listHotZonesWithCache(2, yesterday)); assertEquals(asList(z3, z1, z2), dao.listHotZonesWithCache(20, today)); } @Before public void setUp() throws Exception { account = savedAccountCitizen("foo"); dao.evictAllCaches(); } private Article savedArticleWithId(ZoneInfo zoneInfo, Instant time) { Article article = Article.createExternalLink(zoneInfo.getZone(), zoneInfo.getAliasName(), FlakeId.startOf(time.toEpochMilli()), account, "title x", "http://foo.com", time); dao.insertArticle(article); return article; } }