+ Start a Discussion
Admin User 5417Admin User 5417 

Saleseforce code covrage is low (53%) and i dont know why

I'v created a class in sandbox, and it works well, but when i'm tring to deploy it to production, i get a low code covarage. I tried everything i know but cat find a solution, Heres the code, Any help?
public Class CandidateFileUploads_Ver1{

public String parentId ;
public String idxVal {get;set;}
public Map<String, Attachment> attachments {get;set;}
public Map<String, Attachment> attachmentsDup {get;set;}

public Boolean validateUser {get;set;}
public String multipulDocs {get;set;}
public String userMessage {get;set;}

private static final Map<String, String> descriptionNameMap = new Map<String, String>{
'Upload a scan of the Passport'=>'Passport',
'Upload a Resume (CV)'=>'Resume (CV)'};

private static final Map<String, String> descriptionCheckFieldMap = new Map<String, String>{
'Upload a scan of the Passport'=>'Passport_Attached__c',
'Upload a Resume (CV)'=>'CV_Attached__c'};

public CandidateFileUploads_Ver1(ApexPages.StandardController controller){

    idxVal = '';
    validateUser = true;
    multipulDocs = System.Label.multiple_docs;
    userMessage = '';

    attachments = new Map<String, Attachment>();       
    attachmentsDup = new Map<String, Attachment>();  

    parentId = System.currentPageReference().getParameters().get('Id');
    //parentId = '0034E00000FVJzA';
    List<Attachment> existingAttachments = fetchAllAttachments(parentId);//get all attachements for thew user

    for(String key :descriptionNameMap.keySet()){
        String kokp = descriptionCheckFieldMap.get(key);
        attachments.put(key.toLowerCase(), new Attachment(parentId=parentId, Description=key, body=null,Name = kokp )) ;

    for(Attachment attach :existingAttachments){
        attach.body = null;
        attachments.put(attach.Description.toLowerCase(), attach);             

 public void checkUserValid(){
    String hours = System.Label.hours;
    String whitelist = System.Label.whitelist;
    ID pId = System.currentPageReference().getParameters().get('Id');
    Boolean validateUser = true;
    String userMessage;

    Contact parenter = new Contact(Id=pId);
     // Validate Proccess status: get proccess string status
            String getStatus = parenter.Process_Status__c;
            String[] whitelistArr = whitelist.split(',');// split proccess string

             Boolean checkWhiteList = false;
             for(String val : whitelistArr){
                 if(val == getStatus) {
                     checkWhiteList = true;

             if(validateUser != checkWhiteList){
                 validateUser = false;
                 userMessage = System.Label.error_not_premitted;

    //Validate Dates
            //Datetime  getLinktimestamp = (Datetime) contactSObject.get('linktimestamp__c');
            Datetime  getLinktimestamp = parenter.linktimestamp__c;
            Datetime  getValidTime = getLinktimestamp.addHours(Integer.valueof(hours.trim())); //add 48 hours
            Datetime timeNow = System.now();

             if(getValidTime < timeNow){//if if more then 48 hours
                 validateUser = false;
                 userMessage = System.Label.error_expired;

 public Datetime  getLinktimestamp(){
    ID pId = System.currentPageReference().getParameters().get('Id');
    Datetime  accts = [SELECT linktimestamp__c FROM Contact WHERE Id=:pId].linktimestamp__c;
    return accts;

public List<Contact> contactObj(){
    ID pId = System.currentPageReference().getParameters().get('Id');

    sObject mySObject =[SELECT linktimestamp__c,Process_Status__c FROM Contact WHERE Id=:pId];
    //Datetime llli = s.linktimestamp__c;
    String strObjectName = String.valueOf( mySObject.get('linktimestamp__c') );

    List<Contact> obj = [SELECT linktimestamp__c,Process_Status__c FROM Contact WHERE Id=:pId];
    return obj;

public void uploadAttachment(){     
    List<Attachment> uploads = new List<Attachment>() ;
    List<Attachment> deletes = new List<Attachment>() ;

        for(integer i = 0 ; i < attachments.values().size() ; i++){

            Attachment attach = attachments.values()[i] ;
            if(attach.parentId == NULL){
                        attach.parentId = System.currentPageReference().getParameters().get('Id');
            //this is a file that was uploaded now
            if(attach.body != NULL){
                //remove current attachement before uploading a new one
                if(attach.Id != NULL){

                attach.Name = renameFile(attach.Name, attach.Description);
                uploads.add(attach) ;

            delete deletes ;

            for(Attachment atchmnt :uploads){
                atchmnt.Id = null;   

            insert uploads;

            Contact parent = new Contact(Id=parentId);

            for(Attachment attach :getUpdatedAttachments(uploads).values()){
                attach.body = null;
                attachments.put(attach.Description.toLowerCase(), attach);

                parent.put(descriptionCheckFieldMap.get(attach.Description), true);                    

            update parent;

            ApexPages.Message myMsg = new ApexPages.Message(ApexPages.Severity.info,'Attachment upload Successfully');

    catch(exception e){
        ApexPages.Message myMsg = new ApexPages.Message(ApexPages.Severity.ERROR,'An Error occured when uploading attachment');

public void removeRow(){
    Attachment a = attachments.get(idxVal.toLowerCase());

    Contact parent = new Contact(Id=parentId);
    parent.put(descriptionCheckFieldMap.get(a.Description), false); 

    delete a;
    update parent;

    system.debug('attachments before: ' + attachments);
    attachments.put(a.Description.toLowerCase(), new Attachment(parentId = parentId, description = a.description, body=null));
    system.debug('attachments after: ' + attachments);

private static String renameFile(String fileName, String description){
    String newName = descriptionNameMap.get(description);
    if(String.isNotBlank(fileName) && fileName.contains('.')){
        newName += fileName.substring(fileName.lastIndexOf('.'), fileName.length());

    return newName;

private static Map<String,Attachment> getUpdatedAttachments(List<Attachment> attachList){

    Map<String,Attachment> attMap = new Map<String,Attachment>();

    for(Attachment att : [SELECT Id,Name,Description
                                      FROM Attachment
                                      WHERE Id = :attachList]){
        attMap.put(att.Description.toLowerCase(), att) ;       

    return attMap;

public List<Attachment> fetchAllAttachments(String parentId){

    return [SELECT Id,Name,Description,parentId
            FROM Attachment 
            WHERE ParentId =: parentId 
            AND Description IN :descriptionNameMap.keySet()];

Jason FlippenJason Flippen

Do you have a Test Class with unit tests for the code you referenced in your post?  If not, you need to create one.  Salesforce requires that at least 75% of your Apex code be covered by unit tests.  Here is a link that might help you:  https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_qs_test.htm

I hope this helps.