You need to sign in to do that
Don't have an account?
sumit d
test class of Batch on email messages
Hi All,
i am trying to create test class for following batch:-
public without sharing class BatchDeleteAndMergeDuplicateCases implements Database.Batchable<sObject> {
public string subjectToFind ;
public Set<Id> duplicateCaseIds;
public Case parentCase;
public BatchDeleteAndMergeDuplicateCases(Set<Id> duplicateCaseIds, Case parentCase){
this.duplicateCaseIds = duplicateCaseIds;
this.parentCase = parentCase;
}
public BatchDeleteAndMergeDuplicateCases(String subjectToFind, Set<Id> duplicateCaseIds, Case parentCase){
this.subjectToFind = subjectToFind;
this.duplicateCaseIds = duplicateCaseIds;
this.parentCase = parentCase;
}
public static void run( Set<Id> CaseIds ) {
Set<String> duplicateSubjectMetaData = new Set<String>();
Set<String> duplicateEmailMetaData = new Set<String>();
for(Duplicate_Merge_Rule_Exception__mdt duplicateMetaData : [SELECT Active__c, Subject__c
FROM Duplicate_Merge_Rule_Exception__mdt
where Active__c =: True]){
if(duplicateMetaData.Type__c == 'Email'){
duplicateEmailMetaData.add(duplicateMetaData.Email__c);
}else if(duplicateMetaData.Type__c == 'Subject'){
duplicateSubjectMetaData.add(duplicateMetaData.Subject__c);
}
}
List<Case> CaseRecords = [Select id, Subject,
Origin, DuplicateOf__c,
SuppliedEmail, Status,
Duplicate_Count__c, CaseNumber,
Description
from case
where Id IN: CaseIds
AND origin != Null AND
origin =: 'Email' AND
SuppliedEmail != Null AND
Subject != Null
AND SuppliedEmail NOT IN: duplicateEmailMetaData
AND DuplicateOf__c =: Null
ORDER By LastModifiedDate DESC];
//executeHelper( CaseRecords , parentCase);
}
public Database.QueryLocator start(Database.BatchableContext BC){
Set<String> duplicateSubjectMetaData = new Set<String>();
Set<String> duplicateEmailMetaData = new Set<String>();
for(Duplicate_Merge_Rule_Exception__mdt duplicateMetaData : [SELECT Active__c, Subject__c, Type__c, Email__c
FROM Duplicate_Merge_Rule_Exception__mdt
where Active__c =: True]){
if(duplicateMetaData.Type__c == 'Email'){
duplicateEmailMetaData.add(duplicateMetaData.Email__c);
}else if(duplicateMetaData.Type__c == 'Subject'){
duplicateSubjectMetaData.add(duplicateMetaData.Subject__c);
}
}
if(subjectToFind != Null && subjectToFind != ''){
return Database.getQueryLocator([SELECT id, Subject, Origin,SuppliedEmail,
Status, DuplicateOf__c, Description,
Duplicate_Count__c, CaseNumber
FROM Case
WHERE Subject != null
AND Subject LIKE: '%'+ subjectToFind + '%'
AND Origin != Null
And Origin = 'Email'
AND SuppliedEmail != Null
AND Subject NOT IN: duplicateSubjectMetaData
AND SuppliedEmail NOT IN: duplicateEmailMetaData
AND DuplicateOf__c =: Null
ORDER By CreatedDate DESC
]);
}
else if(duplicateCaseIds != null && parentCase.Id != null ) {
return Database.getQueryLocator([SELECT id, Subject, Origin,SuppliedEmail,
Status, DuplicateOf__c, Description,
Duplicate_Count__c, CaseNumber
FROM Case
WHERE Subject != null
AND Origin != Null
And Origin = 'Email'
AND SuppliedEmail != Null
AND Subject NOT IN: duplicateSubjectMetaData
AND SuppliedEmail NOT IN: duplicateEmailMetaData
AND DuplicateOf__c =: Null
AND Id in :duplicateCaseIds
ORDER By CreatedDate DESC
]);
}
else {
return Database.getQueryLocator([SELECT id, Subject, Origin,SuppliedEmail,
Status, DuplicateOf__c, Description,
Duplicate_Count__c, CaseNumber
FROM Case
WHERE Subject != null
AND Origin != Null
And Origin = 'Email'
AND SuppliedEmail != Null
AND Subject NOT IN: duplicateSubjectMetaData
AND SuppliedEmail NOT IN: duplicateEmailMetaData
AND DuplicateOf__c =: Null
ORDER By CreatedDate DESC
]);
}
}
public void execute(Database.BatchableContext BC, List<Case> cases){
executeHelper(cases, parentCase);
}
public void finish(Database.BatchableContext BC){
}
public static void executeHelper(List<Case> caseRecords, Case parentCase){
EmailMessageTriggerHelper.runTrigger = False;
CaseTriggerHelper.runTrigger = False;
List<EmailMessage> emList = new List<EmailMessage>();
String objectName = 'EmailMessage'; // modify as needed
String soql = getCreatableFieldsSOQL('EmailMessage', 'ParentId IN :caseRecords');
emList = database.query(soql);
List<EmailMessage> emListToInsert = new List<EmailMessage>();
if(emList.size() > 0){
for(EmailMessage em : emList){
EmailMessage emToInsert = em.clone(False);
emToInsert.ParentId = parentCase.Id;
emToInsert.CreatedDate = em.CreatedDate;
emToInsert.LastModifiedDate = em.LastModifiedDate;
emToInsert.CreatedById = em.CreatedById;
emToInsert.LastModifiedById = em.LastModifiedById;
emListToInsert.add(emToInsert);
}
}
if(emListToInsert.size() > 0){
insert emListToInsert;
// merge log
List<Merge_Log__c> mlList = new List<Merge_Log__c>();
Set<Id> deleteCaseIds = new Set<Id>();
for(Case caseObj : caseRecords){
Merge_Log__c ml = new Merge_Log__c();
ml.Case__c = caseObj.Id;
ml.MergedWith__c = caseObj.DuplicateOf__c;
ml.Case_Details__c = JSON.serializePretty(caseObj);
ml.Merge_Details__c = '';
mlList.add(ml);
}
if(mlList.size() > 0){
insert mlList;
}
//delete duplicate cases
delete caseRecords;
}
}
// Returns a dynamic SOQL statement for the whole object, includes only creatable fields since we will be inserting a cloned result of this query
public static string getCreatableFieldsSOQL(String objectName, String whereClause){
String selects = '';
if (whereClause == null || whereClause == ''){ return null; }
// Get a map of field name and field token
Map<String, Schema.SObjectField> fMap = Schema.getGlobalDescribe().get(objectName.toLowerCase()).getDescribe().Fields.getMap();
list<string> selectFields = new list<string>();
if (fMap != null){
for (Schema.SObjectField ft : fMap.values()){ // loop through all field tokens (ft)
Schema.DescribeFieldResult fd = ft.getDescribe(); // describe each field (fd)
if (fd.isCreateable() && fd.getName() != 'ValidatedFromAddress'){ // field is creatable
selectFields.add(fd.getName());
}
}
}
if (!selectFields.isEmpty()){
for (string s:selectFields){
selects += s + ',';
}
if (selects.endsWith(',')){selects = selects.substring(0,selects.lastIndexOf(','));}
}
return 'SELECT ' + selects + ' FROM ' + objectName + ' WHERE ' + whereClause;
}
}
how to create the test class for it?
Any suggestions?
i am trying to create test class for following batch:-
public without sharing class BatchDeleteAndMergeDuplicateCases implements Database.Batchable<sObject> {
public string subjectToFind ;
public Set<Id> duplicateCaseIds;
public Case parentCase;
public BatchDeleteAndMergeDuplicateCases(Set<Id> duplicateCaseIds, Case parentCase){
this.duplicateCaseIds = duplicateCaseIds;
this.parentCase = parentCase;
}
public BatchDeleteAndMergeDuplicateCases(String subjectToFind, Set<Id> duplicateCaseIds, Case parentCase){
this.subjectToFind = subjectToFind;
this.duplicateCaseIds = duplicateCaseIds;
this.parentCase = parentCase;
}
public static void run( Set<Id> CaseIds ) {
Set<String> duplicateSubjectMetaData = new Set<String>();
Set<String> duplicateEmailMetaData = new Set<String>();
for(Duplicate_Merge_Rule_Exception__mdt duplicateMetaData : [SELECT Active__c, Subject__c
FROM Duplicate_Merge_Rule_Exception__mdt
where Active__c =: True]){
if(duplicateMetaData.Type__c == 'Email'){
duplicateEmailMetaData.add(duplicateMetaData.Email__c);
}else if(duplicateMetaData.Type__c == 'Subject'){
duplicateSubjectMetaData.add(duplicateMetaData.Subject__c);
}
}
List<Case> CaseRecords = [Select id, Subject,
Origin, DuplicateOf__c,
SuppliedEmail, Status,
Duplicate_Count__c, CaseNumber,
Description
from case
where Id IN: CaseIds
AND origin != Null AND
origin =: 'Email' AND
SuppliedEmail != Null AND
Subject != Null
AND SuppliedEmail NOT IN: duplicateEmailMetaData
AND DuplicateOf__c =: Null
ORDER By LastModifiedDate DESC];
//executeHelper( CaseRecords , parentCase);
}
public Database.QueryLocator start(Database.BatchableContext BC){
Set<String> duplicateSubjectMetaData = new Set<String>();
Set<String> duplicateEmailMetaData = new Set<String>();
for(Duplicate_Merge_Rule_Exception__mdt duplicateMetaData : [SELECT Active__c, Subject__c, Type__c, Email__c
FROM Duplicate_Merge_Rule_Exception__mdt
where Active__c =: True]){
if(duplicateMetaData.Type__c == 'Email'){
duplicateEmailMetaData.add(duplicateMetaData.Email__c);
}else if(duplicateMetaData.Type__c == 'Subject'){
duplicateSubjectMetaData.add(duplicateMetaData.Subject__c);
}
}
if(subjectToFind != Null && subjectToFind != ''){
return Database.getQueryLocator([SELECT id, Subject, Origin,SuppliedEmail,
Status, DuplicateOf__c, Description,
Duplicate_Count__c, CaseNumber
FROM Case
WHERE Subject != null
AND Subject LIKE: '%'+ subjectToFind + '%'
AND Origin != Null
And Origin = 'Email'
AND SuppliedEmail != Null
AND Subject NOT IN: duplicateSubjectMetaData
AND SuppliedEmail NOT IN: duplicateEmailMetaData
AND DuplicateOf__c =: Null
ORDER By CreatedDate DESC
]);
}
else if(duplicateCaseIds != null && parentCase.Id != null ) {
return Database.getQueryLocator([SELECT id, Subject, Origin,SuppliedEmail,
Status, DuplicateOf__c, Description,
Duplicate_Count__c, CaseNumber
FROM Case
WHERE Subject != null
AND Origin != Null
And Origin = 'Email'
AND SuppliedEmail != Null
AND Subject NOT IN: duplicateSubjectMetaData
AND SuppliedEmail NOT IN: duplicateEmailMetaData
AND DuplicateOf__c =: Null
AND Id in :duplicateCaseIds
ORDER By CreatedDate DESC
]);
}
else {
return Database.getQueryLocator([SELECT id, Subject, Origin,SuppliedEmail,
Status, DuplicateOf__c, Description,
Duplicate_Count__c, CaseNumber
FROM Case
WHERE Subject != null
AND Origin != Null
And Origin = 'Email'
AND SuppliedEmail != Null
AND Subject NOT IN: duplicateSubjectMetaData
AND SuppliedEmail NOT IN: duplicateEmailMetaData
AND DuplicateOf__c =: Null
ORDER By CreatedDate DESC
]);
}
}
public void execute(Database.BatchableContext BC, List<Case> cases){
executeHelper(cases, parentCase);
}
public void finish(Database.BatchableContext BC){
}
public static void executeHelper(List<Case> caseRecords, Case parentCase){
EmailMessageTriggerHelper.runTrigger = False;
CaseTriggerHelper.runTrigger = False;
List<EmailMessage> emList = new List<EmailMessage>();
String objectName = 'EmailMessage'; // modify as needed
String soql = getCreatableFieldsSOQL('EmailMessage', 'ParentId IN :caseRecords');
emList = database.query(soql);
List<EmailMessage> emListToInsert = new List<EmailMessage>();
if(emList.size() > 0){
for(EmailMessage em : emList){
EmailMessage emToInsert = em.clone(False);
emToInsert.ParentId = parentCase.Id;
emToInsert.CreatedDate = em.CreatedDate;
emToInsert.LastModifiedDate = em.LastModifiedDate;
emToInsert.CreatedById = em.CreatedById;
emToInsert.LastModifiedById = em.LastModifiedById;
emListToInsert.add(emToInsert);
}
}
if(emListToInsert.size() > 0){
insert emListToInsert;
// merge log
List<Merge_Log__c> mlList = new List<Merge_Log__c>();
Set<Id> deleteCaseIds = new Set<Id>();
for(Case caseObj : caseRecords){
Merge_Log__c ml = new Merge_Log__c();
ml.Case__c = caseObj.Id;
ml.MergedWith__c = caseObj.DuplicateOf__c;
ml.Case_Details__c = JSON.serializePretty(caseObj);
ml.Merge_Details__c = '';
mlList.add(ml);
}
if(mlList.size() > 0){
insert mlList;
}
//delete duplicate cases
delete caseRecords;
}
}
// Returns a dynamic SOQL statement for the whole object, includes only creatable fields since we will be inserting a cloned result of this query
public static string getCreatableFieldsSOQL(String objectName, String whereClause){
String selects = '';
if (whereClause == null || whereClause == ''){ return null; }
// Get a map of field name and field token
Map<String, Schema.SObjectField> fMap = Schema.getGlobalDescribe().get(objectName.toLowerCase()).getDescribe().Fields.getMap();
list<string> selectFields = new list<string>();
if (fMap != null){
for (Schema.SObjectField ft : fMap.values()){ // loop through all field tokens (ft)
Schema.DescribeFieldResult fd = ft.getDescribe(); // describe each field (fd)
if (fd.isCreateable() && fd.getName() != 'ValidatedFromAddress'){ // field is creatable
selectFields.add(fd.getName());
}
}
}
if (!selectFields.isEmpty()){
for (string s:selectFields){
selects += s + ',';
}
if (selects.endsWith(',')){selects = selects.substring(0,selects.lastIndexOf(','));}
}
return 'SELECT ' + selects + ' FROM ' + objectName + ' WHERE ' + whereClause;
}
}
how to create the test class for it?
Any suggestions?