• dhw cksld
  • NEWBIE
  • 0 Points
  • Member since 2022

  • Chatter
    Feed
  • 0
    Best Answers
  • 0
    Likes Received
  • 0
    Likes Given
  • 0
    Questions
  • 3
    Replies
Hello,

I have written a class for send Slack Notification anytime a Community Post or Answer is made in our client portal. But my test class only cover 54% of my code. I struggle to write a test for the JSON Generator as show on the pic

User-added image
How can I test JSON Generator in my class
Thanks!

here is my code:
 
public class SlackNotificationCommunityPost {
    
    /*
    -------------------------------------------------------------------------------------------------
    -- - Description   : Class to send Slack notification based on QuestionPost created on Community
    -- -----------  ----  -------  ------------------------------------------------------------------
     */
    
    public class slackRequest {
        //Use @InvocableVariable to call Process Builder
        @InvocableVariable(label='title')
        public String title; 
        
        @InvocableVariable(label='id')
        public String id; 
        
        @InvocableVariable(label='name')
        public String name;   
        
        //**H.O: (CODE UPDATE) Answer to Community Post 
        @InvocableVariable(label='type')
        public String type;
    }
    
    @InvocableMethod(label='Publish New Community posts to Slack')
    public static void publishNewCommunityPostsToSlack(List<slackRequest> requests) {

        //String webhookURL='https://hooks.slack.com/services/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';
        String webhookURL = system.label.Param_Slack_Token;
        String msg;
        String channelName;
        
        for(slackRequest r:requests){
            
            //check if the post has and Id, name, title
            if(r.id != null && r.name != null && r.title != null && r.type == 'QuestionPost') {
                System.debug('### SlackNotificationCommunityPosts new post');
                channelName = '#' +Label.Slack_Community_Channel;
                msg = 'A new community post has been created : *'+r.title+'* - By User : (*'+r.name+'*)';
                msg += '\nLink to Community post : '+Network.communitiesLanding().getUrl()+'question/'+r.id;
             
            //**H.O: (Statement Update) Answer to Community Post
            } else if (r.type != 'QuestionPost') {
                System.debug('### SlackNotificationCommunityPosts answers');
                channelName = '#' +Label.Slack_Community_Channel;
                msg = '(*'+r.name+'*) has written an answer to Community post : '+Network.communitiesLanding().getUrl()+'question/'+r.id;
                
            }
            
            //Generate JSON for request
            try {
                if (r.id != null && r.title !=null && r.name != null ) {
                   System.debug('### SlackNotificationCommunityPosts sending message');
                   JSONGenerator gen = JSON.createGenerator(true);
                    gen.writeStartObject(); //Inserts {
                    gen.writeStringField('text', msg);
                    gen.writeStringField('channel', channelName);
                    gen.writeStringField('username', 'bot-support');
                    gen.writeStringField('icon_emoji', ':smartplus:');
                    gen.writeEndObject(); //Inserts }
                    String body = gen.getAsString(); //Translates JSONGenerator to string to be passed to callout
                    System.debug('### SlackNotificationCommunityPosts body: '+ body);
                    System.enqueueJob(new qCallOut(webhookURL, 'POST', body)); // Send request
      
               	 } else {
                    System.debug('### SlackNotificationCommunityPosts Id = '+ r.id);
                    return; 
                }
                
            }
            catch (exception e) {
                System.debug('### SlackNotificationCommunityPosts error:' +e);
            }
            
        }
     
    }
    
     public class qCallOut implements System.Queueable, Database.AllowsCallouts {
         
        private final String url;
        private final String method;
        private final String body;
         
        public qCallOut(String url, String method, String body) {
            this.url = url;
            this.method = method;
            this.body = body;
        }
         
        public void execute(System.QueueableContext ctx) {
            HttpRequest req = new HttpRequest();
            req.setEndpoint(url);
            req.setMethod(method);
            req.setBody(body);
            Http http = new Http();
            // to pass when process builder is invoked by another test class
            if(!Test.isRunningTest()){  
              HttpResponse res = http.send(req);
            }
        }
         
     }

}

here is my test class:
 
@isTest (seeAllData=true)
public class SlackNotificationCommunityPostTest {
    
    static testMethod void testPublishNewCommunityPostsToSlack() {
        Test.setMock(HttpCalloutMock.class, new mockCallout());
        List<SlackNotificationCommunityPost.slackRequest> requests = new List<SlackNotificationCommunityPost.slackRequest>();
        SlackNotificationCommunityPost.slackRequest r = new SlackNotificationCommunityPost.slackRequest();
        r.id= 'Test';
        r.name= 'Test';
        r.title= 'Test';
        r.type= 'Test';
        requests.add(r);
        SlackNotificationCommunityPost.publishNewCommunityPostsToSlack(requests);
        System.debug('check Post id: '+r.id);
    }
  
    static testmethod void testQueueable() {
        String url = 'https://hooks.slackTest.com';
        String method = 'Post';
        String body = 'body';
        
        SlackNotificationCommunityPost.qCallOut qCalloutTest = new SlackNotificationCommunityPost.qCallOut(url, method, body);
        Test.startTest();
        System.enqueueJob(qCalloutTest);
        Test.stopTest();
    }
    
    public class mockCallout implements HttpCalloutMock {
        public HttpResponse respond(HttpRequest request) {
            
            //Create a fake response
            HttpResponse res = new HttpResponse();
            res.setBody( '{"text":"value"}');
            res.setStatusCode(200);
            return res;
        }
    }

}

 
When I run the test on my class i am getting the Attemp to de-reference a null object

@isTest
public class SV_Case{

static testMethod void createCase(){

sitevisit__c sVisit = new Sitevisit__c();

sVisit.RecordType.Name ='DM_of_Ops_Quality_Audit_Househeeping';
sVisit.baseboard_stairway__c = 'Fail';
sVisit.baseboard_hallways_corridors__c = 'Fail';
sVisit.baseboards_lobbies__c = 'Fail';
sVisit.baseboards_restroom__c = 'Fail';
sVisit.baseboards_conference__c = 'Fail';
sVisit.baseboards_office_area__c = 'Fail';
sVisit.baseboards_kitchen__c = 'Fail';
sVisit.switches_kitchen__c = 'Fail';
sVisit.switches_office__c = 'Fail';
sVisit.switches_lobbies__c = 'Fail';
sVisit.switches_conference_room__c = 'Fail';
sVisit.switches_hallways_corridors__c = 'Fail';
sVisit.switches_stairway__c = 'Fail';
sVisit.switches_kitchen__c = 'Fail';
sVisit.switches_warehouse__c = 'Fail';
sVisit.doors_office__c = 'Fail';
sVisit.doors_restrooms__c = 'Fail';
sVisit.doors_lobbies__c = 'Fail';
sVisit.doors_conference_room__c = 'Fail';
sVisit.doors_hallways_corridors__c = 'Fail';
sVisit.doors_stairway__c = 'Fail';
sVisit.doors_kitchen__c = 'Fail';
sVisit.doors_warehouse__c = 'Fail';
sVisit.walls_partitions_restroom_lockerroom__c = 'Fail';
sVisit.walls_partitions_hallways_partitions__c = 'Fail';
sVisit.walls_lobbies__c = 'Fail';
sVisit.walls_conference_room__c = 'Fail';
sVisit.walls_partitions_kitchen__c = 'Fail';
sVisit.walls_partitions_warehouse__c = 'Fail';
sVisit.walls_windows_partitions_office__c = 'Fail';
sVisit.walls_stairway__c = 'Fail';
sVisit.chair_office__c = 'Fail';
sVisit.chairs_lobbies__c = 'Fail';
sVisit.chairs_conference_room__c = 'Fail';
sVisit.chairs_kitchen__c = 'Fail';
sVisit.furniture_warehouse__c = 'Fail';
sVisit.furniture_conference_room__c = 'Fail';
sVisit.furnitures_desk_tables_office__c = 'Fail';
sVisit.furniture_warehouse__c = 'Fail';
sVisit.horizontal_surfaces_office__c = 'Fail';
sVisit.horizontal_surfaces_restroom_lockerroom__c = 'Fail';
sVisit.horizontal_surfaces_lobbies__c = 'Fail';
sVisit.horizontal_surfaces_conference_room__c = 'Fail';
sVisit.horizontal_surfaces_stairway__c = 'Fail';
sVisit.horizontal_surfaces_kitchen__c = 'Fail';
sVisit.horizontal_surfaces_warehouse__c = 'Fail';
sVisit.horizontal_surfaces_hallways_corridors__c = 'Fail';
sVisit.ceilings_office__c = 'Fail';
sVisit.ceiling_stairway__c = 'Fail';
sVisit.ceiling_lobbies__c = 'Fail';
sVisit.ceilings_restroom_lockerroom__c = 'Fail';
sVisit.ceilings_conference_room__c = 'Fail';
sVisit.ceilings_kitchen__c = 'Fail';
sVisit.ceilings_hallways_corridors__c = 'Fail';
sVisit.floors_drains_office__c = 'Fail';
sVisit.floors_lobbies__c = 'Fail';
sVisit.floors_conference_room__c = 'Fail';
sVisit.floors_drains_stairway__c = 'Fail';
sVisit.floors_drains_kitchen__c = 'Fail';
sVisit.floors_drains_warehouse__c = 'Fail';
sVisit.floors_hallways_corridors__c = 'Fail';
sVisit.floors_drains_restroom_lockerroom__c = 'Fail';
sVisit.corners_office__c = 'Fail';
sVisit.corners_restroom_lockerroom__c = 'Fail';
sVisit.corners_lobbies__c = 'Fail';
sVisit.corners_conference_room__c = 'Fail';
sVisit.corners_stairway__c = 'Fail';
sVisit.corners_kitchen__c = 'Fail';
sVisit.corners_warehouse__c = 'Fail';
sVisit.corners_hallways_corridors__c = 'Fail';
sVisit.vents_office__c = 'Fail';
sVisit.vents_restroom_lockerroom__c = 'Fail';
sVisit.vents_lobbies__c = 'Fail';
sVisit.vents_conference_room__c = 'Fail';
sVisit.vents_stairway__c = 'Fail';
sVisit.vents_kitchen__c = 'Fail';
sVisit.vents_hallways_corridors__c = 'Fail';
sVisit.trash_hallways_corridors__c = 'Fail';
sVisit.trash_office__c = 'Fail';
sVisit.trash_restroom_lockerroom__c = 'Fail';
sVisit.trash_conference_room__c = 'Fail';
sVisit.trash_kitchen__c = 'Fail';
sVisit.trash_warehouse__c = 'Fail';
sVisit.phones_office__c = 'Fail';
sVisit.phones_lobbies__c = 'Fail';
sVisit.phones_conference_room__c = 'Fail';
sVisit.phones_kitchen__c = 'Fail';
sVisit.baseboard_stairway__c = 'Fail';
sVisit.baseboard_hallways_corridors__c = 'Fail';
sVisit.baseboards_lobbies__c = 'Fail';
sVisit.baseboards_restroom__c = 'Fail';
sVisit.baseboards_conference__c = 'Fail';
sVisit.baseboards_office_area__c = 'Fail';
sVisit.baseboards_kitchen__c = 'Fail';
sVisit.appliances_vending_kitchen__c = 'Fail';
sVisit.drinking_fountains_eyewash_warehouse__c = 'Fail';
sVisit.safety_rails_fire_extinguisher_warehouse__c = 'Fail';
sVisit.stairs_risers_stairway__c = 'Fail';
sVisit.hand_rails_stairway__c = 'Fail';
sVisit.toilets_urinals_restrooms_lockerroom__c = 'Fail';
sVisit.sinks_restroom_lockerroom__c = 'Fail';
sVisit.mirrors_restrooms_lockerroom__c = 'Fail';
sVisit.tables_furniture_kitchen__c = 'Fail';
sVisit.dispensers_restroom__c = 'Fail';
sVisit.job__C='a013000000UHggN';

Test.startTest();

insert sVisit;

Test.stopTest();

}
}

So this is a bit strange....

 

I have a VF page written that creates badges(labels) for contacts with their name and picture.

 

The way we are gettin multiple pictures is by refrerencing a .zip file as a static resource.

 

The funny thing about this is that when I try to upload the zip file to the static resource it does not work (the pictures come up broken) but....  when my collegue uploads it the exact same way, the files work great.

 

We are both using Mac osx.  My operating system is 10.6.7 and his is a bit newer.

 

Any ideas about this one???