Simplify parsing of post:// links
authorDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Fri, 24 Jul 2015 14:11:55 +0000 (16:11 +0200)
committerDavid ‘Bombe’ Roden <bombe@pterodactylus.net>
Fri, 24 Jul 2015 18:47:59 +0000 (20:47 +0200)
src/main/java/net/pterodactylus/sone/text/SoneTextParser.java
src/test/java/net/pterodactylus/sone/text/SoneTextParserTest.java

index a1675d7..7194b89 100644 (file)
@@ -204,19 +204,13 @@ public class SoneTextParser implements Parser<SoneTextParserContext> {
                                                continue;
                                        }
                                        if (linkType == LinkType.POST) {
-                                               if (line.length() >= (7 + 36)) {
-                                                       String postId = line.substring(7, 43);
-                                                       Optional<Post> post = postProvider.getPost(postId);
-                                                       if (post.isPresent()) {
-                                                               parts.add(new PostPart(post.get()));
-                                                       } else {
-                                                               parts.add(new PlainTextPart(line.substring(0, 43)));
-                                                       }
-                                                       line = line.substring(43);
+                                               Optional<Post> post = postProvider.getPost(link.substring(7));
+                                               if (post.isPresent()) {
+                                                       parts.add(new PostPart(post.get()));
                                                } else {
-                                                       parts.add(new PlainTextPart(line));
-                                                       line = "";
+                                                       parts.add(new PlainTextPart(link));
                                                }
+                                               line = line.substring(link.length());
                                                continue;
                                        }
 
index 1e2928a..25ec62a 100644 (file)
@@ -20,19 +20,30 @@ package net.pterodactylus.sone.text;
 import static org.hamcrest.MatcherAssert.assertThat;
 import static org.hamcrest.Matchers.is;
 import static org.hamcrest.Matchers.notNullValue;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.when;
 
 import java.io.IOException;
 import java.io.StringReader;
 import java.util.Arrays;
 import java.util.Collection;
+import java.util.Collections;
+import java.util.HashMap;
+import java.util.HashSet;
+import java.util.Map;
+import java.util.Set;
 
+import net.pterodactylus.sone.data.Post;
 import net.pterodactylus.sone.data.Sone;
 import net.pterodactylus.sone.data.impl.IdOnlySone;
+import net.pterodactylus.sone.database.PostProvider;
 import net.pterodactylus.sone.database.SoneProvider;
 
 import com.google.common.base.Function;
 import com.google.common.base.Optional;
 import org.junit.Test;
+import org.mockito.Mockito;
+import org.mockito.stubbing.OngoingStubbing;
 
 /**
  * JUnit test case for {@link SoneTextParser}.
@@ -41,9 +52,9 @@ import org.junit.Test;
  */
 public class SoneTextParserTest {
 
-       //
-       // ACTIONS
-       //
+       private final SoneProvider soneProvider = new TestSoneProvider();
+       private final TestPostProvider postProvider = new TestPostProvider();
+       private final SoneTextParser soneTextParser = new SoneTextParser(soneProvider, postProvider);
 
        /**
         * Tests basic plain-text operation of the parser.
@@ -53,7 +64,6 @@ public class SoneTextParserTest {
         */
        @Test
        public void testPlainText() throws IOException {
-               SoneTextParser soneTextParser = new SoneTextParser(null, null);
                Iterable<Part> parts;
 
                /* check basic operation. */
@@ -80,7 +90,6 @@ public class SoneTextParserTest {
         */
        @Test
        public void testKSKLinks() throws IOException {
-               SoneTextParser soneTextParser = new SoneTextParser(null, null);
                Iterable<Part> parts;
 
                /* check basic links. */
@@ -108,7 +117,6 @@ public class SoneTextParserTest {
         */
        @Test
        public void testEmptyLinesAndSoneLinks() throws IOException {
-               SoneTextParser soneTextParser = new SoneTextParser(new TestSoneProvider(), null);
                Iterable<Part> parts;
 
                /* check basic links. */
@@ -127,7 +135,6 @@ public class SoneTextParserTest {
         */
        @Test
        public void testEmpyHttpLinks() throws IOException {
-               SoneTextParser soneTextParser = new SoneTextParser(new TestSoneProvider(), null);
                Iterable<Part> parts;
 
                /* check empty http links. */
@@ -136,6 +143,13 @@ public class SoneTextParserTest {
                assertThat(convertText(parts, PlainTextPart.class), is("Some text. Empty link: http:// – nice!"));
        }
 
+       @Test
+       public void linksToPostAreParsedCorrectly() throws IOException {
+               postProvider.addValidPostId("foo", "Post about foo...");
+               Iterable<Part> parts = soneTextParser.parse(null, new StringReader("This post://foo is awesome."));
+               assertThat(convertText(parts, PlainTextPart.class, PostPart.class), is("This [post|foo|Post about foo...] is awesome."));
+       }
+
        //
        // PRIVATE METHODS
        //
@@ -187,6 +201,9 @@ public class SoneTextParserTest {
                        } else if (part instanceof SonePart) {
                                SonePart sonePart = (SonePart) part;
                                text.append("[Sone|").append(sonePart.getSone().getId()).append(']');
+                       } else if (part instanceof PostPart) {
+                               PostPart postPart = (PostPart) part;
+                               text.append("[post|").append(postPart.getPost().getId()).append('|').append(postPart.getPost().getText()).append(']');
                        }
                }
                return text.toString();
@@ -243,4 +260,35 @@ public class SoneTextParserTest {
 
        }
 
+       private static class TestPostProvider implements PostProvider {
+
+               private final Map<String, String> posts = new HashMap<String, String>();
+
+               private void addValidPostId(String validPostId, String text) {
+                       posts.put(validPostId, text);
+               }
+
+               @Override
+               public Collection<Post> getDirectedPosts(String recipientId) {
+                       return Collections.emptyList();
+               }
+
+               @Override
+               public Collection<Post> getPosts(String soneId) {
+                       return Collections.emptyList();
+               }
+
+               @Override
+               public Optional<Post> getPost(String postId) {
+                       if (posts.containsKey(postId)) {
+                               Post post = mock(Post.class);
+                               when(post.getId()).thenReturn(postId);
+                               when(post.getText()).thenReturn(posts.get(postId));
+                               return Optional.of(post);
+                       }
+                       return Optional.absent();
+               }
+
+       }
+
 }