Add method that verifies multiple posts.
[Sone.git] / src / test / java / net / pterodactylus / sone / fcp / AbstractSoneCommandTest.java
index cfaf660..02e19b2 100644 (file)
@@ -17,6 +17,7 @@
 
 package net.pterodactylus.sone.fcp;
 
+import static com.google.common.base.Optional.fromNullable;
 import static com.google.common.base.Optional.of;
 import static java.util.Arrays.asList;
 import static java.util.UUID.randomUUID;
@@ -31,12 +32,16 @@ import static org.mockito.Matchers.eq;
 import static org.mockito.Mockito.mock;
 import static org.mockito.Mockito.when;
 
+import java.util.Collection;
+import java.util.Collections;
 import java.util.List;
 
 import net.pterodactylus.sone.core.Core;
+import net.pterodactylus.sone.data.Post;
 import net.pterodactylus.sone.data.PostReply;
 import net.pterodactylus.sone.data.Profile;
 import net.pterodactylus.sone.data.Sone;
+import net.pterodactylus.sone.database.Database;
 import net.pterodactylus.sone.freenet.SimpleFieldSetBuilder;
 import net.pterodactylus.sone.freenet.fcp.FcpException;
 
@@ -56,6 +61,7 @@ import org.mockito.Matchers;
 public class AbstractSoneCommandTest {
 
        private final Core core = mock(Core.class);
+       private final Database database = mock(Database.class);
        private final AbstractSoneCommand abstractSoneCommand = new AbstractSoneCommand(core) {
                @Override
                public Response execute(SimpleFieldSet parameters, Bucket data, AccessType accessType) throws FcpException {
@@ -63,6 +69,10 @@ public class AbstractSoneCommandTest {
                }
        };
 
+       public AbstractSoneCommandTest() {
+               when(core.getDatabase()).thenReturn(database);
+       }
+
        @Test
        public void testStringEncoding() {
                String testString = prepareStringToBeEncoded();
@@ -222,11 +232,17 @@ public class AbstractSoneCommandTest {
                PostReply postReply = mock(PostReply.class);
                when(postReply.getId()).thenReturn(randomUUID().toString());
                when(postReply.getSone()).thenReturn(sone);
-               when(postReply.getTime()).thenReturn((long) (Math.random() * Long.MAX_VALUE));
+               when(postReply.getTime()).thenReturn(System.currentTimeMillis());
                when(postReply.getText()).thenReturn(text);
                return postReply;
        }
 
+       private PostReply createFuturePostReply(Sone sone, String text) {
+               PostReply postReply = createPostReply(sone, text);
+               when(postReply.getTime()).thenReturn(System.currentTimeMillis() + 86400000);
+               return postReply;
+       }
+
        @Test
        public void testEncodingLikes() throws FSParseException {
                List<Sone> likes = prepareMultipleSones();
@@ -288,4 +304,303 @@ public class AbstractSoneCommandTest {
                abstractSoneCommand.getMandatoryLocalSone(soneFieldSet, "RealSone");
        }
 
+       @Test
+       public void testParsingAnExistingOptionalSone() throws FcpException {
+               Sone sone = createSone("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", "Test", "First", "M.", "Last", (long) (Math.random() * Long.MAX_VALUE));
+               when(core.getSone(eq("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E"))).thenReturn(of(sone));
+               SimpleFieldSet soneFieldSet = new SimpleFieldSetBuilder().put("Sone", "jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E").get();
+               Optional<Sone> parsedSone = abstractSoneCommand.getOptionalSone(soneFieldSet, "Sone");
+               assertThat(parsedSone, notNullValue());
+               assertThat(parsedSone.isPresent(), is(true));
+               assertThat(parsedSone.get(), is(sone));
+       }
+
+       @Test
+       public void testParsingANonExistingOptionalSone() throws FcpException {
+               when(core.getSone(Matchers.<String>any())).thenReturn(Optional.<Sone>absent());
+               SimpleFieldSet soneFieldSet = new SimpleFieldSetBuilder().put("Sone", "jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E").get();
+               Optional<Sone> parsedSone = abstractSoneCommand.getOptionalSone(soneFieldSet, "Sone");
+               assertThat(parsedSone, notNullValue());
+               assertThat(parsedSone.isPresent(), is(false));
+       }
+
+       @Test(expected = FcpException.class)
+       public void testParsingAnOptionalSoneFromANonExistingFieldCausesAnError() throws FcpException {
+               when(core.getSone(Matchers.<String>any())).thenReturn(Optional.<Sone>absent());
+               SimpleFieldSet soneFieldSet = new SimpleFieldSetBuilder().put("Sone", "jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E").get();
+               abstractSoneCommand.getOptionalSone(soneFieldSet, "RealSone");
+       }
+
+       @Test
+       public void testParsingAPost() throws FcpException {
+               Sone sone = createSone("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", "Test", "First", "M.", "Last", (long) (Math.random() * Long.MAX_VALUE));
+               Post post = createPost(sone, null, (long) (Math.random() * Long.MAX_VALUE), "Some Text.");
+               when(database.getPost(eq(post.getId()))).thenReturn(of(post));
+               SimpleFieldSet postFieldSet = new SimpleFieldSetBuilder().put("Post", post.getId()).get();
+               Post parsedPost = abstractSoneCommand.getPost(postFieldSet, "Post");
+               assertThat(parsedPost, notNullValue());
+               assertThat(parsedPost, is(post));
+       }
+
+       private Post createPost(Sone sone, String recipient, long time, String text) {
+               Post post = mock(Post.class);
+               when(post.getId()).thenReturn(randomUUID().toString());
+               when(post.getSone()).thenReturn(sone);
+               when(post.getRecipientId()).thenReturn(fromNullable(recipient));
+               when(post.getTime()).thenReturn(time);
+               when(post.getText()).thenReturn(text);
+               return post;
+       }
+
+       @Test(expected = FcpException.class)
+       public void testThatTryingToParseANonExistingPostCausesAnError() throws FcpException {
+               Sone sone = createSone("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", "Test", "First", "M.", "Last", (long) (Math.random() * Long.MAX_VALUE));
+               Post post = createPost(sone, null, (long) (Math.random() * Long.MAX_VALUE), "Some Text.");
+               when(database.getPost(Matchers.<String>any())).thenReturn(Optional.<Post>absent());
+               SimpleFieldSet postFieldSet = new SimpleFieldSetBuilder().put("Post", post.getId()).get();
+               abstractSoneCommand.getPost(postFieldSet, "Post");
+       }
+
+       @Test(expected = FcpException.class)
+       public void testThatTryingToParseAPostFromANonExistingFieldCausesAnError() throws FcpException {
+               SimpleFieldSet postFieldSet = new SimpleFieldSetBuilder().get();
+               abstractSoneCommand.getPost(postFieldSet, "Post");
+       }
+
+       @Test
+       public void testParsingAReply() throws FcpException {
+               PostReply reply = createPostReply();
+               when(database.getPostReply(eq(reply.getId()))).thenReturn(of(reply));
+               SimpleFieldSet replyFieldSet = new SimpleFieldSetBuilder().put("Reply", reply.getId()).get();
+               PostReply parsedReply = abstractSoneCommand.getReply(replyFieldSet, "Reply");
+               assertThat(parsedReply, notNullValue());
+               assertThat(parsedReply, is(reply));
+       }
+
+       private PostReply createPostReply() {
+               PostReply postReply = mock(PostReply.class);
+               when(postReply.getId()).thenReturn(randomUUID().toString());
+               return postReply;
+       }
+
+       @Test(expected = FcpException.class)
+       public void testParsingANonExistingReply() throws FcpException {
+               PostReply reply = createPostReply();
+               when(database.getPostReply(Matchers.<String>any())).thenReturn(Optional.<PostReply>absent());
+               SimpleFieldSet replyFieldSet = new SimpleFieldSetBuilder().put("Reply", reply.getId()).get();
+               abstractSoneCommand.getReply(replyFieldSet, "Reply");
+       }
+
+       @Test(expected = FcpException.class)
+       public void testParsingAReplyFromANonExistingField() throws FcpException {
+               SimpleFieldSet replyFieldSet = new SimpleFieldSetBuilder().get();
+               abstractSoneCommand.getReply(replyFieldSet, "Reply");
+       }
+
+       @Test
+       public void testEncodingAPostWithoutRecipientAndReplies() throws FSParseException {
+               Sone sone = createSone("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", "Test", "First", "M.", "Last", (long) (Math.random() * Long.MAX_VALUE));
+               Post post = createPost(sone, null, (long) (Math.random() * Long.MAX_VALUE), "Some Text.");
+               SimpleFieldSet postFieldSet = abstractSoneCommand.encodePost(post, "Post.");
+               assertThat(postFieldSet, notNullValue());
+               verifyPost(postFieldSet, "Post.", post);
+       }
+
+       private void verifyPost(SimpleFieldSet postFieldSet, String prefix, Post post) throws FSParseException {
+               assertThat(postFieldSet.get(prefix + "ID"), is(post.getId()));
+               assertThat(postFieldSet.get(prefix + "Sone"), is(post.getSone().getId()));
+               assertThat(postFieldSet.get(prefix + "Recipient"), is(post.getRecipientId().orNull()));
+               assertThat(postFieldSet.getLong(prefix + "Time"), is(post.getTime()));
+               assertThat(postFieldSet.get(prefix + "Text"), is(post.getText()));
+       }
+
+       @Test
+       public void testEncodingAPostWithRecipientWithoutReplies() throws FSParseException {
+               Sone sone = createSone("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", "Test", "First", "M.", "Last", (long) (Math.random() * Long.MAX_VALUE));
+               Post post = createPost(sone, "KpoohJSbZGltHHG-YsxKV8ojjS5gwScRv50kl3AkLXg", (long) (Math.random() * Long.MAX_VALUE), "Some Text.");
+               SimpleFieldSet postFieldSet = abstractSoneCommand.encodePost(post, "Post.");
+               assertThat(postFieldSet, notNullValue());
+               verifyPost(postFieldSet, "Post.", post);
+       }
+
+       @Test
+       public void testEncodingAPostWithoutRecipientWithReplies() throws FSParseException {
+               Sone sone = createSone("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", "Test", "First", "M.", "Last", (long) (Math.random() * Long.MAX_VALUE));
+               Post post = createPost(sone, null, (long) (Math.random() * Long.MAX_VALUE), "Some Text.");
+               PostReply postReply = createPostReply(sone, "Reply.");
+               when(post.getReplies()).thenReturn(asList(postReply));
+               SimpleFieldSet postFieldSet = abstractSoneCommand.encodePostWithReplies(post, "Post.");
+               assertThat(postFieldSet, notNullValue());
+               verifyPost(postFieldSet, "Post.", post);
+               verifyPostReplies(postFieldSet, "Post.", asList(postReply));
+       }
+
+       private void verifyPostReplies(SimpleFieldSet postFieldSet, String prefix, Collection<PostReply> postReplies) throws FSParseException {
+               assertThat(postFieldSet.getInt(prefix + "Replies.Count"), is(postReplies.size()));
+               int postReplyIndex = 0;
+               for (PostReply postReply : postReplies) {
+                       assertThat(postFieldSet.get(prefix + "Replies." + postReplyIndex + ".ID"), is(postReply.getId()));
+                       assertThat(postFieldSet.get(prefix + "Replies." + postReplyIndex + ".Sone"), is(postReply.getSone().getId()));
+                       assertThat(postFieldSet.getLong(prefix + "Replies." + postReplyIndex + ".Time"), is(postReply.getTime()));
+                       assertThat(postFieldSet.get(prefix + "Replies." + postReplyIndex + ".Text"), is(postReply.getText()));
+                       postReplyIndex++;
+               }
+       }
+
+       @Test
+       public void testEncodingAPostWithoutRecipientWithFutureReplies() throws FSParseException {
+               Sone sone = createSone("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", "Test", "First", "M.", "Last", (long) (Math.random() * Long.MAX_VALUE));
+               Post post = createPost(sone, null, (long) (Math.random() * Long.MAX_VALUE), "Some Text.");
+               PostReply postReply = createFuturePostReply(sone, "Reply.");
+               when(post.getReplies()).thenReturn(asList(postReply));
+               SimpleFieldSet postFieldSet = abstractSoneCommand.encodePostWithReplies(post, "Post.");
+               assertThat(postFieldSet, notNullValue());
+               verifyPost(postFieldSet, "Post.", post);
+               verifyPostReplies(postFieldSet, "Post.", Collections.<PostReply>emptyList());
+       }
+
+       @Test
+       public void testEncodingAPostWithRecipientAndReplies() throws FSParseException {
+               Sone sone = createSone("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", "Test", "First", "M.", "Last", (long) (Math.random() * Long.MAX_VALUE));
+               Post post = createPost(sone, "KpoohJSbZGltHHG-YsxKV8ojjS5gwScRv50kl3AkLXg", (long) (Math.random() * Long.MAX_VALUE), "Some Text.");
+               PostReply postReply = createPostReply(sone, "Reply.");
+               when(post.getReplies()).thenReturn(asList(postReply));
+               SimpleFieldSet postFieldSet = abstractSoneCommand.encodePostWithReplies(post, "Post.");
+               assertThat(postFieldSet, notNullValue());
+               verifyPost(postFieldSet, "Post.", post);
+               verifyPostReplies(postFieldSet, "Post.", asList(postReply));
+       }
+
+       @Test
+       public void testEncodingPostsWithoutRecipientAndReplies() throws FSParseException {
+               Sone sone1 = createSone("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", "Test1", "Alpha", "A.", "First", (long) (Math.random() * Long.MAX_VALUE));
+               Sone sone2 = createSone("KpoohJSbZGltHHG-YsxKV8ojjS5gwScRv50kl3AkLXg", "Test2", "Beta", "B.", "Second", (long) (Math.random() * Long.MAX_VALUE));
+               Post post1 = createPost(sone1, null, (long) (Math.random() * Long.MAX_VALUE), "Some Text.");
+               Post post2 = createPost(sone2, null, (long) (Math.random() * Long.MAX_VALUE), "Some other Text.");
+               SimpleFieldSet postFieldSet = abstractSoneCommand.encodePosts(asList(post1, post2), "Posts.");
+               assertThat(postFieldSet, notNullValue());
+               verifyPosts(postFieldSet, "Posts.", asList(post1, post2));
+       }
+
+       private void verifyPosts(SimpleFieldSet postFieldSet, String prefix, Collection<Post> posts) throws FSParseException {
+               assertThat(postFieldSet.getInt(prefix + "Count"), is(posts.size()));
+               int postIndex = 0;
+               for (Post post : posts) {
+                       verifyPost(postFieldSet, prefix + postIndex + ".", post);
+                       postIndex++;
+               }
+       }
+
+       @Test
+       public void testEncodingPostsWithRecipientWithoutReplies() throws FSParseException {
+               Sone sone1 = createSone("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", "Test1", "Alpha", "A.", "First", (long) (Math.random() * Long.MAX_VALUE));
+               Sone sone2 = createSone("KpoohJSbZGltHHG-YsxKV8ojjS5gwScRv50kl3AkLXg", "Test2", "Beta", "B.", "Second", (long) (Math.random() * Long.MAX_VALUE));
+               Post post1 = createPost(sone1, "KpoohJSbZGltHHG-YsxKV8ojjS5gwScRv50kl3AkLXg", (long) (Math.random() * Long.MAX_VALUE), "Some Text.");
+               Post post2 = createPost(sone2, "jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", (long) (Math.random() * Long.MAX_VALUE), "Some other Text.");
+               SimpleFieldSet postFieldSet = abstractSoneCommand.encodePosts(asList(post1, post2), "Posts.");
+               assertThat(postFieldSet, notNullValue());
+               verifyPosts(postFieldSet, "Posts.", asList(post1, post2));
+       }
+
+       @Test
+       public void testEncodingPostsWithoutRecipientWithReplies() throws FSParseException {
+               Sone sone1 = createSone("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", "Test1", "Alpha", "A.", "First", (long) (Math.random() * Long.MAX_VALUE));
+               Sone sone2 = createSone("KpoohJSbZGltHHG-YsxKV8ojjS5gwScRv50kl3AkLXg", "Test2", "Beta", "B.", "Second", (long) (Math.random() * Long.MAX_VALUE));
+               Post post1 = createPost(sone1, null, (long) (Math.random() * Long.MAX_VALUE), "Some Text.");
+               Post post2 = createPost(sone2, null, (long) (Math.random() * Long.MAX_VALUE), "Some other Text.");
+               PostReply postReply1 = createPostReply(sone2, "Reply from 2 to 1");
+               PostReply postReply2 = createPostReply(sone1, "Reply from 1 to 2");
+               when(post1.getReplies()).thenReturn(asList(postReply1));
+               when(post2.getReplies()).thenReturn(asList(postReply2));
+               SimpleFieldSet postFieldSet = abstractSoneCommand.encodePostsWithReplies(asList(post1, post2), "Posts.");
+               assertThat(postFieldSet, notNullValue());
+               assertThat(postFieldSet.getInt("Posts.Count"), is(2));
+               assertThat(postFieldSet.get("Posts.0.ID"), is(post1.getId()));
+               assertThat(postFieldSet.get("Posts.0.Sone"), is(sone1.getId()));
+               assertThat(postFieldSet.get("Posts.0.Recipient"), nullValue());
+               assertThat(postFieldSet.getLong("Posts.0.Time"), is(post1.getTime()));
+               assertThat(postFieldSet.get("Posts.0.Text"), is(post1.getText()));
+               assertThat(postFieldSet.getInt("Posts.0.Replies.Count"), is(1));
+               assertThat(postFieldSet.get("Posts.0.Replies.0.ID"), is(postReply1.getId()));
+               assertThat(postFieldSet.get("Posts.0.Replies.0.Sone"), is(postReply1.getSone().getId()));
+               assertThat(postFieldSet.getLong("Posts.0.Replies.0.Time"), is(postReply1.getTime()));
+               assertThat(postFieldSet.get("Posts.0.Replies.0.Text"), is(postReply1.getText()));
+               assertThat(postFieldSet.get("Posts.1.ID"), is(post2.getId()));
+               assertThat(postFieldSet.get("Posts.1.Sone"), is(sone2.getId()));
+               assertThat(postFieldSet.get("Posts.1.Recipient"), nullValue());
+               assertThat(postFieldSet.getLong("Posts.1.Time"), is(post2.getTime()));
+               assertThat(postFieldSet.get("Posts.1.Text"), is(post2.getText()));
+               assertThat(postFieldSet.getInt("Posts.1.Replies.Count"), is(1));
+               assertThat(postFieldSet.get("Posts.1.Replies.0.ID"), is(postReply2.getId()));
+               assertThat(postFieldSet.get("Posts.1.Replies.0.Sone"), is(postReply2.getSone().getId()));
+               assertThat(postFieldSet.getLong("Posts.1.Replies.0.Time"), is(postReply2.getTime()));
+               assertThat(postFieldSet.get("Posts.1.Replies.0.Text"), is(postReply2.getText()));
+       }
+
+       @Test
+       public void testEncodingPostsWithRecipientAndReplies() throws FSParseException {
+               Sone sone1 = createSone("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", "Test1", "Alpha", "A.", "First", (long) (Math.random() * Long.MAX_VALUE));
+               Sone sone2 = createSone("KpoohJSbZGltHHG-YsxKV8ojjS5gwScRv50kl3AkLXg", "Test2", "Beta", "B.", "Second", (long) (Math.random() * Long.MAX_VALUE));
+               Post post1 = createPost(sone1, "KpoohJSbZGltHHG-YsxKV8ojjS5gwScRv50kl3AkLXg", (long) (Math.random() * Long.MAX_VALUE), "Some Text.");
+               Post post2 = createPost(sone2, "jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", (long) (Math.random() * Long.MAX_VALUE), "Some other Text.");
+               PostReply postReply1 = createPostReply(sone2, "Reply from 2 to 1");
+               PostReply postReply2 = createPostReply(sone1, "Reply from 1 to 2");
+               when(post1.getReplies()).thenReturn(asList(postReply1));
+               when(post2.getReplies()).thenReturn(asList(postReply2));
+               SimpleFieldSet postFieldSet = abstractSoneCommand.encodePostsWithReplies(asList(post1, post2), "Posts.");
+               assertThat(postFieldSet, notNullValue());
+               assertThat(postFieldSet.getInt("Posts.Count"), is(2));
+               assertThat(postFieldSet.get("Posts.0.ID"), is(post1.getId()));
+               assertThat(postFieldSet.get("Posts.0.Sone"), is(sone1.getId()));
+               assertThat(postFieldSet.get("Posts.0.Recipient"), is("KpoohJSbZGltHHG-YsxKV8ojjS5gwScRv50kl3AkLXg"));
+               assertThat(postFieldSet.getLong("Posts.0.Time"), is(post1.getTime()));
+               assertThat(postFieldSet.get("Posts.0.Text"), is(post1.getText()));
+               assertThat(postFieldSet.getInt("Posts.0.Replies.Count"), is(1));
+               assertThat(postFieldSet.get("Posts.0.Replies.0.ID"), is(postReply1.getId()));
+               assertThat(postFieldSet.get("Posts.0.Replies.0.Sone"), is(postReply1.getSone().getId()));
+               assertThat(postFieldSet.getLong("Posts.0.Replies.0.Time"), is(postReply1.getTime()));
+               assertThat(postFieldSet.get("Posts.0.Replies.0.Text"), is(postReply1.getText()));
+               assertThat(postFieldSet.get("Posts.1.ID"), is(post2.getId()));
+               assertThat(postFieldSet.get("Posts.1.Sone"), is(sone2.getId()));
+               assertThat(postFieldSet.get("Posts.1.Recipient"), is("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E"));
+               assertThat(postFieldSet.getLong("Posts.1.Time"), is(post2.getTime()));
+               assertThat(postFieldSet.get("Posts.1.Text"), is(post2.getText()));
+               assertThat(postFieldSet.getInt("Posts.1.Replies.Count"), is(1));
+               assertThat(postFieldSet.get("Posts.1.Replies.0.ID"), is(postReply2.getId()));
+               assertThat(postFieldSet.get("Posts.1.Replies.0.Sone"), is(postReply2.getSone().getId()));
+               assertThat(postFieldSet.getLong("Posts.1.Replies.0.Time"), is(postReply2.getTime()));
+               assertThat(postFieldSet.get("Posts.1.Replies.0.Text"), is(postReply2.getText()));
+       }
+
+       @Test
+       public void testEncodingPostsWithRecipientAndFutureReplies() throws FSParseException {
+               Sone sone1 = createSone("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", "Test1", "Alpha", "A.", "First", (long) (Math.random() * Long.MAX_VALUE));
+               Sone sone2 = createSone("KpoohJSbZGltHHG-YsxKV8ojjS5gwScRv50kl3AkLXg", "Test2", "Beta", "B.", "Second", (long) (Math.random() * Long.MAX_VALUE));
+               Post post1 = createPost(sone1, "KpoohJSbZGltHHG-YsxKV8ojjS5gwScRv50kl3AkLXg", (long) (Math.random() * Long.MAX_VALUE), "Some Text.");
+               Post post2 = createPost(sone2, "jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E", (long) (Math.random() * Long.MAX_VALUE), "Some other Text.");
+               PostReply postReply1 = createPostReply(sone2, "Reply from 2 to 1");
+               PostReply postReply2 = createFuturePostReply(sone1, "Reply from 1 to 2");
+               when(post1.getReplies()).thenReturn(asList(postReply1));
+               when(post2.getReplies()).thenReturn(asList(postReply2));
+               SimpleFieldSet postFieldSet = abstractSoneCommand.encodePostsWithReplies(asList(post1, post2), "Posts.");
+               assertThat(postFieldSet, notNullValue());
+               assertThat(postFieldSet.getInt("Posts.Count"), is(2));
+               assertThat(postFieldSet.get("Posts.0.ID"), is(post1.getId()));
+               assertThat(postFieldSet.get("Posts.0.Sone"), is(sone1.getId()));
+               assertThat(postFieldSet.get("Posts.0.Recipient"), is("KpoohJSbZGltHHG-YsxKV8ojjS5gwScRv50kl3AkLXg"));
+               assertThat(postFieldSet.getLong("Posts.0.Time"), is(post1.getTime()));
+               assertThat(postFieldSet.get("Posts.0.Text"), is(post1.getText()));
+               assertThat(postFieldSet.getInt("Posts.0.Replies.Count"), is(1));
+               assertThat(postFieldSet.get("Posts.0.Replies.0.ID"), is(postReply1.getId()));
+               assertThat(postFieldSet.get("Posts.0.Replies.0.Sone"), is(postReply1.getSone().getId()));
+               assertThat(postFieldSet.getLong("Posts.0.Replies.0.Time"), is(postReply1.getTime()));
+               assertThat(postFieldSet.get("Posts.0.Replies.0.Text"), is(postReply1.getText()));
+               assertThat(postFieldSet.get("Posts.1.ID"), is(post2.getId()));
+               assertThat(postFieldSet.get("Posts.1.Sone"), is(sone2.getId()));
+               assertThat(postFieldSet.get("Posts.1.Recipient"), is("jXH8d-eFdm14R69WyaCgQoSjaY0jl-Ut6etlXjK0e6E"));
+               assertThat(postFieldSet.getLong("Posts.1.Time"), is(post2.getTime()));
+               assertThat(postFieldSet.get("Posts.1.Text"), is(post2.getText()));
+               assertThat(postFieldSet.getInt("Posts.1.Replies.Count"), is(0));
+       }
+
 }