• Tanner Russell
  • NEWBIE
  • 180 Points
  • Member since 2017

  • Chatter
    Feed
  • 2
    Best Answers
  • 1
    Likes Received
  • 0
    Likes Given
  • 32
    Questions
  • 48
    Replies
I have  written a practice trigger Which populates the Description feild on Account object If the Industry = Banking. From the UI it works good. Also get 100 Test coverage. I feel the trigger is not firing from Test class because my System.debug are not logging the fields I need. I would be very thankful if anyone can point out my mistake. I would like to add my System.assertEquals are failing. Please help me learn


/*Trigger*/

trigger UpdateDescriptionOnAccount on Account (before insert) {
    list<Account> ActList=new list<Account>();
    for(Account a :Trigger.new)
    {
        if(a.Industry=='Banking' && a.Description == Null)
        {
            a.Description='This is a Banking Account';
            ActList.add(a);
        }
       
    }
    //insert ActList;

}

This is my test Class
/*Test Class*/

@isTest
public class TestUpdateDescriptionOnAccount {
    static testmethod void TestUpdate()
    {
       Account a = New Account(Name='Test Account 1',Industry='Banking');
       insert a;
      System.debug('Account Inserted '+a.Name + 'Description ='+a.Description +a.Industry);
       //system.assertEquals('This is a Banking Account',a.Description);
       
        
       Account b = New Account(Name='Test Account 2',Industry='Agriculture');
       insert b;
       //System.assertEquals(Null, b.Description);
        
       list<Account>testAccount = new List<Account>();
        for(integer i=0;i<200;i++)
        {
            Account c = new Account(Name='Account '+i, Industry='Banking');
            testAccount.add(c);
        }
        test.startTest();
        	insert testAccount;
        test.stopTest();
      for(Account d : TestAccount)
       {
            //system.assertEquals('This is a Banking Account',d.Description);
           System.debug('Account Inserted '+d.Name + 'Description ='+d.Description);
       }
        
    }

}


 
Hi All,

I am not a developer at all and tried to deploy a small apex class from Sandbox to Production and hit this error below. Any help and/or guidance is highly appreciated
Screenshot of Error

Thank You
  • April 12, 2017
  • Like
  • 0
I am building a dynamic html email with apex and want to store all of my images in a zipped static resource. How can I pull the image path / reference from the static resource to use in my string.

Currently I have:
public static StaticResource static_resource = [SELECT Id,NamespacePrefix, name, SystemModStamp
                                          FROM StaticResource 
                                          WHERE Name = 'banner'
                                          LIMIT 1];

      String prefix = static_resource.NamespacePrefix;
        if( String.isEmpty(prefix) ) {
            prefix = '';
        } else {
            //If has NamespacePrefix
            prefix += '__';
        }
       String url_file_ref = '/resource/'
                            + String.valueOf(((DateTime)static_resource.get('SystemModStamp')).getTime())
                            + '/' + prefix +
                            + static_resource.get('Name')
                            + '/image.png';


string lookingForURL = Url.getSalesforceBaseUrl().toExternalForm() +url_file_ref();

but the path is not working as a reference.
I am looking to add a checkbox field on a Contact record, could Campaign monitor update that field if someone subscribes or unsubscribes to a specific list?  

Ex. Bob is a customer and is subscribed to the 'List Name'.  Field on Contact ' Checkbox' = TRUE Bob is a customer and chooses to unsubscribed to the 'List Name'.  Field on Contact ' Checkbox' = FALSE

Does campaign monitor allow for this type of customization?
I am having trouble getting test coverage on my dynamic rest callout code, the code sets up the connection to the endpoint than passes in the arguments to the batch class which will make the callout and query the data to be updated and at the finish method it will call itself and set the next argument until the list is complete. How should I approach this from my test class this is what I have so far. Currently my Multi mock is throwing the error Http callout not supported for test methods because my mock variable is not being set. I havent had to do much REST testing so im fairly rusty here anything helps.

Test Class
@isTest
public class ImportLiveData_Test{
    @isTest
    public static void testAllCallout() {
        SingleRequestMock fakeAccountResp = new SingleRequestMock(200,
                                                         'Complete',
                                                         '[{"Name": "sForceTest1"}]',
                                                         null);
 
       /* SingleRequestMock fakeContactsResp = new SingleRequestMock(200,
                                                  'Complete',
                                                  '[{"LastName": "Test Last Name"}]',
                                                   null);*/
 
        Map<String, HttpCalloutMock> endpoint2TestResp =
                                   new Map<String,HttpCalloutMock>();
        endpoint2TestResp.put('https://myendpoint--uat.my.salesforce.com/services/apexrest/GetSOQLData?obj=Account',fakeAccountResp);
 
        
 
        HttpCalloutMock multiCalloutMock =
                                   new MultiRequestMock(endpoint2TestResp);
 
        Test.setMock(HttpCalloutMock.class, multiCalloutMock);
        Test.startTest();
        ImportLiveData.ImportData();
        Test.stopTest();
      //  System.assertEquals(/*check for expected results here...*/);
      //  
      //  
    }
}

Multi Mock
public class MultiRequestMock implements HttpCalloutMock {
    public class RESTException extends Exception {}
    Map<String, HttpCalloutMock> requests;
 
    public MultiRequestMock(Map<String, HttpCalloutMock> requests) {
        this.requests = requests;
    }
 
    public HTTPResponse respond(HTTPRequest req) {
        HttpCalloutMock mock = requests.get(req.getEndpoint());
        if (mock != null) {
            return mock.respond(req);
        } else {
            throw new RESTException('HTTP callout not supported for test methods');
        }
    }
 
    public void addRequestMock(String url, HttpCalloutMock mock) {
        requests.put(url, mock);
    }
}

Single Mock
@isTest
public class SingleRequestMock implements HttpCalloutMock {
        protected Integer code;
        protected String status;
        protected String bodyAsString;
        protected Blob bodyAsBlob;
        protected Map<String, String> responseHeaders;
 
        public SingleRequestMock(Integer code, String status, String body,
                                         Map<String, String> responseHeaders) {
            this.code = code;
            this.status = status;
            this.bodyAsString = body;
            this.bodyAsBlob = null;
            this.responseHeaders = responseHeaders;
        }
 
        public SingleRequestMock(Integer code, String status, Blob body,
                                         Map<String, String> responseHeaders) {
            this.code = code;
            this.status = status;
            this.bodyAsBlob = body;
            this.bodyAsString = null;
            this.responseHeaders = responseHeaders;
        }
 
        public HTTPResponse respond(HTTPRequest req) {
            HttpResponse resp = new HttpResponse();
            resp.setStatusCode(code);
            resp.setStatus(status);
            if (bodyAsBlob != null) {
                resp.setBodyAsBlob(bodyAsBlob);
            } else {
                resp.setBody(bodyAsString);
            }
 
            if (responseHeaders != null) {
                 for (String key : responseHeaders.keySet()) {
                resp.setHeader(key, responseHeaders.get(key));
                 }
            }
            return resp;
        }
}

Code that will setup than initialize the batch apex execution
public class ImportLiveData {
    

    public static void ImportData(){
        string clientid = 'hidden';
        string clientS = 'hidden';
        string token = 'hidden';
        string username = 'hidden';
        String reqbody = 'grant_type=password&client_id='+clientid+'&client_secret='+clientS+'&username='+username+'&password='+token;   
        String endpoint='https://test.salesforce.com/services/oauth2/token';
        String Access_Token;
        Http http = new Http();
        HttpRequest request = new HttpRequest();
        request.setEndpoint(endpoint);
        
        request.setMethod('GET');
        request.setBody(reqbody);
        HttpResponse response = http.send(request);
        System.debug(response.getBody());
        JSONParser parser = JSON.createParser(response.getBody());
        while (parser.nextToken() != null) {
            if ((parser.getCurrentToken() == JSONToken.FIELD_NAME) && (parser.getText() == 'access_token')) {
                parser.nextToken();
                Access_Token = parser.getText();    
            } 
        }            

    Database.executeBatch(new ImportDataBatch('Account',Access_Token));
 
      
    }
    
    
    public static List<sObject> GetRecords(string obj,string tokses){
        Httprequest req1 = new HttpRequest();  
        req1.setEndpoint('https://MyEndpoint--uat.my.salesforce.com/services/apexrest/GetSOQLData?obj=' + obj);  
        req1.setMethod('GET');    
        req1.setHeader('Content-Type','application/json');
        req1.setHeader('Authorization','Bearer '+tokses);            
        Http http1 = new Http();
        HttpResponse res1 = http1.send(req1); 
        List<sObject> objls = (List<sObject>)JSON.deserialize(  res1.getBody() , List<sObject>.class);
     
        System.debug(objls.size());
        return objls;
    }
}
 Part of the batch that calls the REST endpoint and imports the data
 
global class ImportDataBatch implements Database.Batchable<sObject>,Database.AllowsCallouts {
    
    public List <sObject> lsObject = new List<sObject>();
    public string test;
    public string oto;
    global ImportDataBatch(string t, string o){
        //lsObject = objls;    
        test = t;     
        oto = o;    
    }
    
    global List<sObject> start(Database.BatchableContext bc) {
        
        // collect the batches of records or objects to be passed to execute
        return ImportLiveData.GetRecords(test,oto);
        
    }
    global void execute(Database.BatchableContext bc, List<sObject> records){
...

}
   global void finish(Database.BatchableContext bc){
        //The code will call itself again with the next set of data
     
        if(test.equals('Account')){
            Database.executeBatch(new ImportDataBatch('Contact',oto));
        }
...
}




 
Im working with Dataloader.cli and im trying to dynamically populate the soql query through another xml file such as

<root>
<account>select id from account</account>
<root>
to get the metadata dynamically through a REST call
currently the soql query is hardcoded like this but I do have the file generating all I want is:
THIS 
<entry key="sfdc.extractionSOQL" value="{./SOQL.xml Account}"/>
Not this
<entry key="sfdc.extractionSOQL" value="Select Id, name FROM Account"/>
Is this possible or am I better off loading in the xml file directly through code?
I have the task of setting up automated scheduled backups for my organizaiton the issue I am running into is I originally manually put each field into the select statement but down the road we deleted and added new fields resulting in the backups failing or missing important information (see example of config)

<entry key="sfdc.extractionSOQL" value="Select Id, CaseNumber, customfield__c, deleted_custom__c FROM Case"/>

Since these values are hardcoded into the config if the "deleted_custom__c" is deleted in the production org than this backup will fail.

Is there a solution for dynamic soql in dataloader cli such as select * from case or another solution?
    
I have a flow on a custom object and would like to add a lookup field in the flow to the account object filtered by record type.

The issue I am having is that it will not load any results and is just spitting back errors, can anyone help me figure this out this is what I have currently.

User-added imageUser-added image
So I am stumped when it comes to getting passed timed events on a flow/process builder in a test class, I am able to invoke the process using a simple update/insert on the record but in the middle of the process there is a wait 1 hour.
What I have found so far is that I am able to query the FlowInterview based on the label but cannot/do not know how to forcefully start the FlowInterview through code. I have the interview wrapped in a test.starttest and test.stoptest so in theory if I can just force the execution the rest should just work.
If anyone here has experience writing test coverage for timed Flow/process builder events and can give me some tips it would be a huge help.
 
FlowInterview fI  = [select id, name,InterviewLabel,CurrentElement,Guid,PauseLabel,WasPausedFromScreen   from flowinterview where InterviewLabel = 'Change_Record_Type_to_RR_Escalation-15_InterviewLabel' limit 1]; 
//Somehow force the interview to continue		  //Flow.resumeFlow(fI);

 
I have a very weird situation where I have code that queries admin users and fixes their email address on sandbox refresh. The issue I am having is the code works perfectly fine if I click the refresh button but if another system admin with exact same permissions clicks it the code will fail and spit out this username is already used in another org error, I have even tried using the login as option and chose a fellow admin and the code failed. Another note I refreshed the exact same sandboxes that they did while they got the error it worked for me... any advice helps we have all same permissions.
I have the task where I need to make all of the data export dynamic and automated I have the automation part all handled the issue Im running into is on the line
<entry key="sfdc.extractionSOQL" value="Select Id, name FROM Account"/>
I need this to cover all of the fields on the object and if a new field was added that day it will need to be added to the query and included..

basically I just need a way to change all my extraction queries to select * from account etc for each object and it will be done and working any ideas? does sfdc support the select * syntax or a variation?
I have a tree view of records 
->Account
            Contact
                     Case
each have urls linking to the record they are related to but as per my instructions I am supposed to embed this records page in the visual force page when clicked for easy viewing does anyone know how I can approach this?
I want to compare 2 fields in child objects of a parent in a single query I thought the query below might do it by readding the select to it but it does not like that. How can I do this if its possible? I am comparing a field called block_number__c on each object, Thanks (possibly using the Not In could work?)

select id, (Select id, property_name__r.name, block_number__c from Spaces__r where Occupied__c = true or occupied_rr__c = true limit 1), (Select id, block_number__c, property_name__c from contacts) from account where (Select id, block_number__c, property_name__c from contacts).block_number__c != (Select id, property_name__r.name, block_number__c from Spaces__r where Occupied__c = true or occupied_rr__c = true limit 1).block_number__c

 
Account la_test = new Account(Name='Test');
        insert la_test;
	Contact lcon_test = new Contact(LastName='Test', Accountid=la_Test.id, Email='test@test.com');
        insert lcon_test;
        location__C lloc_test = new Location__C(name = locName, site_wf__c = site);
        insert lloc_test;
        RecordType rec = [SELECT Id,Name FROM RecordType WHERE SobjectType='Case' and name = :record];
        Case lc_test = new Case(Subject='This is a test ', Accountid=la_Test.id, Status='New', RecordTypeId=rec.id, Contactid=lcon_test.id, Location__c= lloc_test.id,  Notify_contact__c = true); 
        //for trigger testing

        insert lc_test;
If I do a lookup query on the location id being passed into case its name value is populated but when I do lc_test.location__r.name it shows as null (location__c being a lookup field) does anyone know what im doing wrong?
I need help with modifying my code to work around the heap size limit I have tried using @future but it seems to be having issues with my callout session ID can anyone give me tips on how this can be worked around with this code?
public class TransferLiveData {
    
    public static void TransferData(Boolean IsCreate, String resourceName, String ContentT, String CacheCont){
        //create a list to hold the object maps
        List<Map<id,sObject>> masterList = new List<Map<id,sObject>>();
        //convert each query results from List<sObject> to Map<id,sObject> 
        //using query util library to pull all fields
        masterList.add(new Map<id,sObject>(QueryUtil.QueryAllLimit(Account.getSObjectType().getDescribe(), 'limit 25')));
        masterList.add(new Map<id,sObject>(QueryUtil.QueryAllWhereIN(Space__c.getSObjectType().getDescribe(), 'Account__c', masterList[0].keySet())));
        masterList.add(new Map<id,sObject>(QueryUtil.QueryAllWhereIN(Contact.getSObjectType().getDescribe(), 'Accountid', masterList[0].keySet())));
        masterList.add(new Map<id,sObject>(QueryUtil.QueryAllWhereIN(Case.getSObjectType().getDescribe(), 'Space__c', masterList[1].keySet())));
        masterList.add(new Map<id,sObject>(QueryUtil.QueryAllWhereIN(Asset.getSObjectType().getDescribe(), 'Space__c', masterList[1].keySet())));
        masterList.add(new Map<id,sObject>(QueryUtil.QueryAllWhereIN(Lease__c.getSObjectType().getDescribe(), 'Space__c', masterList[1].keySet())));
        masterList.add(new Map<id,sObject>(QueryUtil.QueryAllWhereIN(Opportunity.getSObjectType().getDescribe(), 'Accountid', masterList[0].keySet())));
        masterList.add(new Map<id,sObject>(QueryUtil.QueryAllWhereIN(Contract.getSObjectType().getDescribe(), 'Accountid', masterList[0].keySet())));
        masterList.add(new Map<id,sObject>(QueryUtil.QueryAll(Location__c.getSObjectType().getDescribe())));
        masterList.add(new Map<id,sObject>(QueryUtil.QueryAll(Lead.getSObjectType().getDescribe())));
        
        //serialize the the json
        String jsonDump = JSON.serialize(masterList);
        
        //is this going to be a new static resource or an update
        if(IsCreate){
            MetadataServiceExamples.createStaticResource(resourceName, ContentT, CacheCont, jsonDump);
        }else{
            MetadataServiceExamples.updateStaticResource(resourceName, ContentT, CacheCont, jsonDump);


        }
        
       
        
    }
}

 
I am trying to setup a method that will be auto run when the sandbox is refreshed the problem is that it is an aync class and I am getting
'Unsupported parameter type SandboxContext' since @future methods must be static. Does anyone know of a way to setup async SandboxPostCopy  methods?

global class FixSandboxUsers implements SandboxPostCopy {
    @future
    global static void runApexClass(SandboxContext context){
I have a class that fixes sandbox user emails and a test class that inserts users than calls the method to fix the emails. This code works if I just run it but  cant get it to work on the test data. Anything Im missing? It fails on the assert.
 
//Fix emails of the admin users on the sandboxs automatically
public class FixSandboxUsers {
    @future
    public static void FixUsers(){
        //make sure its a sandbox enviroment
        if([SELECT IsSandbox FROM Organization LIMIT 1].IsSandbox){
            //get the system admin profile
            Profile p = [Select id, name from Profile where name='System Administrator' limit 1];
            //check users with that profile
            List<User> use = [Select id, name, email, Profileid from user where profileid = :p.id];
            //update each users email
            for(User u : use){
                u.email = u.Email.replace('=','@').replace('@example.com','');
                //debug print out the email
               // System.debug(u.Email);
            }
            //update the users
            update use;
        }
    }
}
@isTest
public class FixSandboxUsers_Test {
    @isTest
    public static void FixUsers_Test(){
        Profile profileId = [SELECT Id FROM Profile WHERE Name = 'System Administrator' LIMIT 1];
        List<User> userList = new List<User>();
        for(integer i = 0; i < 10; i++){
            userList.add(new User(LastName = 'LIVESTON' + i,
                                FirstName='JASON' + i,
                                Alias = 'jliv' + i,
                                Email = 'TESTADDRESS' + i + '=asdf.com@example.com',
                                Username = 'TESTADDRESS' + i + '@asdf.com',
                                ProfileId = profileId.id,
                                TimeZoneSidKey = 'GMT',
                                LanguageLocaleKey = 'en_US',
                                EmailEncodingKey = 'UTF-8',
                                LocaleSidKey = 'en_US'
                               ));
        }
        insert userList;
        Test.startTest();
        FixSandboxUsers.FixUsers();
        Test.stopTest();
        For(User u : userList){
            System.debug(u.Email);
            System.assert(!u.email.contains('='));
            System.assert(!u.email.contains('@example.com'));
           
        }
       
    }
}


 
I have users that have sandboxes but the issue is when I refresh the boxs for them the email gets changed to the default @example.com one. How can I setup a user for a sandbox so the email does not change?
I have created a list of maps and serialized it into a json string. What I would like to be a able to do is deserialize this string back into the same List of maps that was used to serialize it. Is this possible or is there a workaround I can perfom? thanks
//code
String json = JSON.serialize(masterList);
//test
List<Map<id,sObject> masterList = JSON.deserializeUntyped(json);
I am getting this error while trying to delete contacts in a test class
System.DmlException: Delete failed. First exception on row 0 with id 003Q0000018OY8CIAW; first error: INVALID_PERSON_ACCOUNT_OPERATION, cannot reference person contact: []

Deletion works fine if I run the code normally but in the test I get this, how can I work around this for testing purposes or should my query be changed to avoid person accounts?
delete[select id,name from Contact where name like '%test%'];
I have been assigned with making sure nothing breaks while changing the global and user locale from english canada to english USA. From my understanding nothing would break during the change and it might not even be possible to test this? Any sudgestions on this? could somthing go wrong if so any recomendations on how to test this?  
I have been assigned with setting up a way to easily move production data to a developer sandbox after a refresh without the use of excel, I was thinking REST API might be useful. Does anyone know of any easier ways or any tips on how I should approach this?
I am new to salesforce SOQL and I seem to be having an issue when i try to use nested queries the query i am trying to perform is 

List<Space__c> sp = [Select Name, Suite__c, (Select Name from Location__c), (Select Name from RecordType where Name = 'Commercial') from Space__c];

and i keep getting this error 

Name, Suite__c, (Select Name from Location__c), (Select Name from
                                  ^
ERROR at Row:1:Column:42
Didn't understand relationship 'Location__c' in FROM part of query call. If you are attempting to use a custom relationship, be sure to append the '__r' after the custom relationship name. Please reference your WSDL or the describe call for the appropriate names.

even if i append __r instead of __c i still get the same issue any ideas will help i just need the names out of the 2 related objects
I have the task where I need to make all of the data export dynamic and automated I have the automation part all handled the issue Im running into is on the line
<entry key="sfdc.extractionSOQL" value="Select Id, name FROM Account"/>
I need this to cover all of the fields on the object and if a new field was added that day it will need to be added to the query and included..

basically I just need a way to change all my extraction queries to select * from account etc for each object and it will be done and working any ideas? does sfdc support the select * syntax or a variation?
Account la_test = new Account(Name='Test');
        insert la_test;
	Contact lcon_test = new Contact(LastName='Test', Accountid=la_Test.id, Email='test@test.com');
        insert lcon_test;
        location__C lloc_test = new Location__C(name = locName, site_wf__c = site);
        insert lloc_test;
        RecordType rec = [SELECT Id,Name FROM RecordType WHERE SobjectType='Case' and name = :record];
        Case lc_test = new Case(Subject='This is a test ', Accountid=la_Test.id, Status='New', RecordTypeId=rec.id, Contactid=lcon_test.id, Location__c= lloc_test.id,  Notify_contact__c = true); 
        //for trigger testing

        insert lc_test;
If I do a lookup query on the location id being passed into case its name value is populated but when I do lc_test.location__r.name it shows as null (location__c being a lookup field) does anyone know what im doing wrong?
Hi -

I'm trying to set the Corresponding_Sales_VP__c trigger to a specific user record by using their ID. How do i do it?
 
trigger Set_Corresponding_VP on Compensation_Request__c(after insert) {
	List<Compensation_Request__c> requestsToUpdate = new List<Compensation_Request__c>();
    for(Compensation_Request__c reqs : Trigger.new){
        reqs.Corresponding_Sales_VP__c = //User Record with id 005j000000FmuFu
            requestsToUpdate.add(reqs);
    }
    update requestsToUpdate;
}

 
I have  written a practice trigger Which populates the Description feild on Account object If the Industry = Banking. From the UI it works good. Also get 100 Test coverage. I feel the trigger is not firing from Test class because my System.debug are not logging the fields I need. I would be very thankful if anyone can point out my mistake. I would like to add my System.assertEquals are failing. Please help me learn


/*Trigger*/

trigger UpdateDescriptionOnAccount on Account (before insert) {
    list<Account> ActList=new list<Account>();
    for(Account a :Trigger.new)
    {
        if(a.Industry=='Banking' && a.Description == Null)
        {
            a.Description='This is a Banking Account';
            ActList.add(a);
        }
       
    }
    //insert ActList;

}

This is my test Class
/*Test Class*/

@isTest
public class TestUpdateDescriptionOnAccount {
    static testmethod void TestUpdate()
    {
       Account a = New Account(Name='Test Account 1',Industry='Banking');
       insert a;
      System.debug('Account Inserted '+a.Name + 'Description ='+a.Description +a.Industry);
       //system.assertEquals('This is a Banking Account',a.Description);
       
        
       Account b = New Account(Name='Test Account 2',Industry='Agriculture');
       insert b;
       //System.assertEquals(Null, b.Description);
        
       list<Account>testAccount = new List<Account>();
        for(integer i=0;i<200;i++)
        {
            Account c = new Account(Name='Account '+i, Industry='Banking');
            testAccount.add(c);
        }
        test.startTest();
        	insert testAccount;
        test.stopTest();
      for(Account d : TestAccount)
       {
            //system.assertEquals('This is a Banking Account',d.Description);
           System.debug('Account Inserted '+d.Name + 'Description ='+d.Description);
       }
        
    }

}


 
Hi All,

I am not a developer at all and tried to deploy a small apex class from Sandbox to Production and hit this error below. Any help and/or guidance is highly appreciated
Screenshot of Error

Thank You
  • April 12, 2017
  • Like
  • 0