package fr.ippon.tatami.bot.route; import fr.ippon.tatami.bot.config.TatamibotConfiguration; import org.apache.camel.builder.AdviceWithRouteBuilder; import org.joda.time.DateTime; import org.junit.Test; import twitter4j.Status; import twitter4j.User; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; import java.util.Locale; import java.util.TimeZone; import static com.jayway.awaitility.Awaitility.await; import static com.jayway.awaitility.Awaitility.to; import static org.hamcrest.CoreMatchers.is; import static org.hamcrest.Matchers.greaterThanOrEqualTo; import static org.hamcrest.collection.IsCollectionWithSize.hasSize; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; /** * This test only tests the route, the twitter input-connector is mocked */ public class TwitterRouteBuilderCamelTest extends SourceRouteBuilderBaseCamelTest<TwitterRouteBuilder> { public TwitterRouteBuilderCamelTest() { super(TwitterRouteBuilder.class); // TimeZone.setDefault(TimeZone.getTimeZone("PST")); disableDateHeaderTest = true; } @Test public void testTwitterRoute() throws Exception { launchContext(); await().untilCall(to(messages).size(), is(greaterThanOrEqualTo(1))); assertThat(messages, hasSize(1)); assertThat(messages.get(0), is(getFirstMsgBody())); } // --- @Override protected String getFirstMsgBody() { // computing timezone in under to allow the test to run in remote CI server (which is in another timezone) String timezone = TimeZone.getDefault().getDisplayName(false, TimeZone.SHORT, Locale.US); // From Date.toString() ... return "Sat Jan 05 12:34:00 " + timezone + " 2013 (ippontech) a first tweet"; } @Override protected void launchContext() throws Exception { // we replace the input (twitter connector) of the route with a "direct" endpoint : String routeDefId = "twitter-ippon.fr"; context.getRouteDefinition(routeDefId).adviceWith(context, new AdviceWithRouteBuilder() { @Override public void configure() throws Exception { replaceFromWith("direct:twitterRouteTest"); } }); context.start(); // necessary because of isUseAdviceWith=true simulateInputMessage(); } private void simulateInputMessage() throws ParseException { Status fakeStatus = fakeTwitterStatus("2013/01/05 12:34", "ippontech", "a first tweet"); template.sendBody("direct:twitterRouteTest", fakeStatus); } private Status fakeTwitterStatus(String createdAtAsStr, String screenName, String text) throws ParseException { // cf {@link TwitterConverter.toString} : we only need date, user and text at the moment User user = mock(User.class); when(user.getScreenName()).thenReturn(screenName); Status status = mock(Status.class); Date createdAt = new SimpleDateFormat("yyyy/MM/dd HH:mm").parse(createdAtAsStr); when(status.getUser()).thenReturn(user); when(status.getCreatedAt()).thenReturn(createdAt); when(status.getText()).thenReturn(text); return status; } @Override protected TatamibotConfiguration getBotConfiguration() { TatamibotConfiguration configuration = new TatamibotConfiguration(); configuration.setTatamibotConfigurationId("TEST_CONFIG_ID"); configuration.setType(TatamibotConfiguration.TatamibotType.TWITTER); configuration.setDomain("ippon.fr"); // configuration.setUrl("??"); configuration.setPollingDelay(60); // not used here configuration.setLastUpdateDate(DateTime.parse("2010-01-01T00:00:00").toDate()); return configuration; } }