package com.jinhe.tss.um;
import java.io.File;
import java.util.List;
import org.apache.log4j.Logger;
import org.dom4j.Document;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.mock.web.MockHttpServletResponse;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit38.AbstractTransactionalJUnit38SpringContextTests;
import org.springframework.test.context.transaction.TransactionConfiguration;
import com.jinhe.tss.component.dynproperty.support.IRemotePropertyService;
import com.jinhe.tss.component.log.maintain.LogService;
import com.jinhe.tss.component.support.test.IH2DBServer;
import com.jinhe.tss.component.support.test.TestUtil;
import com.jinhe.tss.core.Global;
import com.jinhe.tss.core.sso.IdentityCard;
import com.jinhe.tss.core.sso.TokenUtil;
import com.jinhe.tss.core.sso.context.Context;
import com.jinhe.tss.core.util.FileHelper;
import com.jinhe.tss.core.util.URLUtil;
import com.jinhe.tss.core.util.XMLDocUtil;
import com.jinhe.tss.um.entity.Group;
import com.jinhe.tss.um.helper.dto.OperatorDTO;
import com.jinhe.tss.um.permission.PermissionHelper;
import com.jinhe.tss.um.permission.PermissionService;
import com.jinhe.tss.um.permission.ResourcePermission;
import com.jinhe.tss.um.service.IGroupService;
import com.jinhe.tss.um.service.ILoginService;
import com.jinhe.tss.um.service.IResourceRegisterService;
/**
* Junit Test 类里执行构造函数的时候无事务,即构造函数不在单元测试方法的事物边界内。
*/
@ContextConfiguration(
locations={
"classpath:spring/testUMApplicationContext.xml",
"classpath:spring/component-applicationContext.xml",
"classpath:spring/core-applicationContext.xml",
"classpath:spring/um-applicationContext.xml"
}
, inheritLocations = false // 是否要继承父测试用例类中的 Spring 配置文件,默认为 true
)
@TransactionConfiguration(defaultRollback = false) // 不自动回滚,否则后续的test中没有初始化的数据
public abstract class TxSupportTest4UM extends AbstractTransactionalJUnit38SpringContextTests {
protected Logger log = Logger.getLogger(this.getClass());
@Autowired protected IResourceRegisterService resourceRegisterService;
@Autowired protected ResourcePermission resourcePermission;
@Autowired protected IRemotePropertyService propertyService;
@Autowired protected IGroupService groupService;
@Autowired protected ILoginService loginSerivce;
@Autowired protected PermissionService permissionService;
@Autowired protected PermissionHelper permissionHelper;
@Autowired protected LogService logService;
@Autowired protected IH2DBServer dbserver;
protected void tearDown() throws Exception {
super.tearDown();
dbserver.stopServer();
}
protected void setUp() throws Exception {
super.setUp();
Global.setContext(super.applicationContext);
Context.setResponse(new MockHttpServletResponse());
// DB数据在一轮跑多个单元测试中初始化一次就够了。
if( dbserver.isPrepareed() ) {
return;
}
init();
dbserver.setPrepareed(true);
}
/**
* 初始化UM、CMS、Portal相关应用、资源类型、权限选型信息
*/
protected void init() {
// 初始化数据库脚本
String sqlpath = TestUtil.getInitSQLDir();
log.info( " sql path : " + sqlpath);
TestUtil.excuteSQL(sqlpath + "/component");
TestUtil.excuteSQL(sqlpath + "/um");
// 初始化虚拟登录用户信息
login(UMConstants.ADMIN_USER_ID, UMConstants.ADMIN_USER_NAME);
/* 初始化应用系统、资源、权限项 */
Document doc = XMLDocUtil.createDocByAbsolutePath(sqlpath + "/um-application-config.xml");
resourceRegisterService.setInitial(true);
resourceRegisterService.applicationRegisterByXML(doc, UMConstants.PLATFORM_SYSTEM_APP);
resourceRegisterService.setInitial(false);
// 补全SQL初始化出来的系统级用户组
Long[] groupIds = new Long[] {-2L, -3L, -4L, -7L, -8L, -9L};
for(Long groupId : groupIds) {
Group group = groupService.getGroupById(groupId);
if ( Group.MAIN_GROUP_TYPE.equals( group.getGroupType() ) ) {
resourcePermission.addResource(group.getId(), UMConstants.MAINGROUP_RESOURCE_TYPE_ID);
}
if ( Group.ASSISTANT_GROUP_TYPE.equals( group.getGroupType() )) {
resourcePermission.addResource(group.getId(), UMConstants.ASSISTANTGROUP_RESOURCE_TYPE_ID);
}
if ( Group.OTHER_GROUP_TYPE.equals( group.getGroupType() ) ) {
resourcePermission.addResource(group.getId(), UMConstants.OTHERAPPGROUP_RESOURCE_TYPE_ID);
}
}
/** 注册动态属性实体(包括用户,各种用户组等) */
File templatePath = new File(URLUtil.getResourceFileUrl(TestUtil.DYN_ENTITY_CONFIG_PATH).getFile());
List<String> files = FileHelper.listFilesByType(".xml", templatePath);
for(String fileNanme : files ){
Document tempDoc = XMLDocUtil.createDoc(TestUtil.DYN_ENTITY_CONFIG_PATH + "/" + fileNanme);
propertyService.importDynableEntity(tempDoc.asXML());
}
}
protected void login(Long userId, String loginName) {
OperatorDTO loginUser = new OperatorDTO(userId, loginName);
String token = TokenUtil.createToken("1234567890", userId);
IdentityCard card = new IdentityCard(token, loginUser);
Context.initIdentityInfo(card);
// 获取登陆用户的权限(拥有的角色)并保存到用户权限(拥有的角色)对应表
List<Object[]> userRoles = loginSerivce.getUserRolesAfterLogin(userId);
permissionService.saveUserRolesAfterLogin(userRoles, userId);
}
}