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());
}
}
List<SObjectField>
instead.Schema.Subject__c.Image1__c
, you can simplify it to justSubject__c.Image1__c
.