• Stéphane Duret 8
  • NEWBIE
  • 0 Points
  • Member since 2018

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 2
    Questions
  • 2
    Replies

Hi all,

I wrote Trigger Apex with Apex class.

All is Ok on my sandbox, all Apex code is over 75% of code coverage but when I deploy Trigger on my production, I have 0% of code coverage (just for trigger):
"Each trigger must have at least 1% code coverage."

 

trigger CompleteFirstResponseEmail on EmailMessage (after insert) {
    if (UserInfo.getUserType() == 'Standard'){
        DateTime completionDate = System.now();
        Map<Id, String> emIds = new Map<Id, String>();
        for (EmailMessage em : Trigger.new){
            if(em.Incoming == false)
                emIds.put(em.ParentId, em.ToAddress);
        }
        if (emIds.isEmpty() == false){
            Set <Id> emCaseIds = new Set<Id>();
            emCaseIds = emIds.keySet();
                List<Case> caseList = [Select c.Id, c.ContactId, c.Contact.Email,
                    c.OwnerId, c.Status,
                    c.EntitlementId,
                    c.SlaStartDate, c.SlaExitDate
                    From Case c where c.Id IN :emCaseIds];
            if (caseList.isEmpty()==false){
                    List<Id> updateCases = new List<Id>();
                    for (Case caseObj:caseList) {
                        if ((emIds.get(caseObj.Id)==caseObj.Contact.Email)&&
                            //(caseObj.Status == 'In Progress')&&
                            (caseObj.EntitlementId != null)&&
                            (caseObj.SlaStartDate <= completionDate)&&
                            (caseObj.SlaStartDate != null)&&
                            (caseObj.SlaExitDate == null))
                            updateCases.add(caseObj.Id);
                    }
                if(updateCases.isEmpty() == false){
                    milestoneUtils.completeMilestone(updateCases, 
                                'First Response', completionDate);
                }
            }
        }
    }        
}
 
public class MilestoneUtils {
    public static void completeMilestone(List<Id> caseIds, 
            String milestoneName, DateTime complDate) {
    if  (complDate != date.today().addDays(-5)) {
                    List<CaseMilestone> cmsToUpdate = [select Id, completionDate
            from CaseMilestone cm
            where caseId in :caseIds and cm.MilestoneType.Name=:milestoneName 
            and completionDate = null limit 1];
            if (cmsToUpdate.isEmpty() == false){
        for (CaseMilestone cm : cmsToUpdate){
            cm.completionDate = complDate;
            }
        update cmsToUpdate;
        }
    else {
        // BAD CODE, JUST HERE TO HAVE OVER 75 %
        List<CaseMilestone> cmsTest = [select Id, completionDate
            from CaseMilestone cm
            where caseId in :caseIds limit 1];
        if (cmsToUpdate.isEmpty() == true) {
            update cmsTest;
        }
    }
    }          
    }
}
@isTest
private class MilestoneTest {

static testMethod void TestCompleteMilestoneCase(){

List<Account> acts = new List<Account>();
Account myAcc = new Account(Name='TestAct', phone='1001231234');
acts.add(myAcc);

Account busAcc = new Account(Name = 'TestForMS', phone='4567890999');
acts.add(busAcc);
insert acts;
Contact cont = new Contact(FirstName = 'Test', LastName = 'LastName', phone='4567890999', accountid = busAcc.id);
insert(cont);

Contact oContact = [select id from Contact limit 1];
        String contactId;
        if (oContact != null)
          contactId = oContact.Id;

Asset ast = new Asset(Name='support platinum', 
                      AccountId=busAcc.Id, 
                      Start_date__c = date.today().addDays(-5), 
                      End_date__c = date.today().addDays(5));
insert ast;

ast = [SELECT Id, Name, Active__c, Start_date__c, End_date__c, AccountId FROM Asset WHERE Id=:ast.Id];
    
String astId;
if (astId != null)
astId = ast.Id;    
    
Entitlement entl = new Entitlement(Name='First Response - SUPPORT PLATINUM PLAN - TestForMS', AccountId=busAcc.Id, AssetId = astId, EndDate= date.today().addDays(5), StartDate= date.today());
insert entl;
    
String entlId;
if (entl != null)
entlId = entl.Id; 
        
List<Case> cases = new List<Case>{};
if (entlId != null){
    Case c = new Case(Subject = 'Test Case with Entitlement ', 
    EntitlementId = entlId, ContactId = contactId, Description = 'test', Departement__c = 'Centreon', AssetId = astId, Priority = 'Blocking', SlaStartDate = date.today());
    cases.add(c);
}
if (cases.isEmpty()==false){
    insert cases;
    
    List<Id> caseIds = new List<Id>();
    for (Case cL : cases){
        caseIds.add(cL.Id);
    }
    milestoneUtils.completeMilestone(caseIds, 'First Response', System.now());
}
}
    
static testMethod void testCompleteMilestoneViaCase(){
List<Account> acts = new List<Account>();
Account myAcc = new Account(Name='TestAct', phone='1001231234');
acts.add(myAcc);

Account busAcc = new Account(Name = 'TestForMS', phone='4567890999');
acts.add(busAcc);
insert acts;
Contact cont = new Contact(FirstName = 'Test', LastName = 'LastName', phone='4567890999', accountid = busAcc.id, Email='test@test.com');
insert(cont);

Contact oContact = [select id from Contact WHERE Email != NULL limit 1];
        String contactId;
        if (oContact != null)
          contactId = oContact.Id;

Asset ast = new Asset(Name='support platinum', 
                      AccountId=busAcc.Id, 
                      Start_date__c = date.today().addDays(-5), 
                      End_date__c = date.today().addDays(5));
insert ast;

ast = [SELECT Id, Name, Active__c, Start_date__c, End_date__c, AccountId FROM Asset WHERE Id=:ast.Id];
    
String astId;
if (astId != null)
astId = ast.Id;  
    
    
Entitlement entl = new Entitlement(Name='First Response - SUPPORT PLATINUM PLAN - TestForMS', AccountId=busAcc.Id, AssetId = astId, EndDate= date.today().addDays(5), StartDate= date.today());
insert entl;
        // Perform data preparation
        entl = [select id from Entitlement limit 1];
        String entlId;
        if (entl != null)
            entlId = entl.Id;
        List<Case> cases = new List<Case>{};
        for(Integer i = 0; i < 1; i++){
            Case c = new Case(Subject = 'Test Case ' + i, Description = 'test');
            cases.add(c);
            if (entlId != null){
                c = new Case(Subject = 'Test Case with Entitlement ' + i, EntitlementId = entlId
                             , ContactId = contactId, Description = 'test', Departement__c = 'Centreon'
                             , AssetId = astId, Priority = 'Blocking', SlaStartDate = date.today());
                cases.add(c);
            }
        }
        
        // Insert the Account records that cause the trigger to execute.
        insert cases;

        List<CaseComment> ccs = new List<CaseComment>{};
        for(Case c : cases){
            CaseComment cc = new CaseComment(CommentBody='TestPublic', IsPublished=true, ParentId=c.Id);
            ccs.add(cc);
            cc = new CaseComment(CommentBody='TestPrivate', IsPublished=false, ParentId=c.Id);
            ccs.add(cc);
        }
        if (ccs.isEmpty()==false)
            insert ccs;
    
    // Now create emailmessage objects for them.
    
        List<EmailMessage> emails = new List<EmailMessage>();
        for(Case c : cases){
            emails.add(new EmailMessage(parentId = c.id));
        }
        if(emails.isEmpty()==false)
            database.insert(emails);
        
        for(Case c : cases){
            Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
            String[] toAddr = new String[] {'test@test.com'};
            mail.setToAddresses(toAddr);
            mail.setSaveAsActivity(false);
            mail.setTargetObjectId(c.ContactId);
            mail.setWhatId(c.Id);
            mail.setHtmlBody('TestHTMLBody');
            mail.setPlainTextBody('TestTextBody');
            Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
        }
      
        // Query the database for the newly inserted records.
        List<Case> insertedCases = [SELECT Subject,
                                           Description,
                                          (SELECT IsPublished, CommentBody From CaseComments),
                                          (SELECT TextBody, Subject, Incoming From EmailMessages)
                                           FROM Case
                                           WHERE Id IN :cases];
    }    
    
}

Can you help me?

Thanks
Hi all,

I use apex trigger to auto complete a milestone "Response Time", it works but I have to create a test apex class to import it in production and the code coverage is only 70%.

Can you help me?

My test class :
@isTest
private class MilestoneTest {

static testMethod void TestCompleteMilestoneCase(){

List<Account> acts = new List<Account>();
Account myAcc = new Account(Name='TestAct', phone='1001231234');
acts.add(myAcc);

Account busAcc = new Account(Name = 'TestForMS', phone='4567890999');
acts.add(busAcc);
insert acts;
Contact cont = new Contact(FirstName = 'Test', LastName = 'LastName', phone='4567890999', accountid = busAcc.id);
insert(cont);

Contact oContact = [select id from Contact limit 1];
        String contactId;
        if (oContact != null)
          contactId = oContact.Id;

Asset ast = new Asset(Name='support platinum', 
                      AccountId=busAcc.Id, 
                      Start_date__c = date.today().addDays(-5), 
                      End_date__c = date.today().addDays(5));
insert ast;

    
ast = [SELECT Id, Name, Active__c, Start_date__c, End_date__c, AccountId FROM Asset WHERE Id=:ast.Id];

    
String astId;
if (astId != null)
astId = ast.Id;    
    
Entitlement entl = new Entitlement(Name='First Response - SUPPORT PLATINUM PLAN - TestForMS', AccountId=busAcc.Id, AssetId = astId, EndDate= date.today().addDays(5), StartDate= date.today());
insert entl;

 String entlId;
if (entl != null)
entlId = entl.Id; 
    

List<Case> cases = new List<Case>{};
if (entlId != null){
	Case c = new Case(Subject = 'Test Case with Entitlement ', 
	EntitlementId = entlId, ContactId = contactId, Description = 'test', Departement__c = 'Centreon', AssetId = astId, Priority = 'Blocking');
	cases.add(c);
}
if (cases.isEmpty()==false){
	insert cases;
    
	List<Id> caseIds = new List<Id>();
	for (Case cL : cases){
		caseIds.add(cL.Id);
	}
	milestoneUtils.completeMilestone(caseIds, 'First Response', System.now());
}
}

}

My apex class MilestoneUtils:
public class MilestoneUtils {
    public static void completeMilestone(List<Id> caseIds, 
            String milestoneName, DateTime complDate) {  
    List<CaseMilestone> cmsToUpdate = [select Id, completionDate
            from CaseMilestone cm
            where caseId in :caseIds and cm.MilestoneType.Name=:milestoneName 
            and completionDate = null limit 1];
    if (cmsToUpdate.isEmpty() == false){
        for (CaseMilestone cm : cmsToUpdate){
            cm.completionDate = complDate;
            }
        update cmsToUpdate;
        }
	else{
		List<CaseMilestone> cmsTest = [select Id, completionDate
            from CaseMilestone cm
            where caseId in :caseIds limit 1];
        update cmsTest;
		}
    }
}

Problem is cmsToUpdate is empty because Case Milestione isn't created. 
I don't understand why

Hi all,

I wrote Trigger Apex with Apex class.

All is Ok on my sandbox, all Apex code is over 75% of code coverage but when I deploy Trigger on my production, I have 0% of code coverage (just for trigger):
"Each trigger must have at least 1% code coverage."

 

trigger CompleteFirstResponseEmail on EmailMessage (after insert) {
    if (UserInfo.getUserType() == 'Standard'){
        DateTime completionDate = System.now();
        Map<Id, String> emIds = new Map<Id, String>();
        for (EmailMessage em : Trigger.new){
            if(em.Incoming == false)
                emIds.put(em.ParentId, em.ToAddress);
        }
        if (emIds.isEmpty() == false){
            Set <Id> emCaseIds = new Set<Id>();
            emCaseIds = emIds.keySet();
                List<Case> caseList = [Select c.Id, c.ContactId, c.Contact.Email,
                    c.OwnerId, c.Status,
                    c.EntitlementId,
                    c.SlaStartDate, c.SlaExitDate
                    From Case c where c.Id IN :emCaseIds];
            if (caseList.isEmpty()==false){
                    List<Id> updateCases = new List<Id>();
                    for (Case caseObj:caseList) {
                        if ((emIds.get(caseObj.Id)==caseObj.Contact.Email)&&
                            //(caseObj.Status == 'In Progress')&&
                            (caseObj.EntitlementId != null)&&
                            (caseObj.SlaStartDate <= completionDate)&&
                            (caseObj.SlaStartDate != null)&&
                            (caseObj.SlaExitDate == null))
                            updateCases.add(caseObj.Id);
                    }
                if(updateCases.isEmpty() == false){
                    milestoneUtils.completeMilestone(updateCases, 
                                'First Response', completionDate);
                }
            }
        }
    }        
}
 
public class MilestoneUtils {
    public static void completeMilestone(List<Id> caseIds, 
            String milestoneName, DateTime complDate) {
    if  (complDate != date.today().addDays(-5)) {
                    List<CaseMilestone> cmsToUpdate = [select Id, completionDate
            from CaseMilestone cm
            where caseId in :caseIds and cm.MilestoneType.Name=:milestoneName 
            and completionDate = null limit 1];
            if (cmsToUpdate.isEmpty() == false){
        for (CaseMilestone cm : cmsToUpdate){
            cm.completionDate = complDate;
            }
        update cmsToUpdate;
        }
    else {
        // BAD CODE, JUST HERE TO HAVE OVER 75 %
        List<CaseMilestone> cmsTest = [select Id, completionDate
            from CaseMilestone cm
            where caseId in :caseIds limit 1];
        if (cmsToUpdate.isEmpty() == true) {
            update cmsTest;
        }
    }
    }          
    }
}
@isTest
private class MilestoneTest {

static testMethod void TestCompleteMilestoneCase(){

List<Account> acts = new List<Account>();
Account myAcc = new Account(Name='TestAct', phone='1001231234');
acts.add(myAcc);

Account busAcc = new Account(Name = 'TestForMS', phone='4567890999');
acts.add(busAcc);
insert acts;
Contact cont = new Contact(FirstName = 'Test', LastName = 'LastName', phone='4567890999', accountid = busAcc.id);
insert(cont);

Contact oContact = [select id from Contact limit 1];
        String contactId;
        if (oContact != null)
          contactId = oContact.Id;

Asset ast = new Asset(Name='support platinum', 
                      AccountId=busAcc.Id, 
                      Start_date__c = date.today().addDays(-5), 
                      End_date__c = date.today().addDays(5));
insert ast;

ast = [SELECT Id, Name, Active__c, Start_date__c, End_date__c, AccountId FROM Asset WHERE Id=:ast.Id];
    
String astId;
if (astId != null)
astId = ast.Id;    
    
Entitlement entl = new Entitlement(Name='First Response - SUPPORT PLATINUM PLAN - TestForMS', AccountId=busAcc.Id, AssetId = astId, EndDate= date.today().addDays(5), StartDate= date.today());
insert entl;
    
String entlId;
if (entl != null)
entlId = entl.Id; 
        
List<Case> cases = new List<Case>{};
if (entlId != null){
    Case c = new Case(Subject = 'Test Case with Entitlement ', 
    EntitlementId = entlId, ContactId = contactId, Description = 'test', Departement__c = 'Centreon', AssetId = astId, Priority = 'Blocking', SlaStartDate = date.today());
    cases.add(c);
}
if (cases.isEmpty()==false){
    insert cases;
    
    List<Id> caseIds = new List<Id>();
    for (Case cL : cases){
        caseIds.add(cL.Id);
    }
    milestoneUtils.completeMilestone(caseIds, 'First Response', System.now());
}
}
    
static testMethod void testCompleteMilestoneViaCase(){
List<Account> acts = new List<Account>();
Account myAcc = new Account(Name='TestAct', phone='1001231234');
acts.add(myAcc);

Account busAcc = new Account(Name = 'TestForMS', phone='4567890999');
acts.add(busAcc);
insert acts;
Contact cont = new Contact(FirstName = 'Test', LastName = 'LastName', phone='4567890999', accountid = busAcc.id, Email='test@test.com');
insert(cont);

Contact oContact = [select id from Contact WHERE Email != NULL limit 1];
        String contactId;
        if (oContact != null)
          contactId = oContact.Id;

Asset ast = new Asset(Name='support platinum', 
                      AccountId=busAcc.Id, 
                      Start_date__c = date.today().addDays(-5), 
                      End_date__c = date.today().addDays(5));
insert ast;

ast = [SELECT Id, Name, Active__c, Start_date__c, End_date__c, AccountId FROM Asset WHERE Id=:ast.Id];
    
String astId;
if (astId != null)
astId = ast.Id;  
    
    
Entitlement entl = new Entitlement(Name='First Response - SUPPORT PLATINUM PLAN - TestForMS', AccountId=busAcc.Id, AssetId = astId, EndDate= date.today().addDays(5), StartDate= date.today());
insert entl;
        // Perform data preparation
        entl = [select id from Entitlement limit 1];
        String entlId;
        if (entl != null)
            entlId = entl.Id;
        List<Case> cases = new List<Case>{};
        for(Integer i = 0; i < 1; i++){
            Case c = new Case(Subject = 'Test Case ' + i, Description = 'test');
            cases.add(c);
            if (entlId != null){
                c = new Case(Subject = 'Test Case with Entitlement ' + i, EntitlementId = entlId
                             , ContactId = contactId, Description = 'test', Departement__c = 'Centreon'
                             , AssetId = astId, Priority = 'Blocking', SlaStartDate = date.today());
                cases.add(c);
            }
        }
        
        // Insert the Account records that cause the trigger to execute.
        insert cases;

        List<CaseComment> ccs = new List<CaseComment>{};
        for(Case c : cases){
            CaseComment cc = new CaseComment(CommentBody='TestPublic', IsPublished=true, ParentId=c.Id);
            ccs.add(cc);
            cc = new CaseComment(CommentBody='TestPrivate', IsPublished=false, ParentId=c.Id);
            ccs.add(cc);
        }
        if (ccs.isEmpty()==false)
            insert ccs;
    
    // Now create emailmessage objects for them.
    
        List<EmailMessage> emails = new List<EmailMessage>();
        for(Case c : cases){
            emails.add(new EmailMessage(parentId = c.id));
        }
        if(emails.isEmpty()==false)
            database.insert(emails);
        
        for(Case c : cases){
            Messaging.SingleEmailMessage mail = new Messaging.SingleEmailMessage();
            String[] toAddr = new String[] {'test@test.com'};
            mail.setToAddresses(toAddr);
            mail.setSaveAsActivity(false);
            mail.setTargetObjectId(c.ContactId);
            mail.setWhatId(c.Id);
            mail.setHtmlBody('TestHTMLBody');
            mail.setPlainTextBody('TestTextBody');
            Messaging.sendEmail(new Messaging.SingleEmailMessage[] { mail });
        }
      
        // Query the database for the newly inserted records.
        List<Case> insertedCases = [SELECT Subject,
                                           Description,
                                          (SELECT IsPublished, CommentBody From CaseComments),
                                          (SELECT TextBody, Subject, Incoming From EmailMessages)
                                           FROM Case
                                           WHERE Id IN :cases];
    }    
    
}

Can you help me?

Thanks
Hi all,

I use apex trigger to auto complete a milestone "Response Time", it works but I have to create a test apex class to import it in production and the code coverage is only 70%.

Can you help me?

My test class :
@isTest
private class MilestoneTest {

static testMethod void TestCompleteMilestoneCase(){

List<Account> acts = new List<Account>();
Account myAcc = new Account(Name='TestAct', phone='1001231234');
acts.add(myAcc);

Account busAcc = new Account(Name = 'TestForMS', phone='4567890999');
acts.add(busAcc);
insert acts;
Contact cont = new Contact(FirstName = 'Test', LastName = 'LastName', phone='4567890999', accountid = busAcc.id);
insert(cont);

Contact oContact = [select id from Contact limit 1];
        String contactId;
        if (oContact != null)
          contactId = oContact.Id;

Asset ast = new Asset(Name='support platinum', 
                      AccountId=busAcc.Id, 
                      Start_date__c = date.today().addDays(-5), 
                      End_date__c = date.today().addDays(5));
insert ast;

    
ast = [SELECT Id, Name, Active__c, Start_date__c, End_date__c, AccountId FROM Asset WHERE Id=:ast.Id];

    
String astId;
if (astId != null)
astId = ast.Id;    
    
Entitlement entl = new Entitlement(Name='First Response - SUPPORT PLATINUM PLAN - TestForMS', AccountId=busAcc.Id, AssetId = astId, EndDate= date.today().addDays(5), StartDate= date.today());
insert entl;

 String entlId;
if (entl != null)
entlId = entl.Id; 
    

List<Case> cases = new List<Case>{};
if (entlId != null){
	Case c = new Case(Subject = 'Test Case with Entitlement ', 
	EntitlementId = entlId, ContactId = contactId, Description = 'test', Departement__c = 'Centreon', AssetId = astId, Priority = 'Blocking');
	cases.add(c);
}
if (cases.isEmpty()==false){
	insert cases;
    
	List<Id> caseIds = new List<Id>();
	for (Case cL : cases){
		caseIds.add(cL.Id);
	}
	milestoneUtils.completeMilestone(caseIds, 'First Response', System.now());
}
}

}

My apex class MilestoneUtils:
public class MilestoneUtils {
    public static void completeMilestone(List<Id> caseIds, 
            String milestoneName, DateTime complDate) {  
    List<CaseMilestone> cmsToUpdate = [select Id, completionDate
            from CaseMilestone cm
            where caseId in :caseIds and cm.MilestoneType.Name=:milestoneName 
            and completionDate = null limit 1];
    if (cmsToUpdate.isEmpty() == false){
        for (CaseMilestone cm : cmsToUpdate){
            cm.completionDate = complDate;
            }
        update cmsToUpdate;
        }
	else{
		List<CaseMilestone> cmsTest = [select Id, completionDate
            from CaseMilestone cm
            where caseId in :caseIds limit 1];
        update cmsTest;
		}
    }
}

Problem is cmsToUpdate is empty because Case Milestione isn't created. 
I don't understand why