You need to sign in to do that
Don't have an account?
Having Trouble getting over 65% coverage
Hi all,
I created a custom object called Lead Contact. It is located on the Lead Object. When we have multiple Leads from the same company, we add the extra Leads to the Lead Contact object. Once the Parent Lead is converted, all Lead Contacts need to be converted to Contacts and assigned to the Parent Account.
We also have a custom object called Locations that will be moved over upon conversion of the Lead.
The trigger works great in the Sandbox, but I cannot get over 65% coverage in production. Any suggestions?
Trigger:
trigger LeadContactConvertAcc on Account (after insert, after update) { Account a = [select Id, Lead_Convert_Id__c from Account where Id = :Trigger.new[0].Id limit 1]; if(a.Lead_Convert_ID__c != NULL) { Lead l = [select Id from Lead where Id = :a.Lead_Convert_Id__c Limit 1]; for (Lead_Contact__c lc : [Select id, Converted_Account_ID_del__c, First_Name__c, Last_Name__c,Title__c,Email__c,Secondary_Email__c,Phone__c,Fax__c, Mobile__c,Mailing_Street__c,Mailing_City__c,Mailing_State__c, Mailing_Zip__c,Mailing_Country__c FROM Lead_Contact__c WHERE Parent_Lead_ID_del__c = :a.Lead_Convert_Id__c]) { Contact newContact = new Contact ( AccountId = a.Id, FirstName = lc.First_Name__c, LastName = lc.Last_Name__c, Title = lc.Title__c, Email = lc.Email__c, Secondary_Email__c = lc.Secondary_Email__c, Phone = lc.Phone__c, Fax = lc.Fax__c, MobilePhone = lc.Mobile__c, MailingStreet = lc.Mailing_Street__c, MailingCity = lc.Mailing_City__c, MailingState = lc.Mailing_State__c, MailingPostalCode = lc.Mailing_Zip__c, MailingCountry = lc.Mailing_Country__c); insert newContact; lc.Parent_Name_del__c = null; update lc; } for (Location__c ln : [select Id, Lead__c, Account__c from Location__c WHERE Lead__c = :a.Lead_Convert_Id__c]) { ln.Account__c = a.Id; update ln; } } }
Class:
public class LeadContactConvert { static testMethod void LeadContactConvert() { Id a1Id; Id l1Id; Id lnId; Id lcId; Id c1Id; Id c2Id; // CREATE LEAD Lead l1 = new Lead(); l1.Lastname='leaddata'; l1.Company='nav'; l1.Leadsource='Calling Campaign'; l1.IsConverted = false; l1.IsUnreadByOwner = true; l1.Status = 'qualified'; Database.insert(l1); l1Id = l1.id; //CREATE LEAD CONTACT Lead_Contact__c lc = new Lead_Contact__c (); lc.First_Name__c = 'test'; lc.Last_Name__c = 'test'; lc.Title__c = 'test'; lc.Email__c = 'test@test.com'; lc.secondary_Email__c = 'test2@aol.com'; lc.Phone__c = '1111111111'; lc.fax__c = '2222222222'; lc.Mobile__c = '3333333333'; lc.Mailing_Street__c = '123 Main St'; lc.Mailing_City__c = 'Phoenix'; lc.Mailing_State__c = 'AZ'; lc.Mailing_Zip__c = '85083'; lc.Mailing_Country__c = 'USA'; lc.Parent_Name_del__c = l1.Id; Database.insert(lc); lcId = lc.id; //CREATE LOCATION Location__c ln = New Location__c (); ln.Street__c = '123 test'; ln.City__c = 'Test'; ln.State__c = 'az'; ln.zip__c = '11111'; ln.Entrances_Required__c = 'test'; ln.Location__c = 1; ln.Proposed_Demarc__c = 'test'; ln.Account__c = NULL; ln.Lead__c = l1.Id; Database.insert(ln); lnId = ln.id; //CREATE ACCOUNT Account a1 = new Account(); a1.name = 'AName'; a1.type = 'Prospect'; a1.Lead_Convert_ID__c = l1.Id; Database.insert(a1); a1Id = a1.Id; //CREATE CONTACT 1 Contact c1 = new Contact (); c1.LastName = l1.Lastname; c1.Email = 'test@aol.com'; c1.Phone = '9999999999'; c1.AccountId = a1.id; Database.insert(c1); c1Id = c1.id; //CREATE CONTACT 2 Contact c2 = new Contact (); c2.FirstName = lc.First_Name__c; c2.LastName = lc.Last_Name__c; c2.Title = lc.Title__c; c2.Email = lc.Email__c; c2.Secondary_Email__c = lc.Secondary_Email__c; c2.Phone = lc.Phone__c; c2.Fax = lc.Fax__c; c2.MobilePhone = lc.Mobile__c; c2.MailingStreet = lc.Mailing_Street__c; c2.MailingCity = lc.Mailing_City__c; c2.MailingState = lc.Mailing_State__c; c2.MailingPostalCode = lc.Mailing_Zip__c; c2.MailingCountry = lc.Mailing_Country__c; c2.AccountId = lc.Converted_Account_ID_del__c; Database.insert(c2); c2Id = c2.id; // Account a = [select Id, Lead_Convert_Id__c from Account where Lead_Convert_Id__c = :l1.Id limit 1]; // Lead_Contact__c lc1 = [Select id, Converted_Account_ID_del__c, First_Name__c, // Last_Name__c,Title__c,Email__c,Secondary_Email__c,Phone__c,Fax__c, // Mobile__c,Mailing_Street__c,Mailing_City__c,Mailing_State__c, // Mailing_Zip__c,Mailing_Country__c // FROM Lead_Contact__c // WHERE Parent_Name_del__c = :a.Lead_Convert_Id__c]; Contact newContact = new Contact ( AccountId = a1.Id, FirstName = lc.First_Name__c, LastName = lc.Last_Name__c, Title = lc.Title__c, Email = lc.Email__c, Phone = lc.Phone__c, Fax = lc.Fax__c, MobilePhone = lc.Mobile__c, MailingStreet = lc.Mailing_Street__c, MailingCity = lc.Mailing_City__c, MailingState = lc.Mailing_State__c, MailingPostalCode = lc.Mailing_Zip__c, MailingCountry = lc.Mailing_Country__c); insert newContact; lc.Parent_Name_del__c = null; update lc; ln.Account__c = a1.Id; update ln; } }
Thank you in advance for any assistance.
Levi
WHERE Parent_Lead_ID_del__c = :a.Lead_Convert_Id__c])
^ from what i can see this particular part of your soql statement is the problem, since the code that uses that particular statement is not being reached, i would say its safe to asssume that the soql statement is returning nothing. You should look back over the code and make sure that it is exactly what you wanna say there.
Ask yourself:
Should this statement actually return something ?
Is a.Lead_Convert_Id__c a null variable at execution ?
Is a.Lead_Convert_Id__c definately the right element to use for this situation ?
I'm sorry i cant be of more help. I cannot really look into your variables and your databse to ensure that the statement is the right one for what you are trying to do, but i am sure if you go through that statement enough and test all of the outcomes you will figure out why it's not returning anything.
******
EDIT
******
-Since your program works correctly as you say, id make sure that in your test class that you have appropriately assigned the variables so that the soql statement in question will return something, so that your test program will go through that part of the code, getting you to probably 100 % coverage.
Mind you it doesnt mean your code is broke, just that the test class you wrote is not testing enough of your code.
*******
All Answers
So you are trying to deploy this into production but it's not letting you because your code coverage is 65%?
Yes.
It looks to me like the test class should run through every line of code in your trigger. Try running your test method in anonymous apex and put some print statements in each control block and make sure the print statements are reached.
When you run the test, it takes you to a page with feedback that looks like this:
APEX TEST RESULT
....
...
...
..
..
Go to the area that says "CODE COVERAGE". click on the percentage of coverage(in your case click on the 65%). it will bring up a window that has your code that was tested, the covered parts are in blue. the parts in red were not covered by your test. you need to add test code for some of those parts (preferibly all to soundly test your trigger, though you can successfully create a trigger with say 78 % coverage that works just fine.) to bring it up to the pass percentage. if you can't figure out how to test those parts in red, you can post them here and we can try to help. it would be alot easier for you to post those parts in red here, than for us to try to figure out which parts are tested by your code with only our eyes. =p
Here is the CODE Coverage:
Not sure how to fix the Contact section.
Thanks for your help!!
What is the purpose of the brackets on lines 16 and 50 ?
Nvm i see the ' for 'now, gimme another second.
WHERE Parent_Lead_ID_del__c = :a.Lead_Convert_Id__c])
^ from what i can see this particular part of your soql statement is the problem, since the code that uses that particular statement is not being reached, i would say its safe to asssume that the soql statement is returning nothing. You should look back over the code and make sure that it is exactly what you wanna say there.
Ask yourself:
Should this statement actually return something ?
Is a.Lead_Convert_Id__c a null variable at execution ?
Is a.Lead_Convert_Id__c definately the right element to use for this situation ?
I'm sorry i cant be of more help. I cannot really look into your variables and your databse to ensure that the statement is the right one for what you are trying to do, but i am sure if you go through that statement enough and test all of the outcomes you will figure out why it's not returning anything.
******
EDIT
******
-Since your program works correctly as you say, id make sure that in your test class that you have appropriately assigned the variables so that the soql statement in question will return something, so that your test program will go through that part of the code, getting you to probably 100 % coverage.
Mind you it doesnt mean your code is broke, just that the test class you wrote is not testing enough of your code.
*******
Well, your SOQL query might be returning null and the code inside for loop doesnt gets executed, thats why your code coverage is low.
I think you need to check your where clause of the query.
Note: Trigger should be bulk safe which means it should handle large chunk of data at a time when importing through API else it would throw exception.
your code contains both SOQL queries and DML statements inside the loop, so could be an issue later on.
Hi,
you forgot to set value for Parent_Lead_Id_del__c in Lead_Contact__c object. Set the value first and then try.
I bulkified the trigger and reworked it a bit based on all of your suggestions. I works great! Thanks for all of your help!
Trigger: