1   package org.unitedfront2.domain.communication;
2   
3   import java.util.HashMap;
4   import java.util.Locale;
5   import java.util.Map;
6   
7   import org.junit.Assert;
8   import org.junit.Test;
9   import org.springframework.beans.factory.annotation.Autowired;
10  import org.unitedfront2.domain.accesscontrol.AccessControl;
11  import org.unitedfront2.domain.accesscontrol.FriendOnly;
12  import org.unitedfront2.domain.accesscontrol.OwnerOnly;
13  import org.unitedfront2.domain.accesscontrol.Public;
14  import org.unitedfront2.domain.accesscontrol.UserOnly;
15  import org.unitedfront2.test.TransactionalTestCaseWithInitialData;
16  
17  public class BlogTest extends TransactionalTestCaseWithInitialData {
18  
19      @Autowired private BlogTable blogTable;
20  
21      @Test
22      public void testPost() throws BlogCodeUsedByOtherException {
23          Blog blog = createBlog();
24          blog.store();
25          BlogEntry blogEntry = createBlogEntry(blog.getReadAccessControl(),
26                  blog.getWriteAccessControl());
27  
28          blog.retrieveEntries(0, 1);
29          Assert.assertSame(0, blog.getEntries().size());
30          blog.post(blogEntry);
31          blog.retrieveEntries(0, 1);
32          Assert.assertSame(1, blog.getEntries().size());
33          Assert.assertEquals(blogEntry, blog.getEntries().get(0));
34      }
35  
36      private Blog createBlog() {
37          AccessControl readAccessControl = domainFactory.prototype(Public.class);
38          AccessControl writeAccessControl = domainFactory.prototype(OwnerOnly.class);
39          return domainFactory.prototype(new Blog("test",
40                  createOverview(readAccessControl, writeAccessControl),
41                  simpleUser1.getId(), readAccessControl, writeAccessControl,
42                  domainFactory.prototype(UserOnly.class)));
43      }
44  
45      private Message createOverview(AccessControl readAccessControl,
46              AccessControl writeAccessControl) {
47          MessageEntry entry = new MessageEntry();
48          entry.setSubject("テストブログ");
49          entry.setBody("これはテストブログです。");
50          Map<Locale, MessageEntry> entryMap
51              = new HashMap<Locale, MessageEntry>();
52          entryMap.put(Locale.JAPANESE, entry);
53          Message overview = domainFactory.prototype(new Message(null, entryMap,
54                  simpleUser1.getId(), simpleUser1.getId(), readAccessControl,
55                  writeAccessControl));
56          return overview;
57      }
58  
59      private BlogEntry createBlogEntry(AccessControl readAccessControl,
60              AccessControl writeAccessControl) {
61          MessageEntry entry = new MessageEntry();
62          entry.setSubject("今日の記事です。");
63          entry.setBody("これは今日の記事です。");
64          Map<Locale, MessageEntry> entryMap
65              = new HashMap<Locale, MessageEntry>();
66          entryMap.put(Locale.JAPANESE, entry);
67          Message article = domainFactory.prototype(new Message(null, entryMap,
68                  simpleUser1.getId(), simpleUser1.getId(), readAccessControl,
69                  writeAccessControl));
70          return domainFactory.prototype(new BlogEntry(article));
71      }
72  
73      @Test
74      public void testStore登録() throws BlogCodeUsedByOtherException {
75          Blog blog = createBlog();
76          blog.store();
77          Blog actual = blogTable.find(blog.getId());
78          Assert.assertEquals(blog, actual);
79      }
80  
81      @Test(expected=BlogCodeUsedByOtherException.class)
82      public void testStore登録を試みるがコードが重複()
83          throws BlogCodeUsedByOtherException {
84          Blog blog = createBlog();
85          blog.store();
86          Blog blog2 = domainFactory.prototype(blog);
87          blog2.setId(null);
88          blog2.store();
89      }
90  
91      @Test
92      public void testStore更新() throws BlogCodeUsedByOtherException {
93          Blog blog = createBlog();
94          blog.store();
95          blog.setCode("new_" + blog.getCode());
96          blog.getReadAccessControl().changeTo(FriendOnly.class);
97          blog.store();
98          Blog actual = blogTable.find(blog.getId());
99          Assert.assertEquals(blog, actual);
100     }
101 
102     @Test(expected=BlogCodeUsedByOtherException.class)
103     public void testStore更新を試みるがコードが重複()
104         throws BlogCodeUsedByOtherException {
105         Blog blog = createBlog();
106         blog.store();
107         Blog blog2 = domainFactory.prototype(blog);
108         blog2.setId(null);
109         blog2.setCode(blog2.getCode() + "2");
110         blog2.store();
111         blog2.setCode(blog.getCode());
112         blog2.store();
113     }
114 
115     @Test
116     public void testRetrieveEntriesAll() throws BlogCodeUsedByOtherException {
117         Blog blog = createBlog();
118         blog.store();
119         BlogEntry entry1 = createBlogEntry(blog.getReadAccessControl(), blog.getWriteAccessControl());
120         blog.post(entry1);
121         BlogEntry entry2 = createBlogEntry(blog.getReadAccessControl(), blog.getWriteAccessControl());
122         blog.post(entry2);
123         BlogEntry entry3 = createBlogEntry(blog.getReadAccessControl(), blog.getWriteAccessControl());
124         blog.post(entry3);
125         blog.retrieveEntries();
126         Assert.assertNotNull(blog.getEntries());
127         Assert.assertSame(3, blog.getEntries().size());
128         Assert.assertEquals(entry3, blog.getEntries().get(0));
129         Assert.assertEquals(entry2, blog.getEntries().get(1));
130         Assert.assertEquals(entry1, blog.getEntries().get(2));
131     }
132 
133     @Test
134     public void testDelete() throws BlogCodeUsedByOtherException,
135         BlogEntryExistException {
136         Blog blog = createBlog();
137         blog.store();
138         blog.delete();
139         Assert.assertNull(blogTable.find(blog.getId()));
140     }
141 
142     @Test(expected=BlogEntryExistException.class)
143     public void testDeleteブログ記事が存在する() throws BlogEntryExistException,
144         BlogCodeUsedByOtherException {
145         Blog blog = createBlog();
146         blog.store();
147         BlogEntry blogEntry = createBlogEntry(blog.getReadAccessControl(),
148                 blog.getWriteAccessControl());
149         blog.post(blogEntry);
150         blog.delete();
151     }
152 }