Tuesday, January 22, 2019

Best Practice for Test Classes in Salesforce


Please follow below salesforce Best Practice for Test Classes :-


1. Test class must start with @isTest annotation if class class version is more than 25

2. Test environment support @testVisible , @testSetUp as well

3. Unit test is to test particular piece of code working properly or not .

4. Unit test method takes no argument ,commit no data to database ,send no email ,flagged with testMethod keyword .

5. To deploy to production at-least 75% code coverage is required

6. System.debug statement are not counted as a part of apex code limit.

7. Test method and test classes are not counted as a part of code limit

9. We should not focus on the  percentage of code coverage ,we should make sure that every use case should covered including positive, negative,bulk and single record .Single Action -To verify that the the single record produces the correct an expected result .Bulk action -Any apex record trigger ,class or extension must be invoked for 1-200 records .Positive behavior : Test every expected behavior occurs through every expected permutation , i,e user filled out every correctly data and not go past the limit .Negative Testcase :-Not to add future date , Not to specify negative amount.Restricted User :-Test whether a user with restricted access used in your code .

10. Test class should be annotated with @isTest .

11 . @isTest annotation with test method  is equivalent to testMethod keyword .

12. Test method should static and no void return type .

13. Test class and method default access is private ,no matter to add access specifier .

14. classes with @isTest annotation can't be a interface or enum .

15. Test method code can't be invoked by non test request .

16. Stating with salesforce API 28.0 test method can not reside inside non test classes .

17. @Testvisible annotation to make visible private methods inside test classes.

18. Test method can not be used to test web-service call out . Please use call out mock .

19. You can't  send email from test method.

20.User, profile, organization, AsyncApexjob, Corntrigger, RecordType, ApexClass, ApexComponent ,ApexPage we can access without (seeAllData=true) .

21. SeeAllData=true will not work for API 23 version eailer .

22. Accessing static resource test records in test class e,g List<Account> accList=Test.loadData(Account,SobjectType,'ResourceName').

23. Create TestFactory class with @isTest annotation to exclude from organization code size limit .

24. @testSetup to create test records once in a method  and use in every test method in the test class .

25. We can run unit test by using Salesforce Standard UI,Force.com IDE ,Console ,API.

26. Maximum number of test classes run per 24 hour of period is  not grater of 500 or 10 multiplication of test classes of your organization.

27. As apex runs in system mode so the permission and record sharing are not taken into account . So we need to use system.runAs to enforce record sharing .

28. System.runAs will not enforce user permission or field level permission .

29. Every test to runAs count against the total number of DML issued in the process .

Understanding the workflow .If you understand the workflow you ll easly get 80% code Coverage.


Friday, January 11, 2019

Platform Developer I Certification Maintenance (Winter '19) Code

After Creating the Tower object in the developer org add the four records mentioned in the trailhead challenge and copy the below code blocks to finish the challenge.

  • Copy the helper class code block, TowerMapUtilClass, from above and modify it so the sharing rules are enforced based on the sharing setting of the calling class.

    • TowerMapUtilClass
    •  public inherited sharing class TowerMapUtilClass {  
          public static List<sObject> queryObjects(String theObject, List<String> theFields, String theFilter, String sortField, String sortOrder) {  
            String theQuery = 'SELECT ' + string.join(theFields, ',');  
            theQuery += ' FROM ' + theObject;  
            if(!String.isEmpty(theFilter)) {  
               theQuery += ' WHERE ' + theFilter;  
            }  
            if(!String.isEmpty(sortField)) {  
               theQuery += ' ORDER BY ' + sortField;  
               if(!String.isEmpty(sortOrder)) {  
                 theQuery += ' ' + sortOrder;  
               }  
            }  
            return database.query(theQuery);  
          }  
       }  
      
  • Copy the controller code block, TowerMapControllerClass, from above and modify it so the sharing rules are enforced.

    • TowerMapControllerClass
    •  public inherited sharing class TowerMapControllerClass {  
          @AuraEnabled  
          public static List<Tower__c> getAllTowers() {  
            String theObject = 'Tower__c';  
            List<String> theFields = new List<String>{'Id', 'Name', 'State__r.Name', 'Tower_Location__Latitude__s', 'Tower_Location__Longitude__s'};  
            String theFilter = '';  
            String sortField = 'Name';  
            String sortOrder = 'ASC';  
            List<Tower__c> allTowers = TowerMapUtilClass.queryObjects(theObject, theFields, theFilter, sortField, sortOrder);  
            return allTowers;  
          }  
       }  
      
  • Copy and modify the Lightning component code above to implement a lightning:map component named Towermap. Replace the  with your code. Your code should pass the value of v.mapMarkers to the mapMarkers attribute, pass the value of v.markersTitle to the markersTitleattribute, and set the zoomLevel attribute to 5.

    • Towermap.cmp
    •  <aura:component implements="flexipage:availableForAllPageTypes" controller="TowerMapControllerClass" access="global" >  
          <aura:attribute name="mapMarkers" type="Object" access="PRIVATE" />  
          <aura:attribute name="markersTitle" type="String" access="PRIVATE" />  
          <aura:handler name="init" value="{!this}" action="{!c.handleInit}"/>  
          <aura:if isTrue="{!!empty(v.mapMarkers)}" >  
            <!-- Create lightning:map here -->  
            <lightning:map   
           mapMarkers="{! v.mapMarkers }"   
           zoomLevel="{!v.zoomLevel}" markersTitle="{!v.markersTitle}"/>  
          </aura:if>  
       </aura:component>  
      
  • Copy and paste the controller and helper code blocks above to create controller and helper functions to pull all Tower locations from the server.

    • TowermapController.js
    •  ({  
          handleInit: function (component, event, helper) {  
            helper.initHelper(component, event, helper);  
            component.set('v.zoomLevel', 5);  
          }  
       })  
      
    • TowermapHelper.js
    •  ({  
          initHelper : function(component, event, helper) {  
            helper.utilSetMarkers(component, event, helper);  
          },  
          utilSetMarkers : function(component, event, helper) {  
            let action = component.get("c.getAllTowers");  
            action.setCallback(this, function(response) {  
               const data = response.getReturnValue();  
               const dataSize = data.length;  
               let markers = [];  
               for(let i=0; i < dataSize; i += 1) {  
                 const Tower = data[i];  
                 markers.push({  
                   'location': {  
                      'Latitude' : Tower.Tower_Location__Latitude__s,  
                      'Longitude' : Tower.Tower_Location__Longitude__s  
                   },  
                   'icon': 'utility:Tower',  
                   'title' : Tower.Name,  
                   'description' : Tower.Name + ' Tower Location at ' + Tower.State__r.Name  
                 });  
               }  
               component.set('v.markersTitle', 'Out and About Communications Tower Locations');  
               component.set('v.mapMarkers', markers);  
            });  
            $A.enqueueAction(action);  
          }  
       })  
      
  • To view your map, you can use Lightning App Builder to create a standalone one-column app page named Towers and add it to the Lightning Experience App Launcher. More experienced developers can chose another method to expose the component, if desired.
    • Setup ➤ Lightning App Builder ➤  Click "New" ➤  Select App Page ➤ Click Next ➤ Give Label as "Towers" ➤  Select "One Column" ➤  Select "Towermap" under the lightning components section and add the component to the lightning page
    • Save and activate the lightning page to display the page in the sales,service applications.
I Hope useful for You! Feel Free Comment Below Your Experience in this Page!!

Thursday, January 3, 2019

Trailhead Widget for your Website


Trailhead Widget for your Website

Here it comes, Christmas goodies for Trailhead lovers. If you own WordPress, blogspot or any website, use this Trailhead widget to show and brag about all your badges. Badges,  which you have earned by completing challenges on sleepless nights, on airport, during commute or over the weekends. What could be the best way to show Trailhead profile summary other than widget?
Will it impact performance of my website
All computations are done outside of your website and Javascript execution is asynchronous, which will make sure website rendering is not blocked by this widget.

How to use it

Step 1
Identify the URL of your Trailhead profile. Make sure you are not copying URL of success community. Below image shows steps to get Trailhead URL. We just need end part of URL, after last forward slash.
As shown in above image we just need text after last forward slash which is 005….7hAAA
Step 2
As shown in below image, just replace white part by your ProfileId and paste code  in your website. div tag would be replaced by widget content.
<div id="trailhead-widget-container">
    <img src="Your image source" />
</div>
<script async src="https://your domain/Trailhead.php?profileId=your id" type="text/javascript">  </script>