You need to sign in to do that
Don't have an account?
John McAfee
Better test Coverage for invokable Method
Hi all I have a test class for this invokable method but only getting 31% coverage.. Any help would be appreciated to increase coverage.. been banging my head on it all weekend.. Thanks in advance...
---Test---
@isTest
public class DefaultEntitlementTest {
static testmethod void ValidateDefaultEntitlementAction() {
Account[] acc = new Account[] {
new Account(Name='Test Account 1'),
new Account(Name='Test Account 2')
};
insert acc;
Contact[] contacts = new Contact[] {
new Contact(FirstName='Test 1', LastName='McTesty', AccountId = acc[0].id),
new Contact(FirstName='Test 2', LastName='McTesty', AccountId = acc[0].id)
};
insert contacts;
Id entitlementProcessId = [SELECT Id FROM SlaProcess WHERE SObjectType = 'Case' LIMIT 1].Id;
Entitlement[] ent = new Entitlement[] {
new Entitlement (AccountId=acc[0].Id, SLAProcessId = entitlementProcessId, Name = 'Test Entitlement Account',
StartDate = system.today().addDays(-1), EndDate = system.today().addDays(5)),
new Entitlement (AccountId=acc[1].id, SLAProcessId = entitlementProcessId, Name = 'Test Entitlement Contact',
StartDate = system.today().addDays(-1), EndDate = system.today().addDays(5))
};
insert ent;
EntitlementContact ec = new EntitlementContact(ContactId = contacts[0].id, EntitlementId = ent[1].id);
insert ec;
Case c = new Case(AccountId = acc[0].id, ContactId = contacts[0].id, Subject='Test');
insert c;
c = [SELECT Id, EntitlementId FROM Case WHERE Id =: c.id LIMIT 1];
system.assertEquals(ent[1].id, c.EntitlementId);
c = new Case(AccountId = acc[0].id, ContactId = contacts[1].id, Subject='Test');
insert c;
c = [SELECT Id, EntitlementId FROM Case WHERE Id =: c.id LIMIT 1];
system.assertEquals(ent[0].id, c.EntitlementId);
}
}
---Method---
public class DefaultEntitlementAction {
@InvocableMethod(label='Update Default Entitlements' description='Determines the default Entitlement for the Case and returns the updated Cases.')
public static void updateDefaultEntitlements(List<Case> casesToUpdate) {
List<Case> cases = [
SELECT AccountId, EntitlementId, AssetId
FROM Case
WHERE Id IN:new Map<Id, Case>(casesToUpdate).keySet()
];
Set<Id> accountIds = new Set<Id>();
for (Case c : cases){
if (c.EntitlementId == null && c.AccountId != null) {
accountIds.add(c.AccountId);
}
}
if(accountIds.size() > 0) {
List <Entitlement> entitlements = [
SELECT StartDate, EndDate, AccountId, AssetId
FROM Entitlement
WHERE AccountId in :accountIds
AND StartDate <= TODAY
AND EndDate >= TODAY
];
if(entitlements.size() > 0) {
Map<Id, Entitlement> entitlementsByAccountId = new Map<Id, Entitlement>();
for(Entitlement e : entitlements) {
entitlementsByAccountId.put(e.AccountId, e);
}
for(Case c : cases){
if(c.EntitlementId == null && c.AccountId != null) {
Entitlement e = entitlementsByAccountId.get(c.AccountId);
if(e != null) {
c.EntitlementId = e.Id;
if(c.AssetId == null && e.AssetId != null) {
c.AssetId = e.AssetId;
}
}
}
}
update cases;
}
}
}
}
---Test---
@isTest
public class DefaultEntitlementTest {
static testmethod void ValidateDefaultEntitlementAction() {
Account[] acc = new Account[] {
new Account(Name='Test Account 1'),
new Account(Name='Test Account 2')
};
insert acc;
Contact[] contacts = new Contact[] {
new Contact(FirstName='Test 1', LastName='McTesty', AccountId = acc[0].id),
new Contact(FirstName='Test 2', LastName='McTesty', AccountId = acc[0].id)
};
insert contacts;
Id entitlementProcessId = [SELECT Id FROM SlaProcess WHERE SObjectType = 'Case' LIMIT 1].Id;
Entitlement[] ent = new Entitlement[] {
new Entitlement (AccountId=acc[0].Id, SLAProcessId = entitlementProcessId, Name = 'Test Entitlement Account',
StartDate = system.today().addDays(-1), EndDate = system.today().addDays(5)),
new Entitlement (AccountId=acc[1].id, SLAProcessId = entitlementProcessId, Name = 'Test Entitlement Contact',
StartDate = system.today().addDays(-1), EndDate = system.today().addDays(5))
};
insert ent;
EntitlementContact ec = new EntitlementContact(ContactId = contacts[0].id, EntitlementId = ent[1].id);
insert ec;
Case c = new Case(AccountId = acc[0].id, ContactId = contacts[0].id, Subject='Test');
insert c;
c = [SELECT Id, EntitlementId FROM Case WHERE Id =: c.id LIMIT 1];
system.assertEquals(ent[1].id, c.EntitlementId);
c = new Case(AccountId = acc[0].id, ContactId = contacts[1].id, Subject='Test');
insert c;
c = [SELECT Id, EntitlementId FROM Case WHERE Id =: c.id LIMIT 1];
system.assertEquals(ent[0].id, c.EntitlementId);
}
}
---Method---
public class DefaultEntitlementAction {
@InvocableMethod(label='Update Default Entitlements' description='Determines the default Entitlement for the Case and returns the updated Cases.')
public static void updateDefaultEntitlements(List<Case> casesToUpdate) {
List<Case> cases = [
SELECT AccountId, EntitlementId, AssetId
FROM Case
WHERE Id IN:new Map<Id, Case>(casesToUpdate).keySet()
];
Set<Id> accountIds = new Set<Id>();
for (Case c : cases){
if (c.EntitlementId == null && c.AccountId != null) {
accountIds.add(c.AccountId);
}
}
if(accountIds.size() > 0) {
List <Entitlement> entitlements = [
SELECT StartDate, EndDate, AccountId, AssetId
FROM Entitlement
WHERE AccountId in :accountIds
AND StartDate <= TODAY
AND EndDate >= TODAY
];
if(entitlements.size() > 0) {
Map<Id, Entitlement> entitlementsByAccountId = new Map<Id, Entitlement>();
for(Entitlement e : entitlements) {
entitlementsByAccountId.put(e.AccountId, e);
}
for(Case c : cases){
if(c.EntitlementId == null && c.AccountId != null) {
Entitlement e = entitlementsByAccountId.get(c.AccountId);
if(e != null) {
c.EntitlementId = e.Id;
if(c.AssetId == null && e.AssetId != null) {
c.AssetId = e.AssetId;
}
}
}
}
update cases;
}
}
}
}
Please try the below test class:
@isTest
public class DefaultEntitlementTest {
static testmethod void ValidateDefaultEntitlementAction() {
Account[] acc = new Account[] {
new Account(Name='Test Account 1'),
new Account(Name='Test Account 2')
};
insert acc;
Contact[] contacts = new Contact[] {
new Contact(FirstName='Test 1', LastName='McTesty', AccountId = acc[0].id),
new Contact(FirstName='Test 2', LastName='McTesty', AccountId = acc[0].id)
};
insert contacts;
Id entitlementProcessId = [SELECT Id FROM SlaProcess WHERE SObjectType = 'Case' LIMIT 1].Id;
Entitlement[] ent = new Entitlement[] {
new Entitlement (AccountId=acc[0].Id, SLAProcessId = entitlementProcessId, Name = 'Test Entitlement Account',
StartDate = system.today(), EndDate = system.today()),
new Entitlement (AccountId=acc[1].id, SLAProcessId = entitlementProcessId, Name = 'Test Entitlement Contact',
StartDate = system.today().addDays(-1), EndDate = system.today().addDays(5))
};
insert ent;
EntitlementContact ec = new EntitlementContact(ContactId = contacts[0].id, EntitlementId = ent[1].id);
insert ec;
Case c = new Case(AccountId = acc[0].id, ContactId = contacts[0].id, Subject='Test');
insert c;
List<Case> caseList = new List<Case>{c};
DefaultEntitlementAction.updateDefaultEntitlements(caseList);
}
}
Thanks,
Maharajan.C
Once you have ran the test class. Please refresh the Apex Class page also.
Thanks,
Maharajan.C