Tuesday, 18 July 2017

How to write test class for Scheduler /Schedulable class in Salesforce



Sample Batch job

global class AccountUpdateBatchJob implements Database.Batchable<sObject> 
{    
    global Database.QueryLocator start(Database.BatchableContext BC)     {
        String query = 'SELECT Id,Name FROM Account';                
        return Database.getQueryLocator(query);     
    }    
    global void execute(Database.BatchableContext BC, List<Account> scope)     {        
        for(Account a : scope)        
        {            
            a.Name = a.Name + 'Updated by Batch job';        
        }        
        update scope;       
    }    
    global void finish(Database.BatchableContext BC) {    }
}



Scheduler Class For Batch Apex


global class AccountUpdateBatchJobscheduled implements Schedulable 
{
    global void execute(SchedulableContext sc) 
    {
        AccountUpdateBatchJob b = new AccountUpdateBatchJob(); 
        database.executebatch(b);
    }
}




Test Class for Scheduler Class


@isTest
private class AccountUpdateBatchJobscheduledTest
{

    static testmethod void schedulerTest() 
    {
        String CRON_EXP = '0 0 0 15 3 ? *';
        
        // Create your test data
        Account acc = new Account();
        acc.name= 'test';
        insert acc;
        
        Test.startTest();

            String jobId = System.schedule('ScheduleApexClassTest',  CRON_EXP, new AccountUpdateBatchJobscheduled());
            CronTrigger ct = [SELECT Id, CronExpression, TimesTriggered, NextFireTime FROM CronTrigger WHERE id = :jobId];
            System.assertEquals(CRON_EXP, ct.CronExpression);
            System.assertEquals(0, ct.TimesTriggered);

        Test.stopTest();
        // Add assert here to validate result
    }
}



Please check below post for Batch job
1) http://amitsalesforce.blogspot.com/2016/02/batch-apex-in-salesforce-test-class-for.html



Please check below post for more detail
1) https://developer.salesforce.com/docs/atlas.en-us.apexcode.meta/apexcode/apex_scheduler.htm


Thanks,
Amit Chaudhary




Wednesday, 21 June 2017

Test Salesforce API by Postman Rest Client | Postman and Salesforce | Calling APEX Rest service using Postman| OAuth 2.0


Force.com platform support powerful web services API for interaction with external app and salesforce.com . For secured interaction with third party app, Salesforce enforces authentication process.


Above image is picked from here.


Step 1) Connected App for OAuth

To perform OAuth in salesforce, you must create Connected App in salesforce

Follow below step to create connected App.

1) Click on Setup->Create->App


2) Then from above screen click on Connect Apps then New button. Then add all required information like below



 3) Now After creating connected App we have consumer key and consumer secret



Step 2) Create a REST API in salesforce.

Please check below post for REST API
1) Learn Rest API in salesforce | How to learn Rest API | Rest API in salesforce
2) Rest API in Salesforce | Execute Rest API on workbench | Test class for Rest API

Sample code to Start


@RestResource(urlMapping='/api/Account/*')
global with sharing class MyFirstRestAPIClass
{
@HttpGet
global static Account doGet()
{
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
String AccNumber = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
Account result = [SELECT Id, Name, Phone, Website FROM Account WHERE AccountNumber = :AccNumber ];
return result;
}

@HttpDelete
global static void doDelete()
{
RestRequest req = RestContext.request;
RestResponse res = RestContext.response;
String AccNumber = req.requestURI.substring(req.requestURI.lastIndexOf('/')+1);
Account result = [SELECT Id, Name, Phone, Website FROM Account WHERE AccountNumber = :AccNumber ];
delete result;
}

@HttpPost
global static String doPost(String name,String phone,String AccountNumber )
{
Account acc = new Account();
acc.name= name;
acc.phone=phone;
acc.AccountNumber =AccountNumber ;
insert acc;

return acc.id;
}

}

Step 3) Get Access Token by POSTMAN

  3.1) Install the postman from here.

  Download URL :- https://www.getpostman.com/

  3.2) Generate URL

  OAuth Endpoints in Salesforce
  Authorization
: https://login.salesforce.com/services/oauth2/authorize
  Token Request: https://login.salesforce.com/services/oauth2/token




  There are two way to get Access token
  1) By Post Callout (Direct URL)
  2) By OAuth Setting in POSTMAN (Wizard one)

  3.2.1:- By Post Callout (Direct URL)

  Use below link to Generate the Token for accessing SFDC

https://na50.salesforce.com/services/oauth2/token?grant_type=password&client_id=***Consumer Key_Here***&client_secret=***Consumer Secret_Here***&username=*********&password=*****password+securityToken******






NOTE:-   May be After try to login you will get below error "Failed: Not approved for access"



     Please check below post to resolve this issue
    1) https://help.salesforce.com/articleView?id=000212208&language=en_US&type=1
    2) http://amitsalesforce.blogspot.com/2017/06/failed-not-approved-for-access-in.html
  

  Finally We have Access Token

  3.2.2:- By OAuth Setting in POSTMAN (Wizard one)

  •   Select Type OAuth 2.0

  • Then click on  "Get Access Token". Then provide all below detail.

  • Then click on Request Token button. Then it will ask you to enter userName and password.


  • Here we have Access Token
  


Step 4) Test APEX REST API. 

Now Copy the Access Token from above Screen. Add below detail to make get call



a.       End point URL: https://na50.salesforce.com/services/apexrest/api/Account/12345
b.      Select method as ‘GET
c.       Put the details in header as below:
Authorization: OAuth + Access Token



Or you can try like below as well.


Now Copy the Access Token from above Screen. Add below detail to make get call


a.       Click Add Token to "Header"
b.      Then select "Use Token"
c.       Then select Get Method and add below URL
https://na50.salesforce.com/services/apexrest/api/Account/12345





Related Post
1) Apex REST Basic Code Sample
2) Rest API
3) Understanding the Web Server OAuth Authentication Flow

Please let us know if this will help you

Thanks
Amit Chaudhary

Sunday, 18 June 2017

Failed: Not approved for access in salesforce



After entering credentials and attempting to login to Salesforce, the API user is denied access to the application and is typically accompanied by a Login History Status of "Failed: Not approved for access".




Solution:-

Update  OAuth policies and set Permitted Users to "All users may self-authorize".

Step 1) Open the connected App the click on Manage button.




Step 2) Then click on Edit policies button




Step 3)  then update "OAuth policies"





     Please check below post to resolve this issue
    1) https://help.salesforce.com/articleView?id=000212208&language=en_US&type=1


Thanks
Amit Chaudhary

Saturday, 10 June 2017

Salesforce Apex Hours:- Salesforce DX



Farmington Hill Salesforce Developer group / "Salesforce Apex Hours" organized another successful Online session/event on Saturday, JUNE 10, 2017 , focusing on "Salesforce DX".

"Salesforce Apex Hours" is a recurring event to talk about salesforce ! Some times we'd like to meet on one location and some time online.
This time we planned one online session on "Salesforce DX" with Jitendra Zaa (Salesforce MVP).

Agenda :-
Salesforce DX provides you with an integrated, end-to-end lifecycle designed for high-performance agile development. In this session we would go through hands on and see how Salesforce DX can be used to create scratch org, automated testing and data load purpose. We would discuss CLI option as well Force.com IDE

  • Introduction to Salesforce DX
  • Creating Scratch Org
  • Deploying metadata to Scratch Org
  • Creating Skeleton Workspace
  • Running Test classes
  • Getting Help
  • Using Force.com IDE with Salesforce DX
  • Q&A 

Speaker : -Jitendra Zaa (Salesforce MVP) ,Amit Chaudhary
Date :- Saturday, JUNE 10, 2017 11:00 AM EST
Venue/Link :- Online.




Here is PPT of Session


https://www.slideshare.net/AmitChaudhary112/salesforce-apex-hours-salesforce-dx


Here is Session Recording





Thanks
Amit Chaudhary @amit_sfdc
Email :- amit.salesforce21@gmail.com




Friday, 9 June 2017

WebService Methods in Salesforce


1) You can't use the web-Service keyword to define an interface,
2) System defined enums cannot be used in Web-service methods
3) You can't use the webService keyword in a trigger
4) All classes that contain methods defined with the webService keyword must be declared as global.
5) Methods defined with the webService keyword are inherently global. These methods can be used by any Apex code that has access to the class. You can consider the webService keyword as a type of access modifier that enables more access than global
6) You should define any method that uses the web-Service keyword as static
7) You can't deprecate webService methods or variables in managed package code
8) Methods defined with the webService keyword cannot take the following elements as parameters. While these elements can be used within the method, they also cannot be marked as return values.
  • Maps
  • Sets
  • Pattern objects
  • Matcher objects
  • Exception objects

9) You can use the web-service modifier to define top level, outer class methods and variables, and member variables of an inner class. It can't be used on a class itself, or an interface or interface methods or variables.

NOTE:-  Invoking a custom webService method always uses system context. Consequently, the current user's credentials are not used, and any user who has access to these methods can use their full power, regardless of permissions, field-level security, or sharing rules. Developers who expose methods with the webService keyword should therefore take care that they are not inadvertently exposing any sensitive data

Apex class methods that are exposed through the API with the webService keyword don't enforce object permissions and field-level security by default


global class MyWebService {
    webService static Id makeContact(String lastName, Account a) {
        Contact c = new Contact(lastName = 'Weissman', AccountId = a.Id);
        insert c;
        return c.id;
    }
}



Tuesday, 16 May 2017

Salesforce Apex Hours:- HyperBatch



Farmington Hill Salesforce Developer group / Salesforce Apex Hours organized another successful Online session/event on Saturday, MAY 13, 2017 , focusing on "Hyper Batch".

First of All I would like to thank to "Daniel Peter" for great session and demo on "Hyper Batch". And Thank you much to all Farmington Hill Salesforce Developer Group Member for joining us online. This time more then 120+ person  joined us.
 


Agenda :-  
• Whats is HyperBatch
• Difference between Old Traditional Apex Batch job and HyperBatch
• Demo
• FAQ 


Speaker :- Daniel Peter (Salesforce MVP)
Date :-
Saturday, MAY 13, 2017 11:00 AM EST
Venue/Link :- Online



PPT:- 


https://www.slideshare.net/AmitChaudhary112/salesforce-apex-hours-hyper-batch




Session Recording :- https://www.youtube.com/watch?v=hja4o-Oa4zo&feature=youtu.be




Please follow us on below pages/link for future session :-

Thanks,
Amit Chaudhary
@amit_sfdc



Tuesday, 9 May 2017

VLOOKUP Example | VLOOKUP Function in Salesforce | Validation Rule with Vlookup in Salesforce



In this example we will checks that a billing postal code is valid by looking up the value in a custom object called ZipCode__c that contains a record for every valid zip code. If the zip code is not found in the ZipCode__c object or the billing state does not match the corresponding State__c in the ZipCode__c object, an error will display.


Syntax :- VLOOKUP(field_to_return, field_on_lookup_object, lookup_value)

field_to_return :- the field that contains the value you want returned
field_on_lookup_object :- the field on the related object that contains the value you want to match
lookup_value :- with the value you want to match


VLOOKUP Example in Salesforce Step by Step process

Step 1) Create one custom object ZIPCODE


Step 2) Upload some Test data.



Step 3) Create Validation Rule



Vlookup(
       $ObjectType.ZipCode__c.Fields.State__c ,
       $ObjectType.ZipCode__c.Fields.Name ,
       BillingPostalCode
) != BillingState



Please check below post for more detail
1) https://help.salesforce.com/articleView?id=customize_functions_i_z.htm&type=0&language=en_US


Thanks
Amit Chaudhary