@isTest private class UserProfileHandlerTest { @isTest static void futureInsertGroupMember() { // 新建 Group Group insertGroup = new Group( Name = 'UserProfileHandlerTest_G1_' + System.now().getTime() ); insert insertGroup; Test.startTest(); UserProfileHandler.futureInsertGroupMember('{"' + insertGroup.Id + '": "' + UserInfo.getUserId() + '"}'); Test.stopTest(); Group g1 = [SELECT Id, Name FROM Group WHERE Type = 'Regular' AND Name LIKE 'UserProfileHandlerTest_G1_%']; System.assert(g1.Name.startsWith('UserProfileHandlerTest_G1_')); GroupMember gm1 = [SELECT Id, UserOrGroupId FROM GroupMember WHERE GroupId =: g1.Id]; System.assertEquals(UserInfo.getUserId(), gm1.UserOrGroupId); } /** * new User x 4 with Group(既存) x 2 */ @isTest static void dynamicUpdateGroup_CreateUser() { // 做数据 setupAccount(new List {'备品共享_其他_备品管理中心', '备品共享_上海_华东营业本部'}); Map findGroupNameMap = new Map(); for (Group grp : [SELECT Id, Name FROM Group WHERE Type = 'Regular' AND Name LIKE '备品共享_%']) { findGroupNameMap.put(grp.Name, grp); } List grpList = new List(); Group g1 = findGroupNameMap.get('备品共享_其他_备品管理中心'); if (null == g1) { g1 = new Group(Name = '备品共享_其他_备品管理中心'); grpList.add(g1); } Group g2 = findGroupNameMap.get('备品共享_上海_华东营业本部'); if (null == g2) { g2 = new Group(Name = '备品共享_上海_华东营业本部'); grpList.add(g2); } insert grpList; Test.startTest(); UserProfileHandler.testTargetDepts = new Set {'医疗备品管理中心', '医疗华东营业本部'}; List g1_Users = setupUsers('G1', '其他', '医疗备品管理中心'); List g2_Users = setupUsers('G2', '上海', '医疗华东营业本部'); Test.stopTest(); List g1Members = [SELECT Id, UserOrGroupId FROM GroupMember WHERE GroupId =: g1.Id ORDER BY UserOrGroupId]; List g2Members = [SELECT Id, UserOrGroupId FROM GroupMember WHERE GroupId =: g2.Id ORDER BY UserOrGroupId]; System.assertEquals(2, g1Members.size()); //System.assertEquals(2, g2Members.size()); System.assertEquals(g1_Users[0].Id, g1Members[0].UserOrGroupId); System.assertEquals(g1_Users[1].Id, g1Members[1].UserOrGroupId); //System.assertEquals(g2_Users[0].Id, g2Members[0].UserOrGroupId); //System.assertEquals(g2_Users[1].Id, g2Members[1].UserOrGroupId); } /** * new User x 4, new Group x 2 */ @isTest static void dynamicUpdateGroup_CreateGroupCreateUser() { // 做数据 setupAccount(new List {'备品共享_其他_CreateGroup1', '备品共享_其他_CreateGroup2'}); Test.startTest(); UserProfileHandler.testTargetDepts = new Set {'CreateGroup1', 'CreateGroup2'}; List g1_Users = setupUsers('G1', '其他', 'CreateGroup1'); List g2_Users = setupUsers('G2', '其他', 'CreateGroup2'); Test.stopTest(); List gList = [SELECT Id, Name FROM Group WHERE Type = 'Regular' AND Name LIKE '备品共享_其他_%' ORDER BY Name]; System.assertEquals(2, gList.size()); System.assertEquals('备品共享_其他_CreateGroup1', gList[0].Name); System.assertEquals('备品共享_其他_CreateGroup2', gList[1].Name); List gMembers = [SELECT Id, UserOrGroupId FROM GroupMember WHERE GroupId IN: gList ORDER BY GroupId, UserOrGroupId]; System.assertEquals(4, gMembers.size()); System.assertEquals(g1_Users[0].Id, gMembers[0].UserOrGroupId); System.assertEquals(g1_Users[1].Id, gMembers[1].UserOrGroupId); System.assertEquals(g2_Users[0].Id, gMembers[2].UserOrGroupId); System.assertEquals(g2_Users[1].Id, gMembers[3].UserOrGroupId); } /** * update User x 4 with Group(既存) x 2 to new Group x 2 */ @isTest static void dynamicUpdateGroup_ChangeGroup() { // 做数据 like #dynamicUpdateGroup_CreateUser() setupAccount(new List {'备品共享_其他_备品管理中心', '备品共享_上海_华东营业本部', '备品共享_其他_CreateGroup1', '备品共享_上海_CreateGroup2'}); Map findGroupNameMap = new Map(); for (Group grp : [SELECT Id, Name FROM Group WHERE Type = 'Regular' AND Name LIKE '备品共享_%']) { findGroupNameMap.put(grp.Name, grp); } List grpList = new List(); Group g1 = findGroupNameMap.get('备品共享_其他_备品管理中心'); if (null == g1) { g1 = new Group(Name = '备品共享_其他_备品管理中心'); grpList.add(g1); } Group g2 = findGroupNameMap.get('备品共享_上海_华东营业本部'); if (null == g2) { g2 = new Group(Name = '备品共享_上海_华东营业本部'); grpList.add(g2); } insert grpList; UserProfileHandler.testTargetDepts = new Set {'医疗备品管理中心', '医疗华东营业本部'}; List g1_Users = setupUsers('G1', '其他', '医疗备品管理中心'); List g2_Users = setupUsers('G2', '上海', '医疗华东营业本部'); // 做数据 的 assert List g1Members = [SELECT Id, UserOrGroupId FROM GroupMember WHERE GroupId =: g1.Id ORDER BY UserOrGroupId]; List g2Members = [SELECT Id, UserOrGroupId FROM GroupMember WHERE GroupId =: g2.Id ORDER BY UserOrGroupId]; System.assertEquals(2, g1Members.size()); //System.assertEquals(2, g2Members.size()); System.assertEquals(g1_Users[0].Id, g1Members[0].UserOrGroupId); System.assertEquals(g1_Users[1].Id, g1Members[1].UserOrGroupId); // System.assertEquals(g2_Users[0].Id, g2Members[0].UserOrGroupId); //System.assertEquals(g2_Users[1].Id, g2Members[1].UserOrGroupId); Test.startTest(); UserProfileHandler.testTargetDepts = new Set {'CreateGroup1', 'CreateGroup2'}; g1_Users[0].Dept__c = 'CreateGroup1'; g1_Users[1].Dept__c = 'CreateGroup1'; g2_Users[0].Dept__c = 'CreateGroup2'; g2_Users[1].Dept__c = 'CreateGroup2'; List updUserList = new List(); updUserList.addAll(g1_Users); updUserList.addAll(g2_Users); update updUserList; Test.stopTest(); // Delete 的 assert g1Members = [SELECT Id, UserOrGroupId FROM GroupMember WHERE GroupId =: g1.Id]; g2Members = [SELECT Id, UserOrGroupId FROM GroupMember WHERE GroupId =: g2.Id]; System.assertEquals(0, g1Members.size()); //System.assertEquals(0, g2Members.size()); // Insert 的 assert List gList = [SELECT Id, Name FROM Group WHERE Type = 'Regular' AND Name LIKE '%_CreateGroup%' ORDER BY Name]; List gMembers = [SELECT Id, UserOrGroupId FROM GroupMember WHERE GroupId IN: gList ORDER BY GroupId, UserOrGroupId]; System.assertEquals(2, gList.size(), gList); System.assertEquals('备品共享_上海_CreateGroup2', gList[0].Name); System.assertEquals('备品共享_其他_CreateGroup1', gList[1].Name); System.assertEquals(4, gMembers.size()); System.assertEquals(g1_Users[0].Id, gMembers[0].UserOrGroupId); System.assertEquals(g1_Users[1].Id, gMembers[1].UserOrGroupId); System.assertEquals(g2_Users[0].Id, gMembers[2].UserOrGroupId); System.assertEquals(g2_Users[1].Id, gMembers[3].UserOrGroupId); } /** * update User x 2 with Group(既存) x 1 --> User.IsActive = false --> IsActive = true */ @isTest static void dynamicUpdateGroup_UserActive() { // 做数据 like #dynamicUpdateGroup_CreateUser() setupAccount(new List {'备品共享_其他_备品管理中心', '备品共享_上海_华东营业本部', '备品共享_其他_CreateGroup1', '备品共享_上海_CreateGroup2'}); Map findGroupNameMap = new Map(); for (Group grp : [SELECT Id, Name FROM Group WHERE Type = 'Regular' AND Name LIKE '备品共享_%']) { findGroupNameMap.put(grp.Name, grp); } List grpList = new List(); Group g1 = findGroupNameMap.get('备品共享_其他_备品管理中心'); if (null == g1) { g1 = new Group(Name = '备品共享_其他_备品管理中心'); grpList.add(g1); } Group g2 = findGroupNameMap.get('备品共享_上海_华东营业本部'); if (null == g2) { g2 = new Group(Name = '备品共享_上海_华东营业本部'); grpList.add(g2); } insert grpList; UserProfileHandler.testTargetDepts = new Set {'医疗备品管理中心', '医疗华东营业本部'}; List g1_Users = setupUsers('G1', '其他', '医疗备品管理中心'); List g2_Users = setupUsers('G2', '上海', '医疗华东营业本部'); // 做数据 的 assert List g1Members = [SELECT Id, UserOrGroupId FROM GroupMember WHERE GroupId =: g1.Id ORDER BY UserOrGroupId]; List g2Members = [SELECT Id, UserOrGroupId FROM GroupMember WHERE GroupId =: g2.Id ORDER BY UserOrGroupId]; System.assertEquals(2, g1Members.size()); // System.assertEquals(2, g2Members.size()); System.assertEquals(g1_Users[0].Id, g1Members[0].UserOrGroupId); System.assertEquals(g1_Users[1].Id, g1Members[1].UserOrGroupId); //System.assertEquals(g2_Users[0].Id, g2Members[0].UserOrGroupId); //System.assertEquals(g2_Users[1].Id, g2Members[1].UserOrGroupId); // User.IsActive = false g1_Users[0].IsActive = false; update g1_Users; g1Members = [SELECT Id, UserOrGroupId FROM GroupMember WHERE GroupId =: g1.Id AND UserOrGroupId =: g1_Users[0].Id]; System.assertEquals(1, g1Members.size()); System.assertEquals(g1_Users[0].Id, g1Members[0].UserOrGroupId); Delete g1Members; Test.startTest(); // User.IsActive = true g1_Users[0].IsActive = true; update g1_Users; Test.stopTest(); g1Members = [SELECT Id, UserOrGroupId FROM GroupMember WHERE GroupId =: g1.Id AND UserOrGroupId =: g1_Users[0].Id]; System.assertEquals(1, g1Members.size()); System.assertEquals(g1_Users[0].Id, g1Members[0].UserOrGroupId); } private static List setupUsers(String gNo, String province, String dept) { Long nowTimeLong = System.now().getTime(); List insertUsers = new List(); User g1_u1 = New User( Email = gNo + '_U1@testorg.com', UserName = gNo + '_U1@testorg.com' + nowTimeLong, Alias = gNo + '_U1', LastName = gNo, Firstname = 'U1', Work_Location__c = province, Dept__c = dept, ProfileId = System.Label.ProfileId_SystemAdmin, TimeZoneSidKey='Asia/Shanghai', EmailEncodingKey='UTF-8', LanguageLocaleKey='zh_CN', LocaleSidKey='zh_CN' ); insertUsers.add(g1_u1); User g1_u2 = New User( Email = gNo + '_U2@testorg.com', UserName = gNo + '_U2@testorg.com' + nowTimeLong, Alias = gNo + '_U2', LastName = gNo, Firstname = 'U2', Work_Location__c = province, Dept__c = dept, ProfileId = System.Label.ProfileId_SystemAdmin, TimeZoneSidKey='Asia/Shanghai', EmailEncodingKey='UTF-8', LanguageLocaleKey='zh_CN', LocaleSidKey='zh_CN' ); insertUsers.add(g1_u2); insert insertUsers; return insertUsers; } private static void setupAccount(List othList) { StaticParameter.EscapeAccountTrigger = true; System.runAs(new User(Id = Userinfo.getUserId())) { // 省 Address_Level__c al1 = new Address_Level__c(); al1.Name = '東京'; al1.Level1_Code__c = 'CN-99'; al1.Level1_Sys_No__c = '999999'; insert al1; // 市 Address_Level2__c al2 = new Address_Level2__c(); al2.Level1_Code__c = 'CN-99'; al2.Level1_Sys_No__c = '999999'; al2.Level1_Name__c = '東京'; al2.Name = '渋谷区'; al2.Level2_Code__c = 'CN-9999'; al2.Level2_Sys_No__c = '9999999'; al2.Address_Level__c = al1.id; insert al2; // Olympus社内 9999999 Account hospital = new Account(); hospital.recordtypeId = [Select Id FROM RecordType WHERE IsActive = true and SobjectType = 'Account' and DeveloperName = 'HP'].id; hospital.Name = 'Olympus社内'; hospital.AgentCode_Ext__c = System.Label.Account_Asset_Hospatal; hospital.Is_Active__c = '有効'; hospital.Attribute_Type__c = '其他'; hospital.Speciality_Type__c = 'その他'; hospital.Grade__c = '一般'; hospital.OCM_Category__c = 'L'; hospital.Is_Medical__c = '非医疗机构'; hospital.State_Master__c = al1.id; hospital.City_Master__c = al2.id; hospital.Town__c = '东京'; insert hospital; // 戦略科室を得る Account strategicDep = new Account(); strategicDep.recordtypeId = [Select Id FROM RecordType WHERE IsActive = true and SobjectType = 'Account' and DeveloperName = 'Department_Class_OTH'].id; strategicDep.Name = 'Olympus社内 其他'; strategicDep.Department_Class_Label__c = '其他'; strategicDep.Hospital__c = hospital.Id; strategicDep.ParentId = hospital.Id; insert strategicDep; // 备品中心:9999998 List departmentList = new List(); Account accountDep = new Account(); accountDep.recordtypeId = [Select Id FROM RecordType WHERE IsActive = true and SobjectType = 'Account' and DeveloperName = 'Department_OTH'].id; accountDep.Name = 'Olympus社内 其他 备品'; accountDep.AgentCode_Ext__c = System.Label.Account_Asset; accountDep.ParentId = strategicDep.Id; accountDep.Department_Class__c = strategicDep.Id; accountDep.Department_Name__c = '备品'; accountDep.Hospital__c = hospital.Id; departmentList.add(accountDep); for (String dptName : othList) { Account accountOth = new Account( recordtypeId = accountDep.recordtypeId, Name = 'Olympus社内 其他 ' + dptName, ParentId = strategicDep.Id, Department_Class__c = strategicDep.Id, Department_Name__c = dptName, Hospital__c = hospital.Id ); departmentList.add(accountOth); } insert departmentList; } } }