package org.springside.examples.miniweb.unit.dao.account;
import static org.junit.Assert.*;
import javax.sql.DataSource;
import org.junit.AfterClass;
import org.junit.Before;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springside.examples.miniweb.dao.account.RoleDao;
import org.springside.examples.miniweb.dao.account.UserDao;
import org.springside.examples.miniweb.entity.account.Role;
import org.springside.examples.miniweb.entity.account.User;
import org.springside.modules.test.spring.SpringTxTestCase;
import org.springside.modules.test.utils.DataUtils;
import org.springside.modules.test.utils.DbUnitUtils;
/**
* RoleDao的测试用例, 测试ORM映射及特殊的DAO操作.
*
* @author calvin
*/
@ContextConfiguration(locations = { "/applicationContext-test.xml" })
public class RoleDaoTest extends SpringTxTestCase {
private static DataSource dataSourceHolder = null;
@Autowired
private RoleDao roleDao;
@Autowired
private UserDao userDao;
@Before
public void loadDefaultData() throws Exception {
if (dataSourceHolder == null) {
DbUnitUtils.loadData(dataSource, "/data/default-data.xml");
dataSourceHolder = dataSource;
}
}
@AfterClass
public static void cleanDefaultData() throws Exception {
DbUnitUtils.removeData(dataSourceHolder, "/data/default-data.xml");
}
/**
* 测试删除角色时删除用户-角色的中间表.
*/
@Test
public void deleteRole() {
//新增测试角色并与admin用户绑定.
Role role = new Role();
role.setName(DataUtils.randomName("Role"));
roleDao.save(role);
User user = userDao.get(1L);
user.getRoleList().add(role);
userDao.save(user);
userDao.flush();
int oldJoinTableCount = countRowsInTable("ACCT_USER_ROLE");
int oldUserTableCount = countRowsInTable("ACCT_USER");
//删除用户角色, 中间表将减少1条记录,而用户表应该不受影响.
roleDao.delete(role.getId());
roleDao.flush();
int newJoinTableCount = countRowsInTable("ACCT_USER_ROLE");
int newUserTableCount = countRowsInTable("ACCT_USER");
assertEquals(1, oldJoinTableCount - newJoinTableCount);
assertEquals(0, oldUserTableCount - newUserTableCount);
}
}