package org.jtalks.poulpe.model.dao.hibernate;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.jtalks.common.model.entity.Group;
import org.jtalks.poulpe.model.dao.GroupDao;
import org.jtalks.poulpe.model.entity.PoulpeBranch;
import org.jtalks.poulpe.model.entity.PoulpeSection;
import org.jtalks.poulpe.model.entity.PoulpeUser;
import org.jtalks.poulpe.model.fixtures.TestFixtures;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTransactionalTestNGSpringContextTests;
import org.springframework.test.context.transaction.TransactionConfiguration;
import org.springframework.transaction.annotation.Transactional;
import org.testng.annotations.BeforeMethod;
import org.testng.annotations.Test;
import java.util.List;
import static org.testng.Assert.*;
import static org.unitils.reflectionassert.ReflectionAssert.assertReflectionEquals;
/**
* @author Leonid Kazancev
*/
@ContextConfiguration(locations = {"classpath:/org/jtalks/poulpe/model/entity/applicationContext-dao.xml"})
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)
@Transactional
public class GroupHibernateDaoTest extends AbstractTransactionalTestNGSpringContextTests {
static final String NO_FILTER = "";
@Autowired
private GroupDao dao;
@Autowired
private SessionFactory sessionFactory;
private Session session;
@BeforeMethod
public void setUp() throws Exception {
session = sessionFactory.getCurrentSession();
}
@Test
public void testSave() {
Group group = TestFixtures.group();
saveAndEvict(group);
Group savedGroup = (Group) session.get(Group.class, group.getId());
assertReflectionEquals(group, savedGroup);
}
@Test
public void testSaveIdGeneration() {
Group group = TestFixtures.group();
long initialId = 0;
group.setId(initialId);
saveAndEvict(group);
assertNotSame(group.getId(), initialId, "ID is not created");
}
@Test
public void testGetById() {
Group group = TestFixtures.group();
saveAndEvict(group);
Group actual = dao.get(group.getId());
assertReflectionEquals(actual, group);
}
@Test
public void testGetAll() {
Group group0 = TestFixtures.group();
saveAndEvict(group0);
Group group1 = TestFixtures.group();
saveAndEvict(group1);
List<Group> actual = dao.getAll();
assertEquals(actual.size(), 2);
assertReflectionEquals(actual.get(0), group0);
assertReflectionEquals(actual.get(1), group1);
}
@Test
public void testGetByNameContains() {
Group group = TestFixtures.group();
saveAndEvict(group);
List<Group> actual = dao.getByNameContains(group.getName());
assertEquals(actual.size(), 1);
assertReflectionEquals(actual.get(0), group);
}
@Test
public void testGetByNameContainsWithEmptyName() {
Group group = TestFixtures.group();
saveAndEvict(group);
group = TestFixtures.group();
saveAndEvict(group);
List<Group> actual = dao.getByNameContains(NO_FILTER);
List<Group> all = dao.getAll();
assertEquals(actual, all);
}
@Test
public void testGetByName() {
Group group = TestFixtures.group();
saveAndEvict(group);
List<Group> actual = dao.getByName(group.getName());
assertEquals(actual.size(), 1);
assertReflectionEquals(actual.get(0), group);
}
@Test
public void testGetByNameFailWithEmptyString() {
Group group = TestFixtures.group();
saveAndEvict(group);
List<Group> actual = dao.getByName(NO_FILTER);
assertEquals(actual.size(), 0);
}
@Test
public void testGetByNameLowerCase() {
Group group = TestFixtures.group();
saveAndEvict(group);
List<Group> actual = dao.getByName(group.getName().toLowerCase());
assertEquals(actual.size(), 1);
assertReflectionEquals(actual.get(0), group);
}
@Test
public void testGetByNameUpperCase() {
Group group = TestFixtures.group();
saveAndEvict(group);
List<Group> actual = dao.getByName(group.getName().toUpperCase());
assertEquals(actual.size(), 1);
assertReflectionEquals(actual.get(0), group);
}
@Test
public void testGetByNameWithSpecialChars() {
Group group = TestFixtures.group();
group.setName("!@#$%^&*()\"\'\\/");
saveAndEvict(group);
List<Group> actual = dao.getByName(group.getName());
assertEquals(actual.size(), 1);
assertReflectionEquals(actual.get(0), group);
}
@Test
public void getGetUsersCount() {
int count = 5;
Group group = TestFixtures.groupWithUsers();
saveAndEvict(group);
int actual = dao.get(group.getId()).getUsers().size();
assertEquals(actual, count);
}
@Test
public void testGetModeratingBranches() {
PoulpeBranch branch = TestFixtures.branch();
Group group = new Group("name", "description");
branch.setModeratorsGroup(group);
saveAndEvict(branch);
List<PoulpeBranch> actual = dao.getModeratingBranches(group);
assertEquals(actual.get(0), branch);
}
@Test
public void testGetModeratingBranchesNotModeratorGroup() {
Group group = TestFixtures.group();
saveAndEvict(group);
List<PoulpeBranch> actual = dao.getModeratingBranches(group);
assertEquals(actual.size(), 0);
}
@Test
public void testDeleteGroup(){
Group group = TestFixtures.group();
saveAndEvict(group);
dao.delete(group);
Group actual = dao.get(group.getId());
assertNull(actual);
}
private void saveAndEvict(PoulpeBranch branch) {
saveAndEvict(branch.getModeratorsGroup());
PoulpeSection section = TestFixtures.section();
branch.setSection(section);
session.save(section);
session.save(branch);
session.flush();
session.clear();
}
private void saveAndEvict(PoulpeUser user) {
session.save(user);
session.flush();
session.clear();
}
private void saveAndEvict(Group group) {
saveAndEvict((Iterable<PoulpeUser>) (Object) group.getUsers());
session.save(group);
session.flush();
session.clear();
}
private void saveAndEvict(Iterable<PoulpeUser> users) {
for (PoulpeUser user : users) {
saveAndEvict(user);
}
}
}