package io.kaif.service.impl;
import static java.util.Arrays.asList;
import static org.junit.Assert.*;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import java.util.stream.IntStream;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import io.kaif.model.account.Account;
import io.kaif.model.account.AccountDao;
import io.kaif.model.account.Authority;
import io.kaif.model.exception.CreditNotEnoughException;
import io.kaif.model.zone.Zone;
import io.kaif.model.zone.ZoneDao;
import io.kaif.model.zone.ZoneInfo;
import io.kaif.service.ZoneService;
import io.kaif.test.DbIntegrationTests;
import io.kaif.web.support.AccessDeniedException;
public class ZoneServiceImplTest extends DbIntegrationTests {
@Autowired
private ZoneService service;
@Autowired
private ZoneDao zoneDao;
@Autowired
private AccountDao accountDao;
private Account citizen;
@Before
public void setUp() throws Exception {
citizen = savedAccountCitizen("citizen1");
}
@Test
public void createDefault() throws Exception {
ZoneInfo zoneInfo = service.createDefault("abc", "Abc");
ZoneInfo loaded = zoneDao.loadZoneWithoutCache(Zone.valueOf("abc"));
assertEquals(zoneInfo, loaded);
assertEquals("abc", loaded.getName());
assertEquals("Abc", loaded.getAliasName());
assertEquals(Authority.CITIZEN, loaded.getVoteAuthority());
assertEquals(Authority.CITIZEN, loaded.getWriteAuthority());
assertEquals(Authority.CITIZEN, loaded.getDebateAuthority());
assertEquals(ZoneInfo.THEME_DEFAULT, loaded.getTheme());
assertFalse(loaded.isHideFromTop());
assertEquals(0, loaded.getAdminAccountIds().size());
}
@Test
public void createDefault_not_allow_reserve_word() throws Exception {
try {
service.createDefault("kaif", "ABC");
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException expected) {
}
try {
service.createDefault("kaif-abc", "ABC");
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException expected) {
}
try {
service.createDefault("abckaifabc", "ABC");
fail("IllegalArgumentException expected");
} catch (IllegalArgumentException expected) {
}
}
@Test
public void createKaif() throws Exception {
ZoneInfo zoneInfo = service.createKaif("faq", "FAQ");
ZoneInfo loaded = zoneDao.loadZoneWithoutCache(Zone.valueOf("faq"));
assertEquals(zoneInfo, loaded);
assertEquals("faq", loaded.getZone().value());
assertEquals("FAQ", loaded.getAliasName());
assertEquals(Authority.CITIZEN, loaded.getVoteAuthority());
assertEquals(Authority.CITIZEN, loaded.getDebateAuthority());
assertEquals(Authority.FORBIDDEN, loaded.getWriteAuthority());
assertEquals(ZoneInfo.THEME_KAIF, loaded.getTheme());
assertTrue(loaded.isHideFromTop());
assertEquals(0, loaded.getAdminAccountIds().size());
}
@Test
public void getZone_cached() throws Exception {
service.createDefault("def", "dddd");
ZoneInfo cached = service.loadZone(Zone.valueOf("def"));
assertSame(cached, service.loadZone(Zone.valueOf("def")));
}
@Test
public void listCitizenZones() throws Exception {
ZoneInfo about = service.createDefault("about", "about-alias");
ZoneInfo abc = service.createDefault("abc", "abc-alias");
service.createKaif("kaif-java", "java-alias");
ZoneInfo groovy = service.createDefault("groovy", "groovy-alias");
assertEquals(asList(abc, about, groovy), service.listCitizenZones());
}
@Test
public void listZoneAtoZ() throws Exception {
ZoneInfo about = service.createDefault("about", "about-alias");
ZoneInfo abc = service.createDefault("abc", "abc-alias");
ZoneInfo java = service.createDefault("java", "java-alias");
ZoneInfo groovy = service.createDefault("groovy", "groovy-alias");
Map<String, List<ZoneInfo>> aToZ = service.listZoneAtoZ();
//key iteration must ordered
Iterator<String> cat = aToZ.keySet().iterator();
assertEquals("A", cat.next());
assertEquals(asList(abc, about), aToZ.get("A"));
assertEquals("G", cat.next());
assertEquals(asList(groovy), aToZ.get("G"));
assertEquals("J", cat.next());
assertEquals(asList(java), aToZ.get("J"));
}
@Test
public void updateTheme() throws Exception {
service.createDefault("twfaq", "TW FAQ");
service.loadZone(Zone.valueOf("twfaq"));//populate cache
service.updateTheme(Zone.valueOf("twfaq"), ZoneInfo.THEME_KAIF);
assertEquals(ZoneInfo.THEME_KAIF, service.loadZone(Zone.valueOf("twfaq")).getTheme());
}
@Test
public void listRecommendZones() throws Exception {
ZoneInfo z1 = service.createDefault("zone1", "Zone 1");
ZoneInfo z2 = service.createDefault("zone2", "Zone 2");
ZoneInfo z3 = service.createDefault("zone3", "No article zone");
ZoneInfo z4 = service.createDefault("zone4", "Zone 4");
Account account = savedAccountCitizen("foobar");
IntStream.rangeClosed(1, 10).forEach(i -> {
savedArticle(z1, account, i + " z1 - title");
savedArticle(z2, account, i + " z2 - title");
savedArticle(z4, account, i + " z4 - title");
});
assertTrue(service.listRecommendZones().containsAll(asList(z1, z2, z3, z4)));
}
@Test
public void createByUser() throws Exception {
accountDao.changeTotalVotedDebate(citizen.getAccountId(), 10, 0);
ZoneInfo zoneInfo = service.createByUser("aaa", "this is aaa", citizen);
ZoneInfo loaded = zoneDao.loadZoneWithoutCache(Zone.valueOf("aaa"));
assertEquals(zoneInfo, loaded);
assertEquals("aaa", loaded.getName());
assertEquals("this is aaa", loaded.getAliasName());
assertEquals(Authority.CITIZEN, loaded.getVoteAuthority());
assertEquals(Authority.CITIZEN, loaded.getWriteAuthority());
assertEquals(Authority.CITIZEN, loaded.getDebateAuthority());
assertEquals(ZoneInfo.THEME_DEFAULT, loaded.getTheme());
assertFalse(loaded.isHideFromTop());
assertEquals(citizen.getAccountId(), loaded.getAdminAccountIds().get(0));
List<ZoneInfo> zones = zoneDao.listZonesByAdmin(citizen.getAccountId());
assertEquals(zoneInfo, zones.get(0));
}
@Test
public void createByUser_not_enough_honor_score() throws Exception {
try {
service.createByUser("aaa", "this is aaa", citizen);
fail("CreditNotEnoughException expected");
} catch (CreditNotEnoughException expected) {
}
}
@Test
public void createByUser_must_be_citizen() throws Exception {
try {
Account tourist = savedAccountTourist("tourist");
accountDao.changeTotalVotedDebate(tourist.getAccountId(), 10, 0);
service.createByUser("aaa", "this is aaa", tourist);
fail("AccessDeniedException expected");
} catch (AccessDeniedException expected) {
}
}
@Test
public void createByUser_10_per_zone() throws Exception {
accountDao.changeTotalVotedDebate(citizen.getAccountId(), 30, 0);
service.createByUser("aaa1", "this is aaa1", citizen);
service.createByUser("aaa2", "this is aaa2", citizen);
service.createByUser("aaa3", "this is aaa3", citizen);
try {
service.createByUser("aaa4", "this is aaa4", citizen);
fail("CreditNotEnoughException expected");
} catch (CreditNotEnoughException expected) {
}
}
@Test
public void createByUser_max_5_zone() throws Exception {
accountDao.changeTotalVotedDebate(citizen.getAccountId(), 60, 0);
service.createByUser("aaa1", "this is aaa1", citizen);
service.createByUser("aaa2", "this is aaa2", citizen);
service.createByUser("aaa3", "this is aaa3", citizen);
service.createByUser("aaa4", "this is aaa4", citizen);
service.createByUser("aaa5", "this is aaa5", citizen);
try {
service.createByUser("aaa6", "this is aaa6", citizen);
fail("CreditNotEnoughException expected");
} catch (CreditNotEnoughException expected) {
}
}
@Test
public void canCreateZone() throws Exception {
assertFalse(service.canCreateZone(citizen));
accountDao.changeTotalVotedDebate(citizen.getAccountId(), 60, 0);
assertTrue(service.canCreateZone(citizen));
}
@Test
public void isZoneAvailable() {
assertFalse(service.isZoneAvailable("kaif-ok"));
assertFalse(service.isZoneAvailable("kaif-null"));
assertFalse(service.isZoneAvailable("null"));
assertFalse(service.isZoneAvailable("s"));
assertTrue(service.isZoneAvailable("aaa"));
savedZoneDefault("aaa");
assertFalse(service.isZoneAvailable("aaa"));
}
@Test
public void listAdministerZones() {
assertTrue(service.listAdministerZones(citizen.getUsername()).isEmpty());
accountDao.changeTotalVotedDebate(citizen.getAccountId(), 30, 0);
ZoneInfo bZone = service.createByUser("bbb1", "this is aaa1", citizen);
ZoneInfo aZone = service.createByUser("aaa2", "this is aaa2", citizen);
List<ZoneInfo> administerZones = service.listAdministerZones(citizen.getUsername());
assertEquals(2, administerZones.size());
assertEquals(aZone, administerZones.get(0));
assertEquals(bZone, administerZones.get(1));
}
@Test
public void listAdministrators() {
Zone zone = Zone.valueOf("foo");
assertTrue(service.listAdministratorsWithCache(zone).isEmpty());
accountDao.changeTotalVotedDebate(citizen.getAccountId(), 30, 0);
service.createByUser("foo", "this is aaa2", citizen);
List<String> administerNames = service.listAdministratorsWithCache(zone);
assertEquals(asList(citizen.getUsername()), administerNames);
}
}