One trigger per object

If you have one Apex trigger listening to multiple events (e. g. after insert and after update) you can still use the Apex API to create Jira issues and/or push updates to Jira. Sometimes, though, you want to call the API conditionally based on the actual event. In that case you can do so by adding some checks per case:

Cloud

CaseTrigger

trigger CaseTrigger on Case (after insert, after update) {
    if (Trigger.isInsert && Trigger.isAfter) {
        JCFS.API.createJiraIssue('10000', '10002');
    }
    if (Trigger.isUpdate && Trigger.isAfter) {
        JCFS.API.pushUpdatesToJira();
    }
}
JAVA

Server

CaseTrigger

trigger CaseTrigger on Case (after insert, after update) {
    if (Trigger.isInsert && Trigger.isAfter) {
        JSFS.API.createJiraIssue('10000', '10002');
    }
    if (Trigger.isUpdate && Trigger.isAfter) {
        JSFS.API.pushUpdatesToJira();
    }
}
JAVA

Note that for issue creation you need to, respectively, hardcode the Jira project id and Jira issue type id. You can get these values from the Jira REST API. In future versions of the package, there will be a feature helping admins generate the full code for the trigger from a template.

Apex test class for the trigger

Depending on which trigger events (after insert or after update) are used in the trigger you have to call the corresponding test helper method.

Cloud

CaseTriggerTest

@isTest public class CaseTriggerTest {
    @isTest static void caseAfterInsertTest() {
    	JCFS.JiraTriggerTestHelper.testAfterInsert('Case');
	}
	@isTest static void caseAfterUpdateTest() {
    	JCFS.JiraTriggerTestHelper.testAfterUpdate('Case');
	}
}
JAVA

Server

CaseTriggerTest

@isTest public class CaseTriggerTest {
    @isTest static void caseAfterInsertTest() {
    	JSFS.JiraTriggerTestHelper.testAfterInsert('Case');
	}
	@isTest static void caseAfterUpdateTest() {
    	JSFS.JiraTriggerTestHelper.testAfterUpdate('Case');
	}
}
JAVA

As with the trigger itself, you may need a test for each object trigger. All you have to do is replace Case in the above code with the actual object name.

After creating your test class, click Run Test. This ensures the test gets associated with your newly created trigger and provides code coverage.

You will need to re-run the Apex class if you ever deactivate and reactivate the trigger.

Custom objects

The Apex API and test helper methods work as well with any custom object. You just need to find out the object name (e.g.: MyObject__c) and use it in the trigger and test code as documented above.

Advanced section

If you have other triggers with Webservice callouts that are executed as a result of running this test, you might get an error message like this:

Method defined as TestMethod do not support Web service callouts

In order to fix this error, you need to specify a fake response for the callouts. JiraTriggerTestHelper already provides a mock for its test method, but it will not mock other web service callouts. Therefore, you may need to provide your own implementation of HttpCalloutMock.

Please customize the following code according to your callout method:

SuccessCalloutMock

public class SuccessCalloutMock implements HttpCalloutMock {
    public HTTPResponse respond(HTTPRequest req) {
        HttpResponse response = new HttpResponse();
        response.setStatusCode(200);
        return response;
    }
}
JAVA

Then, set the mock before the JiraTriggerTestHelper test method is called.

CaseTriggerTestAdvanced

@isTest public class CaseTriggerTest {
    @isTest static void caseAfterInsertTest() {
        Test.setMock(HttpCalloutMock.class, new SuccessCalloutMock());
        Case c = new Case();
        Test.startTest();
        insert c;
        Test.stopTest();
    }
    @isTest static void caseAfterUpdateTest() {
        Test.setMock(HttpCalloutMock.class, new SuccessCalloutMock());
        Case c = new Case();
        insert c;
        Test.startTest();
        update c;
        Test.stopTest();
    }
}
JAVA


Also, note that the Push API should not be called from within a Future. When called from a Future, the Push API simply logs it as a warning. Check your Apex Logs to see if that is the case if the automatic synchronization is not working.

For more details, please refer to the Salesforce documentation.