-
ChatterFeed
-
0Best Answers
-
0Likes Received
-
0Likes Given
-
3Questions
-
2Replies
Modifying Existing Test Class
Hello,
Please assist in the error with the test class. I have the below Apex Classes for Salesforce attachments and a test class;
AttachmentUtils
FilesUtils Class
AttachmentTrigger
AttachmentUtilsTest
Error is on Code Coverage Failure and test failure message as below;
Code Coverage Failure
Your code coverage is 0%. You need at least 75% coverage to complete this deployment.
AttachmentUtils
Please assist in the error with the test class. I have the below Apex Classes for Salesforce attachments and a test class;
AttachmentUtils
/**
* AttachmentUtils Utility class for processing attachments
*/
public class AttachmentUtils {
public static void saveAttachments(list<attachment> atts){
Set<id> assignmentIds = new Set<id>();
Map<id, string> filenames = new Map<id, string>();
for(Attachment att: atts){
//Get the SObject type
String objectAPIName = att.parentId.getSObjectType().getDescribe().getName();
if(objectAPIName == 'Assignment__c'){
//Get all the attachments for this assignment and concatenate names into a string, then update the field
assignmentIds.add(att.parentId);
}
}
FilesUtils.updateAttachmentNames(assignmentIds);
}
}
FilesUtils Class
/**
* Utility class for processing files
*/
public class FilesUtils {
//Update the Attachment_Names__c field on assignments
public static void updateAttachmentNames(set<id> assignmentIds){
Map<id, string> filenames = new Map<id, string>();
//Get all attachments for all affected assignments
list<attachment> atts = [SELECT id, parentId, name
FROM attachment
WHERE parentId = : assignmentIds];
for(Attachment att: atts){
string existingFilenames = filenames.get(att.parentId);
if (existingFilenames == null) existingFilenames = '';
filenames.put(att.parentId, existingFilenames + ' '+ att.name);
}
List<id> contentDocIds = new List<id>();
//Now get all files for all affected assignments
for (ContentDocumentLink cdl: [SELECT LinkedEntityId,ContentDocumentId, ContentDocument.Title FROM ContentDocumentLink WHERE LinkedEntityId in :assignmentIds]){
string existingFilenames = filenames.get(cdl.LinkedEntityId);
if (existingFilenames == null) existingFilenames = '';
filenames.put(cdl.LinkedEntityId, existingFilenames + ' '+ cdl.ContentDocument.Title);
}
List<id> assIdsWithZeroAtts = new List<id>();
//Check there are no Assignments with zero attachments now
for(id assId: assignmentIds){
if(filenames.containsKey(assId) == false){
assIdsWithZeroAtts.add(assId);
}
}
List<Assignment__c> asses = [SELECT id, Attachment_Names__c
FROM Assignment__c
WHERE id = :assignmentIds];
for (Assignment__c ass: asses){
ass.Attachment_Names__c = filenames.get(ass.id);
}
List<Assignment__c> assesWithZeroAtts = [SELECT id, Attachment_Names__c
FROM Assignment__c
WHERE id = :assIdsWithZeroAtts];
for (Assignment__c ass: assesWithZeroAtts){
ass.Attachment_Names__c = '';
}
update asses;
update assesWithZeroAtts;
}
}
AttachmentTrigger
trigger AttachmentTrigger on Attachment (after insert, after update, after delete) {
//delegate to utility class
//
if(trigger.isDelete){
AttachmentUtils.saveAttachments(trigger.old);
}
else
{
AttachmentUtils.saveAttachments(trigger.new);
}
}
AttachmentUtilsTest
/**
* Test class for attachmentUtils and filesUtils classes
*/
@isTest
public class AttachmentUtilsTest{
static integer NUMBER_OF_FILES = 5;
//this is a test setup method - will be automatically executed before each test method
@testSetup static void createAssignmentandAttachments() {
//Set up facility (account)
Account fac = new Account();
fac.name = 'new facility';
fac.billingCity = 'Weymouth';
fac.billingCountry = 'Iceland';
insert fac;
Assignment__c ast = new Assignment__c();
ast.facility__c = fac.id;
insert ast;
//create and insert the attachments
list<attachment> atts = new list<attachment>();
for(integer i=0;i<NUMBER_OF_FILES;i++){
attachment att = new attachment();
att.parentId = ast.id;
att.name = 'a';
att.body = Blob.valueOf('Attachment Body');
atts.add(att);
}
//this should cause the trigger to fire and concatenate attachment names in the Attachment_Name__c field
//names should be 300 characters long (200 x with spaces in between, plus trailing space)
insert atts;
//create and insert files
list<ContentVersion> contentVersions = new list<ContentVersion>();
for(integer i=0;i<NUMBER_OF_FILES;i++){
String filesString = 'Binary string of the files';
ContentVersion conVer = new ContentVersion();
conVer.ContentLocation = 'S'; // S specify this document is in SF, use E for external files
conVer.PathOnClient = 'file.txt'; // The files name, extension is very important here which will help the file in preview.
conVer.Title = 'c'; // Display name of the files
conVer.VersionData = EncodingUtil.base64Decode(filesString); // converting your binary string to Blog
contentVersions.add(conVer);
}
insert contentVersions;
list<ContentDocumentLink> contentDocLinks = new list<ContentDocumentLink>();
for(ContentVersion conVer: [SELECT contentDocumentId from ContentVersion WHERE Title = 'c']){
//Create ContentDocumentLink
ContentDocumentLink cDe = new ContentDocumentLink();
cDe.ContentDocumentId = conVer.contentDocumentId;
cDe.LinkedEntityId = ast.Id; // you can use objectId,GroupId etc
cDe.ShareType = 'I'; // Inferred permission, checkout description of ContentDocumentLink object for more details
cDe.Visibility = 'AllUsers';
contentDocLinks.add(cDe);
}
insert contentDocLinks;
}
//test to see if trigger is correctly modifying field on assignment when 200 attachments are added
public static testmethod void addAttachments(){
//assert that the attachment name field is correct
string names = [SELECT Attachment_Names__c
FROM assignment__c][0].Attachment_Names__c;
//Each file name is 1 character long
//And the 'attachment names' field contains each filename with a space in between
//So length of Attachment Names should = number of files * 2 characters * 2 (attachments and content) - 1 space
if(names!=null) system.assertEquals(NUMBER_OF_FILES * 2 * 2 - 1,names.length());
}
//test to see if trigger is correctly modifying field on assignment when one attachment name is changed
public static testmethod void modifyAttachments(){
//select an attachment and modify its name
attachment att = [ SELECT id, name
FROM attachment
][0];
att.name = 'aaaa';
contentVersion cv = [SELECT id, Title from ContentVersion][0];
cv.Title = 'cccc';
test.startTest();
update att;
update cv;
test.stopTest();
//test that names field has increased by 4
//assert that the attachment name field is correct
string names = [SELECT Attachment_Names__c
FROM assignment__c][0].Attachment_Names__c;
//Increases by 6 characters total
system.assertEquals(NUMBER_OF_FILES * 2 * 2 - 1 + 6,names.length());
}
//test to see if trigger is correctly modifying field on assignment when one attachment name is deleted
public static testmethod void deleteAttachments(){
//select an attachment and delete it
attachment att = [ SELECT id
FROM attachment
][0];
test.startTest();
delete att;
test.stopTest();
//test that names field is now decreased by 2
//assert that the attachment name field is correct
string names = [SELECT Attachment_Names__c
FROM assignment__c][0].Attachment_Names__c;
system.assertEquals(NUMBER_OF_FILES * 2 * 2 - 1 - 2,names.length());
}
}
Error is on Code Coverage Failure and test failure message as below;
Code Coverage Failure
Your code coverage is 0%. You need at least 75% coverage to complete this deployment.
AttachmentUtils
System.AssertException: Assertion Failed: Expected: 17, Actual: 19 Stack Trace: Class.AttachmentUtilsTest.deleteAttachments: line 139, column 1
-
- Robert Adero
- April 06, 2021
- Like
- 0
This is an Apex Test Class, Delete and Modify methods not working. Only Insert new method when running the test.
Below are part of the Test Class Code which fails;
Method Name: deleteAttachments
Pass/Fail: Fail
Error Message: System.NullPointerException: Attempt to de-reference a null object
Stack Trace: Class.AttachmentUtilsTest.deleteAttachments: line 137, column 1
Class: AttachmentUtilsTest
Method: NamemodifyAttachments
Pass/Fail: Fail
Error Message: System.NullPointerException: Attempt to de-reference a null object
Stack Trace: Class.AttachmentUtilsTest.modifyAttachments: line 115, column 1
Please help, thanks.
Method Name: deleteAttachments
Pass/Fail: Fail
Error Message: System.NullPointerException: Attempt to de-reference a null object
Stack Trace: Class.AttachmentUtilsTest.deleteAttachments: line 137, column 1
Class: AttachmentUtilsTest
Method: NamemodifyAttachments
Pass/Fail: Fail
Error Message: System.NullPointerException: Attempt to de-reference a null object
Stack Trace: Class.AttachmentUtilsTest.modifyAttachments: line 115, column 1
Please help, thanks.
/**
* Test class for attachmentUtils and filesUtils classes
*/
@isTest
public class AttachmentUtilsTest{
static integer NUMBER_OF_FILES = 5;
//this is a test setup method - will be automatically executed before each test method
@testSetup static void createAgriFiReportandAttachments() {
//Set up AgriFi Application (record)
AgriFI_Application__c App =new AgriFI_Application__c();
//App.Name = 'new AgriFI Reference()';
//App.LeadBusinessName = 'Weymouth';
//App.LeadContactSurname = 'Ken';
insert App;
AgriFI_Report__c ast = new AgriFI_Report__c();
ast.AgriFI_Application__c = App.id;
insert ast;
//create and insert the attachments
list<attachment> atts = new list<attachment>();
for(integer i=0;i<NUMBER_OF_FILES;i++){
attachment att = new attachment();
att.parentId = ast.id;
att.name = 'a';
att.body = Blob.valueOf('Attachment Body');
atts.add(att);
}
//this should cause the trigger to fire and concatenate attachment names in the Attachment_Name__c field
//names should be 300 characters long (200 x with spaces in between, plus trailing space)
insert atts;
//create and insert files
list<ContentVersion> contentVersions = new list<ContentVersion>();
for(integer i=0;i<NUMBER_OF_FILES;i++){
String filesString = 'Binary string of the files';
ContentVersion conVer = new ContentVersion();
conVer.ContentLocation = 'S'; // S specify this document is in SF, use E for external files
conVer.PathOnClient = 'file.txt'; // The files name, extension is very important here which will help the file in preview.
conVer.Title = 'c'; // Display name of the files
conVer.VersionData = EncodingUtil.base64Decode(filesString); // converting your binary string to Blog
contentVersions.add(conVer);
}
insert contentVersions;
list<ContentDocumentLink> contentDocLinks = new list<ContentDocumentLink>();
for(ContentVersion conVer: [SELECT contentDocumentId from ContentVersion WHERE Title = 'c']){
//Create ContentDocumentLink
ContentDocumentLink cDe = new ContentDocumentLink();
cDe.ContentDocumentId = conVer.contentDocumentId;
cDe.LinkedEntityId = ast.Id; // you can use objectId,GroupId etc
cDe.ShareType = 'I'; // Inferred permission, checkout description of ContentDocumentLink object for more details
cDe.Visibility = 'AllUsers';
contentDocLinks.add(cDe);
}
insert contentDocLinks;
}
//test to see if trigger is correctly modifying field on assignment when 200 attachments are added
public static testmethod void addAttachments(){
//assert that the attachment name field is correct
string names = [SELECT Attachment_Names__c
FROM AgriFI_Report__c][0].Attachment_Names__c;
//Each file name is 1 character long
//And the 'attachment names' field contains each filename with a space in between
//So length of Attachment Names should = number of files * 2 characters * 2 (attachments and content) - 1 space
if(names!=null) system.assertEquals(NUMBER_OF_FILES * 2 * 2 - 1,names.length());
}
//test to see if trigger is correctly modifying field on assignment when one attachment name is changed
public static testmethod void modifyAttachments(){
//select an attachment and modify its name
attachment att = [ SELECT id, name
FROM attachment
][0];
att.name = 'aaaa';
contentVersion cv = [SELECT id, Title from ContentVersion][0];
cv.Title = 'cccc';
test.startTest();
update att;
update cv;
test.stopTest();
//test that names field has increased by 4
//assert that the attachment name field is correct
string names = [SELECT Attachment_Names__c
FROM AgriFI_Report__c][0].Attachment_Names__c;
//Increases by 6 characters total
system.assertEquals(NUMBER_OF_FILES * 2 * 2 - 1 + 6,names.length());
}
//test to see if trigger is correctly modifying field on assignment when one attachment name is deleted
public static testmethod void deleteAttachments(){
//select an attachment and delete it
attachment att = [ SELECT id
FROM attachment
][0];
test.startTest();
delete att;
test.stopTest();
//test that names field is now decreased by 2
//assert that the attachment name field is correct
string names = [SELECT Attachment_Names__c
FROM AgriFI_Report__c][0].Attachment_Names__c;
system.assertEquals(NUMBER_OF_FILES * 2 * 2 - 1 - 2,names.length());
}
}
-
- Robert Adero
- April 05, 2020
- Like
- 0
Enable a field to be editable
I have a formula field on Record A that updates field 1 from Record B but I would like it to also include a formula that will enable field 1 (or additional field lets say field 2) on Record A to be active and editable when Null Value is shown
-
- Robert Adero
- December 08, 2014
- Like
- 0
Modifying Existing Test Class
Hello,
Please assist in the error with the test class. I have the below Apex Classes for Salesforce attachments and a test class;
AttachmentUtils
FilesUtils Class
AttachmentTrigger
AttachmentUtilsTest
Error is on Code Coverage Failure and test failure message as below;
Code Coverage Failure
Your code coverage is 0%. You need at least 75% coverage to complete this deployment.
AttachmentUtils
Please assist in the error with the test class. I have the below Apex Classes for Salesforce attachments and a test class;
AttachmentUtils
/**
* AttachmentUtils Utility class for processing attachments
*/
public class AttachmentUtils {
public static void saveAttachments(list<attachment> atts){
Set<id> assignmentIds = new Set<id>();
Map<id, string> filenames = new Map<id, string>();
for(Attachment att: atts){
//Get the SObject type
String objectAPIName = att.parentId.getSObjectType().getDescribe().getName();
if(objectAPIName == 'Assignment__c'){
//Get all the attachments for this assignment and concatenate names into a string, then update the field
assignmentIds.add(att.parentId);
}
}
FilesUtils.updateAttachmentNames(assignmentIds);
}
}
FilesUtils Class
/**
* Utility class for processing files
*/
public class FilesUtils {
//Update the Attachment_Names__c field on assignments
public static void updateAttachmentNames(set<id> assignmentIds){
Map<id, string> filenames = new Map<id, string>();
//Get all attachments for all affected assignments
list<attachment> atts = [SELECT id, parentId, name
FROM attachment
WHERE parentId = : assignmentIds];
for(Attachment att: atts){
string existingFilenames = filenames.get(att.parentId);
if (existingFilenames == null) existingFilenames = '';
filenames.put(att.parentId, existingFilenames + ' '+ att.name);
}
List<id> contentDocIds = new List<id>();
//Now get all files for all affected assignments
for (ContentDocumentLink cdl: [SELECT LinkedEntityId,ContentDocumentId, ContentDocument.Title FROM ContentDocumentLink WHERE LinkedEntityId in :assignmentIds]){
string existingFilenames = filenames.get(cdl.LinkedEntityId);
if (existingFilenames == null) existingFilenames = '';
filenames.put(cdl.LinkedEntityId, existingFilenames + ' '+ cdl.ContentDocument.Title);
}
List<id> assIdsWithZeroAtts = new List<id>();
//Check there are no Assignments with zero attachments now
for(id assId: assignmentIds){
if(filenames.containsKey(assId) == false){
assIdsWithZeroAtts.add(assId);
}
}
List<Assignment__c> asses = [SELECT id, Attachment_Names__c
FROM Assignment__c
WHERE id = :assignmentIds];
for (Assignment__c ass: asses){
ass.Attachment_Names__c = filenames.get(ass.id);
}
List<Assignment__c> assesWithZeroAtts = [SELECT id, Attachment_Names__c
FROM Assignment__c
WHERE id = :assIdsWithZeroAtts];
for (Assignment__c ass: assesWithZeroAtts){
ass.Attachment_Names__c = '';
}
update asses;
update assesWithZeroAtts;
}
}
AttachmentTrigger
trigger AttachmentTrigger on Attachment (after insert, after update, after delete) {
//delegate to utility class
//
if(trigger.isDelete){
AttachmentUtils.saveAttachments(trigger.old);
}
else
{
AttachmentUtils.saveAttachments(trigger.new);
}
}
AttachmentUtilsTest
/**
* Test class for attachmentUtils and filesUtils classes
*/
@isTest
public class AttachmentUtilsTest{
static integer NUMBER_OF_FILES = 5;
//this is a test setup method - will be automatically executed before each test method
@testSetup static void createAssignmentandAttachments() {
//Set up facility (account)
Account fac = new Account();
fac.name = 'new facility';
fac.billingCity = 'Weymouth';
fac.billingCountry = 'Iceland';
insert fac;
Assignment__c ast = new Assignment__c();
ast.facility__c = fac.id;
insert ast;
//create and insert the attachments
list<attachment> atts = new list<attachment>();
for(integer i=0;i<NUMBER_OF_FILES;i++){
attachment att = new attachment();
att.parentId = ast.id;
att.name = 'a';
att.body = Blob.valueOf('Attachment Body');
atts.add(att);
}
//this should cause the trigger to fire and concatenate attachment names in the Attachment_Name__c field
//names should be 300 characters long (200 x with spaces in between, plus trailing space)
insert atts;
//create and insert files
list<ContentVersion> contentVersions = new list<ContentVersion>();
for(integer i=0;i<NUMBER_OF_FILES;i++){
String filesString = 'Binary string of the files';
ContentVersion conVer = new ContentVersion();
conVer.ContentLocation = 'S'; // S specify this document is in SF, use E for external files
conVer.PathOnClient = 'file.txt'; // The files name, extension is very important here which will help the file in preview.
conVer.Title = 'c'; // Display name of the files
conVer.VersionData = EncodingUtil.base64Decode(filesString); // converting your binary string to Blog
contentVersions.add(conVer);
}
insert contentVersions;
list<ContentDocumentLink> contentDocLinks = new list<ContentDocumentLink>();
for(ContentVersion conVer: [SELECT contentDocumentId from ContentVersion WHERE Title = 'c']){
//Create ContentDocumentLink
ContentDocumentLink cDe = new ContentDocumentLink();
cDe.ContentDocumentId = conVer.contentDocumentId;
cDe.LinkedEntityId = ast.Id; // you can use objectId,GroupId etc
cDe.ShareType = 'I'; // Inferred permission, checkout description of ContentDocumentLink object for more details
cDe.Visibility = 'AllUsers';
contentDocLinks.add(cDe);
}
insert contentDocLinks;
}
//test to see if trigger is correctly modifying field on assignment when 200 attachments are added
public static testmethod void addAttachments(){
//assert that the attachment name field is correct
string names = [SELECT Attachment_Names__c
FROM assignment__c][0].Attachment_Names__c;
//Each file name is 1 character long
//And the 'attachment names' field contains each filename with a space in between
//So length of Attachment Names should = number of files * 2 characters * 2 (attachments and content) - 1 space
if(names!=null) system.assertEquals(NUMBER_OF_FILES * 2 * 2 - 1,names.length());
}
//test to see if trigger is correctly modifying field on assignment when one attachment name is changed
public static testmethod void modifyAttachments(){
//select an attachment and modify its name
attachment att = [ SELECT id, name
FROM attachment
][0];
att.name = 'aaaa';
contentVersion cv = [SELECT id, Title from ContentVersion][0];
cv.Title = 'cccc';
test.startTest();
update att;
update cv;
test.stopTest();
//test that names field has increased by 4
//assert that the attachment name field is correct
string names = [SELECT Attachment_Names__c
FROM assignment__c][0].Attachment_Names__c;
//Increases by 6 characters total
system.assertEquals(NUMBER_OF_FILES * 2 * 2 - 1 + 6,names.length());
}
//test to see if trigger is correctly modifying field on assignment when one attachment name is deleted
public static testmethod void deleteAttachments(){
//select an attachment and delete it
attachment att = [ SELECT id
FROM attachment
][0];
test.startTest();
delete att;
test.stopTest();
//test that names field is now decreased by 2
//assert that the attachment name field is correct
string names = [SELECT Attachment_Names__c
FROM assignment__c][0].Attachment_Names__c;
system.assertEquals(NUMBER_OF_FILES * 2 * 2 - 1 - 2,names.length());
}
}
Error is on Code Coverage Failure and test failure message as below;
Code Coverage Failure
Your code coverage is 0%. You need at least 75% coverage to complete this deployment.
AttachmentUtils
System.AssertException: Assertion Failed: Expected: 17, Actual: 19 Stack Trace: Class.AttachmentUtilsTest.deleteAttachments: line 139, column 1

- Robert Adero
- April 06, 2021
- Like
- 0
Enable a field to be editable
I have a formula field on Record A that updates field 1 from Record B but I would like it to also include a formula that will enable field 1 (or additional field lets say field 2) on Record A to be active and editable when Null Value is shown

- Robert Adero
- December 08, 2014
- Like
- 0