You need to sign in to do that
Don't have an account?
Developer.mikie.Apex.Student
current test
HTTP Post Callout Method - Please help with Test - Currently gives 0% coverage
Hi Guys,
I cant figure out how to pass my integration class. Please help, any help would be much appreciated.
public class Integration { // The ExternalOrder class holds a string and integer // received from the external fulfillment system. public class ExternalOrder { public String id { get; set; } public String result { get; set; } } // Functionally, the method 1) prepares // JSON-formatted data to send to the remote service, 2) makes an HTTP call // to send the prepared data to the remote service, and then 3) processes // any JSON-formatted data returned by the remote service to update the // local Invoices with the corresponding external IDs in the remote system. @future(callout = true) // indicates that this is an asynchronous call public static void postOrder(List < Id > AccountIds, boolean isScheduleExpiry) { //Call Accounts associated to Id List List < Account > Accounts = [SELECT Id, DestinyLive_Email_Username__c, Support_Expiration__c, Receiving_Support__c, DestinyLive_Premium_Membership_Expiry__c FROM Account WHERE Id IN: AccountIds]; // Create a JSON generator object JSONGenerator gen = JSON.createGenerator(true); // open the JSON generator gen.writeStartArray(); // iterate through the list of invoices passed in to the call // writing each Account ID to the array for (Account Acc: Accounts) { Datetime ExpiryDate = Acc.DestinyLive_Premium_Membership_Expiry__c; String myDatetimeStr = ExpiryDate.format('dd/MM/YYYY'); gen.writeStartObject(); gen.writeStringField('id', Acc.Id); if(Acc.DestinyLive_Email_Username__c != null && Acc.DestinyLive_Email_Username__c != ''){ gen.writeStringField('DestinyLive_UserName', Acc.DestinyLive_Email_Username__c); }else{ gen.writeStringField('DestinyLive_UserName', 'NA'); } //Set Destiny Client to false as isScheduleExpiry == true because the class is scheduled to run 15 minutes before expiry if(isScheduleExpiry == true){ gen.writeBooleanField('DestinyClient', false); }else{ gen.writeBooleanField('DestinyClient', Acc.Receiving_Support__c); } gen.writeStringField('Expiry', myDatetimeStr); gen.writeEndObject(); } // close the JSON generator gen.writeEndArray(); // create a string from the JSON generator String jsonOrders = gen.getAsString(); // debugging call, which you can check in debug logs System.debug('jsonOrders: ' + jsonOrders); // create an HTTPrequest object HttpRequest req = new HttpRequest(); // set up the HTTP request with a method, endpoint, header, and body req.setMethod('POST'); // DON'T FORGET TO UPDATE THE FOLLOWING LINE WITH YOUR APP NAME req.setEndpoint('http://requestb.in/1n6j75u1'); req.setHeader('Content-Type', 'application/json'); req.setBody(jsonOrders); // create a new HTTP object Http http = new Http(); // create a new HTTP response for receiving the remote response // then use it to send the configured HTTPrequest HTTPResponse res = http.send(req); // debugging call, which you can check in debug logs System.debug('Fulfillment service returned ' + res.getBody()); // 3) see above // Examine the status code from the HTTPResponse // If status code != 200, write debugging information, done if (res.getStatusCode() != 200) { System.debug('Error from ' + req.getEndpoint() + ' : ' + res.getStatusCode() + ' ' + res.getStatus()); } // If status code = 200, update each Account // with the external ID returned by the fulfillment service. else { // Create a list of external orders by deserializing the // JSON data returned by the fulfillment service. List < ExternalOrder > orders = (List < ExternalOrder > ) JSON.deserialize(res.getBody(), List < ExternalOrder > .class); // Create a map of Invoice IDs from the retrieved Map < Id, Account > AccMap = new Map < Id, Account > (Accounts); // Update the order numbers in the invoices for (ExternalOrder order: orders) { if(order.result == 'Success'){ Account Acc = AccMap.get(order.id); Acc.DestinyLive_Premium_Membership__c= False; Acc.DestinyLive_Integration_Status__c = 'Completed - Success'; }else if(order.result == 'NA'){ Account Acc = AccMap.get(order.id); Acc.DestinyLive_Premium_Membership__c= true; Acc.DestinyLive_Integration_Status__c = 'Completed - User Not Found'; }else if(order.result == 'Failure'){ Account Acc = AccMap.get(order.id); Acc.DestinyLive_Premium_Membership__c= true; Acc.DestinyLive_Integration_Status__c = 'Completed - Failure'; } } update Accounts; } } }
current test
@isTest private class Integration_Test{ static testMethod void IntegrationTest() { List<Id> AccountIds = new List<Id>(); List<Account> AccountList = new List<Account>{}; for(Integer i = 0; i < 200; i++){ Account Accs = new Account( Name = 'Test' + i, DestinyLive_Premium_Membership_Expiry__c = date.today().adddays(40), DestinyLive_Email_Username__c = 'Success22@knmfld.fdfdf', Receiving_Support__c = true, Support_Expiration__c = date.today().adddays(40), Support_Start__c = date.today().adddays(-40)); AccountList.add(Accs); } insert AccountList; for ( Account Acc : AccountList) { AccountIds.add(Acc.Id); } Test.startTest(); If(!Test.isRunningTest()){ Integration.postOrder(AccountIds, True); } Test.stopTest(); } }
Use HttpCalloutMock for the test and either move the callout (the actual call to the webservice) to afuture method (a method annotated with @future), which will run asynchronously, or, if you are using a Batch (batch processes cannot call futures), make the Batch implement Database.AllowsCallouts.
For the future, since the method will make a callout you have to add the callout=true parameter. Thus the final method will look something like:
Please let me know, in case of any doubt.
Hope this helps,
--
Thanks,
Swayam
I have the @future(callout=true) in my code. For some reason it is still not passing any line of my code. Would it be possible for you to spply some example code on how I might test this class. It is my first web call class.
Thank you so much for your reply.
Michael