package io.kaif.test;
import java.time.Instant;
import java.util.EnumSet;
import java.util.UUID;
import org.junit.Before;
import org.mockito.Mockito;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.DataSourceTransactionManagerAutoConfiguration;
import org.springframework.boot.autoconfigure.jdbc.JdbcTemplateAutoConfiguration;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
import org.springframework.context.annotation.Profile;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.junit4.AbstractTransactionalJUnit4SpringContextTests;
import io.kaif.config.ModelConfiguration;
import io.kaif.config.SpringProfile;
import io.kaif.config.UtilConfiguration;
import io.kaif.mail.MailAgent;
import io.kaif.model.account.Account;
import io.kaif.model.account.AccountDao;
import io.kaif.model.account.Authority;
import io.kaif.model.article.Article;
import io.kaif.model.article.ArticleDao;
import io.kaif.model.debate.Debate;
import io.kaif.model.debate.DebateDao;
import io.kaif.model.zone.ZoneDao;
import io.kaif.model.zone.ZoneInfo;
@ActiveProfiles(SpringProfile.TEST)
@SpringBootTest(classes = DbIntegrationTests.JdbcTestApplication.class)
public abstract class DbIntegrationTests extends AbstractTransactionalJUnit4SpringContextTests
implements ModelFixture {
@Profile(SpringProfile.TEST)
@ComponentScan(basePackages = { "io.kaif.model", "io.kaif.service" })
@Import(value = { DataSourceAutoConfiguration.class,
DataSourceTransactionManagerAutoConfiguration.class, JdbcTemplateAutoConfiguration.class,
ModelConfiguration.class, UtilConfiguration.class, MockTestConfig.class })
@Configuration
public static class JdbcTestApplication {
}
@Profile(SpringProfile.TEST)
@Configuration
static class MockTestConfig {
@Bean
public MailAgent mailAgent() {
return Mockito.mock(MailAgent.class);
}
}
@Autowired
protected MailAgent mockMailAgent;
@Autowired
private ZoneDao zoneDao;
@Autowired
private AccountDao accountDao;
@Autowired
private ArticleDao articleDao;
@Autowired
private DebateDao debateDao;
@Before
public void integrationSetUp() throws Exception {
Mockito.reset(mockMailAgent);
}
protected final ZoneInfo savedZoneKaif(String zone) {
return zoneDao.create(ZoneInfo.createKaif(zone, "kaif-" + zone, Instant.now()));
}
protected final ZoneInfo savedZoneDefault(String zone) {
return zoneDao.create(zoneDefault(zone));
}
protected final ZoneInfo savedZoneTourist(String zone) {
return zoneDao.create(ZoneInfo.createTourist(zone, "allow tourist", Instant.now()));
}
protected final Account savedAccountCitizen(String username) {
Account account = savedAccountTourist(username);
accountDao.updateAuthorities(account, EnumSet.of(Authority.CITIZEN, Authority.TOURIST));
return accountDao.findById(account.getAccountId()).get();
}
protected final Account savedAccountTourist(String username) {
return accountDao.create(username, username + "@example.com", username + "pwd", Instant.now());
}
protected final Article savedArticle(ZoneInfo zoneInfo, Account author, String title) {
return articleDao.createExternalLink(zoneInfo,
author,
title,
"http://example.com/" + title,
"http://example.com/" + title,
Instant.now());
}
protected final Debate savedDebate(Article article, String content, Debate parent) {
final Account debater = savedAccountCitizen(article.getAuthorName() + UUID.randomUUID());
return debateDao.create(article, parent, content, debater, Instant.now());
}
}