1 package net.pterodactylus.sone.database.memory;
3 import static net.pterodactylus.sone.test.Matchers.isPostWithId;
4 import static org.hamcrest.MatcherAssert.assertThat;
5 import static org.hamcrest.Matchers.contains;
6 import static org.hamcrest.Matchers.is;
7 import static org.mockito.ArgumentMatchers.any;
8 import static org.mockito.ArgumentMatchers.anyString;
9 import static org.mockito.Mockito.mock;
10 import static org.mockito.Mockito.times;
11 import static org.mockito.Mockito.verify;
12 import static org.mockito.Mockito.when;
14 import java.util.HashMap;
15 import java.util.HashSet;
19 import net.pterodactylus.sone.data.Post;
21 import org.junit.Before;
22 import org.junit.Test;
23 import org.mockito.invocation.InvocationOnMock;
24 import org.mockito.stubbing.Answer;
27 * Unit test for {@link MemoryBookmarkDatabase}.
29 * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
31 public class MemoryBookmarkDatabaseTest {
33 private final MemoryDatabase memoryDatabase = mock(MemoryDatabase.class);
34 private final ConfigurationLoader configurationLoader =
35 mock(ConfigurationLoader.class);
36 private final MemoryBookmarkDatabase bookmarkDatabase =
37 new MemoryBookmarkDatabase(memoryDatabase, configurationLoader);
38 private final Map<String, Post> posts = new HashMap<String, Post>();
41 public void setupMemoryDatabase() {
42 when(memoryDatabase.getPost(anyString())).thenAnswer(
46 InvocationOnMock invocation) {
47 return posts.get(invocation.getArguments()[0]);
53 public void setupPosts() {
54 createAndRegisterPost("PostId1");
55 createAndRegisterPost("PostId2");
58 private Post createAndRegisterPost(String postId) {
59 Post post = createPost(postId);
60 posts.put(postId, post);
64 private Post createPost(String postId) {
65 Post post = mock(Post.class);
66 when(post.getId()).thenReturn(postId);
71 public void bookmarkDatabaseRetainsBookmarkedPosts() {
72 Set<Post> allPosts = new HashSet<Post>(posts.values());
73 for (Post post : allPosts) {
74 bookmarkDatabase.bookmarkPost(post);
76 assertThat(bookmarkDatabase.getBookmarkedPosts(), is(allPosts));
77 for (Post post : allPosts) {
78 assertThat(bookmarkDatabase.isPostBookmarked(post), is(true));
83 public void bookmarkingAPostSavesTheDatabase() {
84 for (Post post : posts.values()) {
85 bookmarkDatabase.bookmarkPost(post);
87 verify(configurationLoader, times(posts.size()))
88 .saveBookmarkedPosts(any(Set.class));
92 public void unbookmarkingAPostSavesTheDatabase() {
93 for (Post post : posts.values()) {
94 bookmarkDatabase.bookmarkPost(post);
95 bookmarkDatabase.unbookmarkPost(post);
97 verify(configurationLoader, times(posts.size() * 2))
98 .saveBookmarkedPosts(any(Set.class));
102 public void removingABookmarkRemovesTheCorrectBookmark() {
103 Set<Post> allPosts = new HashSet<Post>(posts.values());
104 for (Post post : allPosts) {
105 bookmarkDatabase.bookmarkPost(post);
107 Post randomPost = posts.values().iterator().next();
108 bookmarkDatabase.unbookmarkPost(randomPost);
109 allPosts.remove(randomPost);
110 assertThat(bookmarkDatabase.getBookmarkedPosts(), is(allPosts));
111 for (Post post : posts.values()) {
112 assertThat(bookmarkDatabase.isPostBookmarked(post),
113 is(!post.equals(randomPost)));
118 public void startingTheDatabaseLoadsBookmarkedPosts() {
119 bookmarkDatabase.start();
120 verify(configurationLoader).loadBookmarkedPosts();
124 public void stoppingTheDatabaseSavesTheBookmarkedPosts() {
125 bookmarkDatabase.stop();
126 verify(configurationLoader).saveBookmarkedPosts(any(Set.class));
130 public void bookmarkedPostsIncludeNotYetLoadedPosts() {
131 bookmarkDatabase.bookmarkPost(posts.get("PostId1"));
132 bookmarkDatabase.bookmarkPost(createPost("PostId3"));
133 final Set<Post> bookmarkedPosts =
134 bookmarkDatabase.getBookmarkedPosts();
135 assertThat(bookmarkedPosts,
136 contains(isPostWithId("PostId1"), isPostWithId("PostId3")));