Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TOLK-2836 Skill Sync #733

Merged
merged 16 commits into from
Feb 12, 2025
Merged
1 change: 0 additions & 1 deletion .vscode/settings.json
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,6 @@
"editor.detectIndentation": false,
"git.autofetch": true,
"eslint.nodePath": "./node_modules",
"apexPMD.rulesets": ["ruleset.xml"],
"editor.defaultFormatter": "esbenp.prettier-vscode",
"[xml]": {
"editor.defaultFormatter": "redhat.vscode-xml"
Expand Down
6 changes: 5 additions & 1 deletion config/project-scratch-def.json
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,8 @@
"FieldService:5",
"FieldServiceDispatcherUser:5",
"FieldServiceMobileUser:5",
"FieldServiceSchedulingUser:5"
"FieldServiceSchedulingUser:5",
"LiveMessage"
],
"country": "NO",
"language": "en_US",
Expand Down Expand Up @@ -62,6 +63,9 @@
"workOrderLineItemSearchFields": "Subject",
"workOrderSearchFields": "Subject"
},
"liveMessageSettings": {
"enableLiveMessage": true
},
"liveAgentSettings": {
"enableLiveAgent": true
},
Expand Down
286 changes: 171 additions & 115 deletions force-app/main/default/classes/STO_GroupMemberSkillService.cls

Large diffs are not rendered by default.

291 changes: 268 additions & 23 deletions force-app/main/default/classes/STO_GroupMemberSkillService_Test.cls
Original file line number Diff line number Diff line change
@@ -1,51 +1,297 @@
@isTest
@IsTest
public class STO_GroupMemberSkillService_Test {
@TestSetup
static void makeData() {
Group fortroligGroup = TestDataFactory.getPublicGroup('group_AD_Fortrolig_Adresse', 'group_AD_Fortrolig_Adresse');
Group skjermedeGroup = TestDataFactory.getPublicGroup('NKS_Skjermede_Personer_AD', 'NKS_Skjermede_Personer_AD');
private static void makeData() {
myTriggers.disable(PersonAccessHandler.class);
myTriggers.disable(UserPermissionSetAssignmentHandler.class);
myTriggers.disable(UserDefaultValuesHandler.class);
myTriggers.disable(UserProfileHandler.class);
myTriggers.disable(UserGroupMemberHandler.class);
myTriggers.disable(UserRegionHandler.class);
myTriggers.disable(UserRoleAssignmentHandler.class);
Group fortroligGroup = TestDataFactory.getPublicGroup(
'group_AD_Fortrolig_Adresse',
'group_AD_Fortrolig_Adresse'
);
Group nksSkjermedeGroup = TestDataFactory.getPublicGroup(
'NKS_Skjermede_Personer_AD',
'NKS_Skjermede_Personer_AD'
);
Group skjermedeGroup = TestDataFactory.getPublicGroup('Skjermede_Personer_AD', 'Skjermede_Personer_AD');

//Adds the testuser as a member in both groups
User usr = (User) STO_TestDataFactory.createRecord(new User(FirstName = 'SUPER', LastName = 'SKILLED'));
User usr1 = (User) STO_TestDataFactory.createRecord(new User(FirstName = 'SUPER', LastName = 'SKILLED'));
User usr2 = (User) STO_TestDataFactory.createRecord(new User(FirstName = 'HOTST', LastName = 'HOTST'));
List<GroupMember> memberList = new List<GroupMember>();
memberList.add(new GroupMember(GroupId = fortroligGroup.Id, UserOrGroupId = usr.Id));
memberList.add(new GroupMember(GroupId = skjermedeGroup.Id, UserOrGroupId = usr.Id));
memberList.add(new GroupMember(GroupId = fortroligGroup.Id, UserOrGroupId = usr1.Id));
memberList.add(new GroupMember(GroupId = nksSkjermedeGroup.Id, UserOrGroupId = usr1.Id));
memberList.add(new GroupMember(GroupId = fortroligGroup.Id, UserOrGroupId = usr2.Id));
memberList.add(new GroupMember(GroupId = skjermedeGroup.Id, UserOrGroupId = usr2.Id));
STO_TestDataFactory.createRecordList(memberList);
PermissionSetGroup kontaktsenterPSG;
PermissionSetGroup servicetjenestenPSG;
List<PermissionSetGroup> psgs = [
SELECT Id, DeveloperName
FROM PermissionSetGroup
WHERE DeveloperName IN ('Kontaktsenter', 'HOT_Servicetjenesten_Group')
];
for (PermissionSetGroup psg : psgs) {
if (psg.DeveloperName == 'Kontaktsenter') {
kontaktsenterPSG = psg;
} else if (psg.DeveloperName == 'HOT_Servicetjenesten_Group') {
servicetjenestenPSG = psg;
}
}
if (kontaktsenterPSG == null) {
kontaktsenterPSG = new PermissionSetGroup(MasterLabel = 'Kontaktsenter', DeveloperName = 'Kontaktsenter');
insert kontaktsenterPSG;
}
if (servicetjenestenPSG == null) {
servicetjenestenPSG = new PermissionSetGroup(
MasterLabel = 'Servicetjenesten',
DeveloperName = 'HOT_Servicetjenesten_Group'
);
insert servicetjenestenPSG;
}
PermissionSetAssignment psa1 = new PermissionSetAssignment(
AssigneeId = usr1.ID,
PermissionSetGroupId = kontaktsenterPSG.Id
);
PermissionSetAssignment psa2 = new PermissionSetAssignment(
AssigneeId = usr2.ID,
PermissionSetGroupId = servicetjenestenPSG.Id
);
insert new List<PermissionSetAssignment>{ psa1, psa2 };

if (
[
SELECT Id, DeveloperName
FROM Skill
WHERE DeveloperName = 'Fortrolig_addresse'
]
.isEmpty()
) {
Test.loadData(Skill.sObjectType, 'testFortroligSkill');
}
if (
[
SELECT Id, DeveloperName
FROM Skill
WHERE DeveloperName = 'Skjermede_Personer'
]
.isEmpty()
) {
Test.loadData(Skill.sObjectType, 'testSkjermetSkill');
}
}

@isTest
static void testSkillCreate() {
User testUser = [SELECT Id, Name FROM User WHERE LastName = 'SKILLED'];
STO_GroupMemberSkillService.nksUserMap.clear();
STO_GroupMemberSkillService.nksUserMap.put(testUser.Id, testUser); //Override the return of the map since the permission set group does not exist in this package
@IsTest
private static void nksServiceResourceWithSkillCreate() {
STO_GroupMemberSkillService service = new STO_GroupMemberSkillService();
System.assertEquals(
2,
[
SELECT COUNT()
FROM GroupMember
WHERE
UserOrGroupId IN (SELECT Id FROM User WHERE LastName = 'SKILLED')
AND Group.DeveloperName IN (
'group_AD_Fortrolig_Adresse',
'NKS_Skjermede_Personer_AD',
'Skjermede_Personer_AD'
)
],
'Expected 2 groups for NKS user'
);
Test.startTest();
service.handleGroupAndSkillSync();
Test.stopTest();

System.assertEquals(
1,
[SELECT COUNT() FROM ServiceResource WHERE RelatedRecord.LastName = 'SKILLED'],
'Expected serviceresource for NKS user'
);
System.assertEquals(
0,
[SELECT COUNT() FROM ServiceResource WHERE RelatedRecord.LastName = 'HOTST'],
'Expected no serviceresource for HOT user'
);

ServiceResource nksSR = [
SELECT Id, RelatedRecordId, CRM_Domain__c
FROM ServiceResource
WHERE RelatedRecord.LastName = 'SKILLED'
LIMIT 1
];
System.assertEquals(
2,
[
SELECT COUNT()
FROM ServiceResourceSkill
WHERE ServiceResourceId = :nksSR.Id
],
'Expected 2 skills for NKS user'
);
}
@IsTest
private static void hotServiceResourceWithSkillCreate() {
STO_GroupMemberSkillService service = new STO_GroupMemberSkillService();
service.setParams(
new Map<String, String>{
'domain' => 'HOT',
'subdomain' => 'Servicetjenesten',
'permsetgroup' => 'HOT_Servicetjenesten_Group',
'fortroliggroup' => 'group_AD_Fortrolig_Adresse',
'skjermedegroup' => 'Skjermede_Personer_AD'
}
);
System.assertEquals(
2,
[
SELECT COUNT()
FROM GroupMember
WHERE
UserOrGroupId IN (SELECT Id FROM User WHERE LastName = 'HOTST')
AND Group.DeveloperName IN (
'group_AD_Fortrolig_Adresse',
'NKS_Skjermede_Personer_AD',
'Skjermede_Personer_AD'
)
],
'Expected 2 groups for HOT users'
);
Test.startTest();
service.handleGroupAndSkillSync();
Test.stopTest();

System.assertEquals(1, [SELECT COUNT() FROM ServiceResource]);
System.assertEquals(
1,
[SELECT COUNT() FROM ServiceResource WHERE RelatedRecord.LastName = 'HOTST'],
'Expected serviceresource for HOT user'
);
System.assertEquals(
0,
[SELECT COUNT() FROM ServiceResource WHERE RelatedRecord.LastName = 'SKILLED'],
'Expected no serviceresource for NKS user'
);

ServiceResource hotSR = [
SELECT Id, RelatedRecordId, RelatedRecord.LastName, CRM_Domain__c
FROM ServiceResource
WHERE RelatedRecord.LastName = 'HOTST'
LIMIT 1
];
System.assertEquals('HOT', hotSR.CRM_Domain__c, 'Expected HOT domain');
System.assertEquals(
2,
[
SELECT COUNT()
FROM ServiceResourceSkill
WHERE ServiceResourceId = :hotSR.Id
],
'Expected 2 skills for HOT user'
);
}

@isTest
static void testSkillRemove() {
@IsTest
private static void callableSync() {
System.assertEquals(
2,
[
SELECT COUNT()
FROM GroupMember
WHERE
UserOrGroupId IN (SELECT Id FROM User WHERE LastName = 'HOTST')
AND Group.DeveloperName IN (
'group_AD_Fortrolig_Adresse',
'NKS_Skjermede_Personer_AD',
'Skjermede_Personer_AD'
)
],
'Expected 2 groups for HOT users'
);
Test.startTest();
try {
Callable syncService = (Callable) Type.forName('STO_GroupMemberSkillService').newInstance();
syncService.call(
'handleGroupAndSkillSync',
new Map<String, Object>{
'domain' => 'HOT',
'subdomain' => 'Servicetjenesten',
'permsetgroup' => 'HOT_Servicetjenesten_Group',
'fortroliggroup' => 'group_AD_Fortrolig_Adresse',
'skjermedegroup' => 'Skjermede_Personer_AD'
}
);
} catch (Exception e) {
System.Assert.isTrue(false, 'Could not call callable class' + e.getMessage());
}
Test.stopTest();

System.assertEquals(
1,
[SELECT COUNT() FROM ServiceResource WHERE RelatedRecord.LastName = 'HOTST'],
'Expected serviceresource for HOT user'
);
System.assertEquals(
0,
[SELECT COUNT() FROM ServiceResource WHERE RelatedRecord.LastName = 'SKILLED'],
'Expected no serviceresource for NKS user'
);

ServiceResource hotSR = [
SELECT Id, RelatedRecordId, RelatedRecord.LastName, CRM_Domain__c
FROM ServiceResource
WHERE RelatedRecord.LastName = 'HOTST'
LIMIT 1
];
System.assertEquals('HOT', hotSR.CRM_Domain__c, 'Expected HOT domain');
System.assertEquals(
2,
[
SELECT COUNT()
FROM ServiceResourceSkill
WHERE ServiceResourceId = :hotSR.Id
],
'Expected 2 skills for HOT user'
);
}

@IsTest
private static void testSkillRemove() {
User testUser = [SELECT Id, Name FROM User WHERE LastName = 'SKILLED'];
STO_GroupMemberSkillService.nksUserMap.clear();
STO_GroupMemberSkillService.nksUserMap.put(testUser.Id, testUser); //Override the return of the map since the permission set group does not exist in this package
STO_GroupMemberSkillService service = new STO_GroupMemberSkillService();
service.handleGroupAndSkillSync();

System.assertEquals(
2,
[
SELECT COUNT()
FROM ServiceResourceSkill
WHERE ServiceResource.RelatedRecordId = :testUser.Id
],
'Expected 2 skills for NKS user'
);
Test.startTest();
//Removing from the skjermede group
removeFromGroup(testUser.Id, 'NKS_Skjermede_Personer_AD');
Test.stopTest();
//Create new service as the memberlist have changed
STO_GroupMemberSkillService service2 = new STO_GroupMemberSkillService();
service2.handleGroupAndSkillSync();
System.assertEquals(
1,
[
SELECT COUNT()
FROM ServiceResourceSkill
WHERE ServiceResource.RelatedRecordId = :testUser.Id
],
'Expected 1 skills for NKS user'
);
}

@isTest
static void testDmlVerification() {
@IsTest
private static void testDmlVerification() {
Account testAcc = new Account(Name = 'Test Account');
User testUser = [SELECT Id, Name FROM User WHERE LastName = 'SKILLED'];
List<Database.SaveResult> saveResList = Database.insert(new List<SObject>{ testAcc, testUser }, false);
Expand All @@ -60,10 +306,9 @@ public class STO_GroupMemberSkillService_Test {
service.verifySkillRemoval(deleteResList);
Test.stopTest();

System.assertEquals(2, [SELECT COUNT() FROM Application_Log__c]); //Two errors should be logged
System.assertEquals(2, [SELECT COUNT() FROM Application_Log__c], 'Two errors should be logged');
}

@future
@Future
private static void removeFromGroup(Id userId, String groupDevName) {
delete [SELECT Id FROM GroupMember WHERE UserOrGroupId = :userId AND Group.DeveloperName = :groupDevName];
}
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
DeveloperName,MasterLabel
Fortrolig_addresse,Fortrolig
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<StaticResource xmlns="http://soap.sforce.com/2006/04/metadata">
<contentType>text/csv</contentType>
</StaticResource>
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
DeveloperName,MasterLabel
Skjermede_personer,Skjermet
Original file line number Diff line number Diff line change
@@ -0,0 +1,4 @@
<?xml version="1.0" encoding="UTF-8"?>
<StaticResource xmlns="http://soap.sforce.com/2006/04/metadata">
<contentType>text/csv</contentType>
</StaticResource>
Loading