/** * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * this work for additional information regarding copyright ownership. * The ASF licenses this file to You under the Apache License, Version 2.0 * (the "License"); you may not use this file except in compliance with * the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package org.apache.camel.component.salesforce; import java.time.ZonedDateTime; import org.apache.camel.Message; import org.apache.camel.builder.RouteBuilder; import org.apache.camel.component.mock.MockEndpoint; import org.apache.camel.component.salesforce.api.dto.CreateSObjectResult; import org.apache.camel.component.salesforce.dto.generated.Merchandise__c; import org.apache.camel.component.salesforce.internal.dto.QueryRecordsPushTopic; import org.junit.Test; public class StreamingApiIntegrationTest extends AbstractSalesforceTestBase { @Test public void testSubscribeAndReceive() throws Exception { MockEndpoint mock = getMockEndpoint("mock:CamelTestTopic"); mock.expectedMessageCount(1); // assert expected static headers mock.expectedHeaderReceived("CamelSalesforceTopicName", "CamelTestTopic"); mock.expectedHeaderReceived("CamelSalesforceChannel", "/topic/CamelTestTopic"); Merchandise__c merchandise = new Merchandise__c(); merchandise.setName("TestNotification"); merchandise.setDescription__c("Merchandise for testing Streaming API updated on " + ZonedDateTime.now().toString()); merchandise.setPrice__c(9.99); merchandise.setTotal_Inventory__c(1000.0); CreateSObjectResult result = template().requestBody( "direct:upsertSObject", merchandise, CreateSObjectResult.class); assertTrue("Merchandise test record not created", result == null || result.getSuccess()); try { // wait for Salesforce notification mock.assertIsSatisfied(); final Message in = mock.getExchanges().get(0).getIn(); merchandise = in.getMandatoryBody(Merchandise__c.class); assertNotNull("Missing event body", merchandise); log.info("Merchandise notification: {}", merchandise.toString()); assertNotNull("Missing field Id", merchandise.getId()); assertNotNull("Missing field Name", merchandise.getName()); // validate dynamic message headers assertNotNull("Missing header CamelSalesforceClientId", in.getHeader("CamelSalesforceClientId")); assertNotNull("Missing header CamelSalesforceEventType", in.getHeader("CamelSalesforceEventType")); assertNotNull("Missing header CamelSalesforceCreatedDate", in.getHeader("CamelSalesforceCreatedDate")); } finally { // remove the test record assertNull(template().requestBody("direct:deleteSObjectWithId", merchandise)); // remove the test topic // find it using SOQL first QueryRecordsPushTopic records = template().requestBody("direct:query", null, QueryRecordsPushTopic.class); assertEquals("Test topic not found", 1, records.getTotalSize()); assertNull(template().requestBody("direct:deleteSObject", records.getRecords().get(0))); } } @Override protected RouteBuilder doCreateRouteBuilder() throws Exception { return new RouteBuilder() { @Override public void configure() throws Exception { // test topic subscription //from("salesforce:CamelTestTopic?notifyForFields=ALL¬ifyForOperations=ALL&" from("salesforce:CamelTestTopic?notifyForFields=ALL&" + "notifyForOperationCreate=true¬ifyForOperationDelete=true¬ifyForOperationUpdate=true&" + "sObjectName=Merchandise__c&" + "updateTopic=true&sObjectQuery=SELECT Id, Name FROM Merchandise__c"). to("mock:CamelTestTopic"); // route for creating test record from("direct:upsertSObject"). to("salesforce:upsertSObject?SObjectIdName=Name"); // route for finding test topic from("direct:query"). to("salesforce:query?sObjectQuery=SELECT Id FROM PushTopic WHERE Name = 'CamelTestTopic'&" + "sObjectClass=" + QueryRecordsPushTopic.class.getName()); // route for removing test record from("direct:deleteSObjectWithId"). to("salesforce:deleteSObjectWithId?sObjectIdName=Name"); // route for removing topic from("direct:deleteSObject"). to("salesforce:deleteSObject"); } }; } }