[SalesForce] Apex Test Class for Trigger on ContentVersion

I just finished writing the trigger below and I am so excited that it works. This is the first time I have ever done a trigger on the ContentDocumentLink object. I am now trying to create a test class for it and can't get more than 19% coverage. I know I am missing something obvious. Any help would be great! Thanks.

TRIGGER:

    trigger Update_Image_Field_BPR2 on ContentDocumentLink (after insert, after update, before delete, after undelete){
try{
    List<Subject__c> subList = new List<Subject__c>();
    List<Business__c> busList = new List<Business__c>();
    List<Schema.SobjectField> imageFldBus = new List<Schema.SobjectField> {
        Business__c.Image1__c,
        Business__c.Image2__c,
        Business__c.Image3__c,
        Business__c.Image4__c,
        Business__c.Image5__c};
    List<Schema.SobjectField> imageFldSubs = new List<Schema.SobjectField> {
        Subject__c.Image1__c,
        Subject__c.Image2__c,
        Subject__c.Image3__c,
        Subject__c.Image4__c,
        Subject__c.Image5__c};
    //Set of Subject__c Ids that we will iterate through
    Set<id> fileIds = new Set<id>();
    for(ContentDocumentLink content : Trigger.IsDelete ? Trigger.old : Trigger.new){
        Id parentObjId = content.LinkedEntityId;
        if(parentObjId.getSObjectType() == Subject__c.SObjectType || parentObjId.getSObjectType() == Business__c.SObjectType){
            fileIds.add(content.LinkedEntityId);
        }        
    }
    // Get the Subject__c id and Image1__c  for each Subject__c
    Map<id, Subject__c> subMap = new Map<id, Subject__c>([Select id, Image1__c, Image2__c, Image3__c, Image4__c, Image5__c 
                                                          from Subject__c Where Id in :fileIds]);  
    Map<id, Business__c> busMap = new Map<id, Business__c>([Select id, Image1__c, Image2__c, Image3__c, Image4__c, Image5__c 
                                                            from Business__c Where Id in :fileIds]);  
    Map<id, ContentDocumentLink> docMap = new Map<id, ContentDocumentLink>([SELECT ContentDocument.LatestPublishedVersionId 
                                                                            FROM ContentDocumentLink WHERE LinkedEntityId IN :fileIds
                                                                           AND (ContentDocument.FileExtension = 'jpg' OR ContentDocument.FileExtension = 'jpeg' 
                                                                                OR ContentDocument.FileExtension = 'png' OR ContentDocument.FileExtension = 'gif')]); 
    for(ContentDocumentLink content : Trigger.IsDelete ? Trigger.old : Trigger.new){
        Id parentObjId = content.LinkedEntityId;
        if(parentObjId.getSObjectType() == Business__c.SObjectType){
            Business__c bus = busMap.get(content.LinkedEntityId);
            ContentDocumentLink querymember = docMap.get(content.id);
            String fullFileURL = querymember.ContentDocument.LatestPublishedVersionId;
            system.debug(fullFileURL);
            if(!Trigger.IsDelete){
                for (Schema.SobjectField f : imageFldbus)
                if (bus.get(f) == null) { // is curr val null?
                    bus.put(f,fullFileUrl);  // set null val to url and leave loop
                    break;
                }}
            if(Trigger.IsDelete){
                for (Schema.SobjectField f : imageFldbus)
                if (bus.get(f) == fullFileUrl) { // is curr val URL?
                    bus.put(f,null);  // set val to null and leave loop
                    break;
                }}
            busList.add(bus);
        }
        if(parentObjId.getSObjectType() == Subject__c.SObjectType){
            Subject__c sub = subMap.get(content.LinkedEntityId);
            ContentDocumentLink querymember = docMap.get(content.id);
            String fullFileURL = querymember.ContentDocument.LatestPublishedVersionId;
            system.debug(fullFileURL);
            if(!Trigger.IsDelete){
                for (Schema.SobjectField f : imageFldsubs)
                if (sub.get(f) == null) { // is curr val null?
                    sub.put(f,fullFileUrl);  // set null val to url and leave loop
                    break;
                }}
            if(Trigger.IsDelete){
                for (Schema.SobjectField f : imageFldsubs)
                if (sub.get(f) == fullFileUrl) { // is curr val URL?
                    sub.put(f,null);  // set val to null and leave loop
                    break;
                }}            
            subList.add(sub);
        }
    }
    if(subList != null && subList.size() > 0){update subList;}if(busList != null && busList.size() > 0){update busList;}} catch(Exception e){ System.debug('ERROR: '+ e);}
}

APEX TEST CLASS:

@isTest(seeAllData=false)
public class Update_Image_Field_BPR2_TEST {
    static testMethod void testSubAddFiles() 
    { 
        Subject__c sub=new Subject__c(); 
            sub.Image1__c=null;
            sub.Image2__c=null;
            sub.Image3__c=null;
            sub.Image4__c=null;
            sub.Image5__c=null;
        insert sub; 

        ContentVersion content=new ContentVersion(); 
            content.Title='Header_Picture1'; 
            content.PathOnClient='/' + content.Title + '.jpg'; 
            Blob bodyBlob=Blob.valueOf('Unit Test ContentVersion Body'); 
            content.VersionData=bodyBlob; 
            //content.LinkedEntityId=sub.id;
            content.origin = 'H';
        insert content;

        ContentDocumentLink contentlink=new ContentDocumentLink();
            contentlink.LinkedEntityId=sub.id;
            contentlink.contentdocumentid=content.contentdocumentid;
        insert contentlink;

        List<ContentDocumentLink> files=[SELECT Id, ContentDocumentId, ContentDocument.LatestPublishedVersionId, LinkedEntityId, ContentDocument.Title 
                                        from ContentDocumentLink where ContentDocumentId= :content.ContentDocumentId]; 
        System.assertEquals(1, files.size()); 
    }
    static testMethod void testSubRemoveFiles() 
    { 
        Subject__c sub=new Subject__c(); 
            sub.Image1__c=null;
            sub.Image2__c=null;
            sub.Image3__c=null;
            sub.Image4__c=null;
            sub.Image5__c=null;
        insert sub; 

        ContentVersion content=new ContentVersion(); 
            content.Title='Header_Picture1'; 
            content.PathOnClient='/' + content.Title + '.jpg'; 
            Blob bodyBlob=Blob.valueOf('Unit Test ContentVersion Body'); 
            content.VersionData=bodyBlob; 
            //content.LinkedEntityId=sub.id;
            content.origin = 'H';
        insert content;

        ContentDocumentLink contentlink=new ContentDocumentLink();
            contentlink.LinkedEntityId=sub.id;
            contentlink.contentdocumentid=content.contentdocumentid;
        insert contentlink;        
        List<ContentDocumentLink> files=[SELECT Id, ContentDocumentId, ContentDocument.LatestPublishedVersionId, LinkedEntityId, ContentDocument.Title 
                                        from ContentDocumentLink where ContentDocumentId= :content.ContentDocumentId]; 
        sub.Image1__c = contentlink.ContentDocument.LatestPublishedVersionId;
        delete contentlink;
        System.assertEquals(0, files.size()); 
    }
    static testMethod void testSubUpdateFiles() 
    { 
        Subject__c sub=new Subject__c(); 
            sub.Image1__c=null;
            sub.Image2__c=null;
            sub.Image3__c=null;
            sub.Image4__c=null;
            sub.Image5__c=null;
        insert sub; 

        ContentVersion content=new ContentVersion(); 
            content.Title='Header_Picture1'; 
            content.PathOnClient='/' + content.Title + '.jpg'; 
            Blob bodyBlob=Blob.valueOf('Unit Test ContentVersion Body'); 
            content.VersionData=bodyBlob; 
            //content.LinkedEntityId=sub.id;
            content.origin = 'H';
        insert content;

        ContentDocumentLink contentlink=new ContentDocumentLink();
            contentlink.LinkedEntityId=sub.id;
            contentlink.contentdocumentid=content.contentdocumentid;
        insert contentlink;
        update contentlink;

        List<ContentDocumentLink> files=[SELECT Id, ContentDocumentId, ContentDocument.LatestPublishedVersionId, LinkedEntityId, ContentDocument.Title 
                                        from ContentDocumentLink where ContentDocumentId= :content.ContentDocumentId]; 
        System.assertEquals(1, files.size()); 
    }
    static testMethod void testBusAddFiles() 
    { 
        Business__c bus=new Business__c(); 
            bus.Image1__c=null;
            bus.Image2__c=null;
            bus.Image3__c=null;
            bus.Image4__c=null;
            bus.Image5__c=null;
        insert bus; 

        ContentVersion content=new ContentVersion(); 
            content.Title='Header_Picture2'; 
            content.PathOnClient='/' + content.Title + '.jpg'; 
            Blob bodyBlob=Blob.valueOf('Unit Test ContentVersion Body'); 
            content.VersionData=bodyBlob; 
            //content.LinkedEntityId=sub.id;
            content.origin = 'H';
        insert content;

        ContentDocumentLink contentlink=new ContentDocumentLink();
            contentlink.LinkedEntityId=bus.id;
            contentlink.contentdocumentid=content.contentdocumentid;
        insert contentlink;

        List<ContentDocumentLink> files=[SELECT Id, ContentDocumentId, ContentDocument.LatestPublishedVersionId, LinkedEntityId, ContentDocument.Title 
                                        from ContentDocumentLink where ContentDocumentId= :content.ContentDocumentId]; 
        System.assertEquals(1, files.size()); 
    }
    static testMethod void testBusRemoveFiles() 
    { 
        Business__c bus=new Business__c(); 
            bus.Image1__c=null;
            bus.Image2__c=null;
            bus.Image3__c=null;
            bus.Image4__c=null;
            bus.Image5__c=null;
        insert bus; 

        ContentVersion content=new ContentVersion(); 
            content.Title='Header_Picture2'; 
            content.PathOnClient='/' + content.Title + '.jpg'; 
            Blob bodyBlob=Blob.valueOf('Unit Test ContentVersion Body'); 
            content.VersionData=bodyBlob; 
            //content.LinkedEntityId=sub.id;
            content.origin = 'H';
        insert content;

        ContentDocumentLink contentlink=new ContentDocumentLink();
            contentlink.LinkedEntityId=bus.id;
            contentlink.contentdocumentid=content.contentdocumentid;
        insert contentlink;

        List<ContentDocumentLink> files=[SELECT Id, ContentDocumentId, ContentDocument.LatestPublishedVersionId, LinkedEntityId, ContentDocument.Title 
                                        from ContentDocumentLink where ContentDocumentId= :content.ContentDocumentId]; 
        bus.Image1__c = contentlink.ContentDocument.LatestPublishedVersionId;
        delete contentlink;
        System.assertEquals(0, files.size()); 
    }
    static testMethod void testBusUpdateFiles() 
    { 
        Business__c bus=new Business__c(); 
            bus.Image1__c=null;
            bus.Image2__c=null;
            bus.Image3__c=null;
            bus.Image4__c=null;
            bus.Image5__c=null;
        insert bus; 

        ContentVersion content=new ContentVersion(); 
            content.Title='Header_Picture2'; 
            content.PathOnClient='/' + content.Title + '.jpg'; 
            Blob bodyBlob=Blob.valueOf('Unit Test ContentVersion Body'); 
            content.VersionData=bodyBlob; 
            //content.LinkedEntityId=sub.id;
            content.origin = 'H';
        insert content;

        ContentDocumentLink contentlink=new ContentDocumentLink();
            contentlink.LinkedEntityId=bus.id;
            contentlink.contentdocumentid=content.contentdocumentid;
        insert contentlink;
        update contentLink;

        List<ContentDocumentLink> files=[SELECT Id, ContentDocumentId, ContentDocument.LatestPublishedVersionId, LinkedEntityId, ContentDocument.Title 
                                        from ContentDocumentLink where ContentDocumentId= :content.ContentDocumentId]; 
        System.assertEquals(1, files.size()); 
    }
}

Best Answer

You have a number of if/else statements in there and it looks like your test methods do not cover each of those. As such the test coverage will only calculate the percentage of code you're actually running through. To fix this simply add more test cases that will hit the different if/else statements.

Also your trigger is after insert, after update, before delete, after undelete but you only test insert. Try adding test cases for update, delete and undelete.

And finally, you might want to look at re-writing your if/else's to be if/else if. And since they all do the same behavior you might want to pull out into a method.

Related Topic