package com.vaguehope.onosendai.payload; import static org.junit.Assert.assertEquals; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.Robolectric; import org.robolectric.RobolectricTestRunner; import com.vaguehope.onosendai.config.Account; import com.vaguehope.onosendai.config.Config; import com.vaguehope.onosendai.model.MetaType; import com.vaguehope.onosendai.model.Tweet; import com.vaguehope.onosendai.model.TweetBuilder; @RunWith(RobolectricTestRunner.class) public class PayloadUtilsTest { private static final String ACCOUNT_ID = "ac0"; private static final Account ACCOUNT = new Account(ACCOUNT_ID, null, null, null, null, null, null); private Config conf; @Before public void before () throws Exception { this.conf = mock(Config.class); when(this.conf.getAccount(ACCOUNT_ID)).thenReturn(ACCOUNT); } @Test public void itDoesNotCrashOnNullOrBlank () throws Exception { testLinkExtraction(null, new String[] {}); testLinkExtraction("", new String[] {}); } @Test public void itParsesALinkFromTweet () throws Exception { testLinkExtraction("A tweet with a link http://example.com/foo123.", "http://example.com/foo123"); } @Test public void itParsesMultipleLinksFromTweet () throws Exception { testLinkExtraction("A tweet with a link http://example.com/foo123. And another www.example.com/bar123...", "http://example.com/foo123", "www.example.com/bar123"); } @Test public void itParsesAnHttpsLinkFromTweet () throws Exception { testLinkExtraction("A tweet with a link https://example.com/foo123.", "https://example.com/foo123"); } @Test public void itParsesALinkInAtTheStartOfTheTweet () throws Exception { testLinkExtraction("http://example.com/foo123 A tweet with a link.", "http://example.com/foo123"); } @Test public void itParsesALinkInBacketsFromTweet () throws Exception { testLinkExtraction("A tweet with a link (http://example.com/foo123).", "http://example.com/foo123"); } @Test public void itParsesALinkInSquareBacketsFromTweet () throws Exception { testLinkExtraction("A tweet with a link [http://example.com/foo123].", "http://example.com/foo123"); } @Test public void itParsesALinkInQuotesFromTweet () throws Exception { testLinkExtraction("A tweet with a link \"http://example.com/foo123\".", "http://example.com/foo123"); } @Test public void itParsesALinkWithoutSchemeButWwwFromTweet () throws Exception { testLinkExtraction("A tweet with a link www.example.com/foo123.", "www.example.com/foo123"); } @Test public void itParsesALinkWithAFragmentFromTweet () throws Exception { testLinkExtraction("A tweet with a link http://example.com/foo123#abc.", "http://example.com/foo123#abc"); } @Ignore("Not sure how to support this one.") @Test public void itParsesALinkWithoutSchemeOrWwwFromTweet () throws Exception { testLinkExtraction("A tweet with a link example.com/foo123.", "example.com/foo123"); } @Test public void itParsesASimpleHashTag () throws Exception { testHashTagExtraction("A tweet with a tag #foo123.", "#foo123"); } @Test public void itParsesAHashTagAtStart () throws Exception { testHashTagExtraction("#foo123 A tweet with a tag.", "#foo123"); } @Test public void itDoesNotExtractNonTags () throws Exception { testHashTagExtraction("#", new String[] {}); testHashTagExtraction("something #", new String[] {}); } @Ignore("Not sure how to support this one.") @Test public void itDoesNotExtractNonTagsHard () throws Exception { testHashTagExtraction("On the #16 bus", new String[] {}); testHashTagExtraction("#0", new String[] {}); } @Test public void itExtractsKana () throws Exception { testHashTagExtraction("this #カタカナ is a hashtag", "#カタカナ"); testHashTagExtraction("this #ひらがな is a hashtag", "#ひらがな"); testHashTagExtraction("this #ひらがな is a hashtag", "#ひらがな"); } private void testLinkExtraction (final String body, final String... expectedUrls) { Tweet tweet = new TweetBuilder().body(body).meta(MetaType.ACCOUNT, ACCOUNT_ID).build(); PayloadList payloadList = PayloadUtils.makePayloads(Robolectric.application, this.conf, tweet); payloadList = removeNotOfType(PayloadType.LINK, payloadList); assertEquals(expectedUrls.length, payloadList.size()); for (int i = 0; i < expectedUrls.length; i++) { Payload payload = payloadList.getPayload(i); assertEquals(PayloadType.LINK, payload.getType()); assertEquals(expectedUrls[i], ((LinkPayload) payload).getTitle()); } } private void testHashTagExtraction (final String body, final String... expectedTags) { Tweet tweet = new TweetBuilder().body(body).meta(MetaType.ACCOUNT, ACCOUNT_ID).build(); PayloadList payloadList = PayloadUtils.makePayloads(Robolectric.application, this.conf, tweet); payloadList = removeNotOfType(PayloadType.HASHTAG, payloadList); assertEquals(expectedTags.length, payloadList.size()); for (int i = 0; i < expectedTags.length; i++) { Payload payload = payloadList.getPayload(i); assertEquals(PayloadType.HASHTAG, payload.getType()); assertEquals(expectedTags[i], ((HashTagPayload) payload).getTitle()); } } private static PayloadList removeNotOfType (final PayloadType type, final PayloadList payloadList) { List<Payload> ret = new ArrayList<Payload>(); for (Payload p : payloadList.getPayloads()) { if (p.getType() == type) ret.add(p); } return new PayloadList(ret); } }