/* * Copyright (C) 2001 - 2005 ZJU Online Judge, All Rights Reserved. */ package cn.edu.zju.acm.onlinejudge.persistence.sql; import junit.framework.TestCase; import java.text.DateFormat; import java.util.ArrayList; import java.util.Arrays; import java.util.Date; import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Locale; import java.util.Set; import cn.edu.zju.acm.onlinejudge.bean.Forum; import cn.edu.zju.acm.onlinejudge.bean.Thread; import cn.edu.zju.acm.onlinejudge.bean.Post; import cn.edu.zju.acm.onlinejudge.bean.UserProfile; import cn.edu.zju.acm.onlinejudge.bean.enumeration.Country; import cn.edu.zju.acm.onlinejudge.persistence.PersistenceException; /** * <p>Tests for AuthorizationPersistenceImpl.</p> * * @version 2.0 * @author ZOJDEV */ public class AuthorizationPersistenceImplTest extends TestCase { /** * A ForumPersistenceImpl instance. */ private ForumPersistenceImpl persistence = new ForumPersistenceImpl(); /** * A UserProfile instance. */ private UserProfile profile = new UserProfile(); /** * A Forum instance. */ private Forum forum1 = null; /** * A Forum instance. */ private Forum forum2 = null; /** * A Forum instance. */ private Forum forum3 = null; /** * A Thread instance. */ private Thread thread1 = null; /** * A Thread instance. */ private Thread thread2 = null; /** * A Thread instance. */ private Thread thread3 = null; /** * A Post instance. */ private Post post1 = null; /** * A Post instance. */ private Post post2 = null; /** * A Post instance. */ private Post post3 = null; /** * A list containing some posts. */ private List thread3Posts = null; /** * Setup. * @throws Exception to JUnit */ protected void setUp() throws Exception { DatabaseHelper.resetAllTables(false); profile.setHandle("myHandle"); profile.setPassword("myPassword"); profile.setEmail("myEmail"); profile.setRegDate(new Date()); profile.setFirstName("myFirstName"); profile.setLastName("myLastName"); profile.setAddressLine1("myAddressLine1"); profile.setAddressLine2("myAddressLine2"); profile.setCity("myCity"); profile.setState("myState"); profile.setCountry(new Country(1, "foo")); profile.setZipCode("myZipCode"); profile.setPhoneNumber("myPhoneNumber"); profile.setBirthDate(DateFormat.getDateInstance(DateFormat.SHORT, Locale.US).parse("1/1/1980")); profile.setGender('M'); profile.setSchool("mySchool"); profile.setMajor("myMajor"); profile.setGraduateStudent(true); profile.setGraduationYear(2005); profile.setStudentNumber("myStudentNumber"); profile.setConfirmed(false); new UserPersistenceImpl().createUserProfile(profile, 1); forum1 = newForum(1); forum2 = newForum(2); forum3 = newForum(3); persistence.createForum(forum1, 1); persistence.createForum(forum2, 1); persistence.createForum(forum3, 1); thread1 = newThread(1, forum1.getId(), profile.getId()); thread2 = newThread(2, forum1.getId(), profile.getId()); thread3 = newThread(3, forum2.getId(), profile.getId()); persistence.createThread(thread1, 1); persistence.createThread(thread2, 1); persistence.createThread(thread3, 1); post1 = newPost(1, thread1.getId(), profile.getId()); post2 = newPost(2, thread1.getId(), profile.getId()); post3 = newPost(3, thread2.getId(), profile.getId()); persistence.createPost(post1, 1); persistence.createPost(post2, 1); persistence.createPost(post3, 1); thread3Posts = new ArrayList(); for (int i = 1; i <= 10; ++i) { Post post = newPost(i, thread3.getId(), profile.getId()); thread3Posts.add(post); persistence.createPost(post, 1); } } /** * Tear down. * @throws Exception to JUnit */ protected void tearDown() throws Exception { DatabaseHelper.clearTable("post"); DatabaseHelper.clearTable("thread"); DatabaseHelper.clearTable("forum"); DatabaseHelper.clearTable("user_profile"); } /** * Tests getAllForums method * @throws Exception to JUnit */ public void testGetAllForums() throws Exception { List forums = persistence.getAllForums(); assertEquals("size is wrong", 3, forums.size()); Set nameSet = new HashSet(Arrays.asList(new String[] {"forum1", "forum2", "forum3"})); Set descSet = new HashSet(Arrays.asList(new String[] { "forum1 description", "forum2 description", "forum3 description"})); for (Iterator it = forums.iterator(); it.hasNext();) { Forum forum = (Forum) it.next(); assertTrue("wrong name", nameSet.contains(forum.getName())); assertTrue("wrong description", descSet.contains(forum.getDescription())); nameSet.remove(forum.getName()); descSet.remove(forum.getDescription()); } } /** * Tests getForum method * @throws Exception to JUnit */ public void testGetForum() throws Exception { List forums = persistence.getAllForums(); for (Iterator it = forums.iterator(); it.hasNext();) { Forum forum = (Forum) it.next(); Forum forum1 = persistence.getForum(forum.getId()); checkForum(forum, forum1); } } /** * Tests createForum method * @throws Exception to JUnit */ public void testCreateForum1() throws Exception { Forum forum = new Forum(); forum.setName("name"); forum.setDescription("desc"); persistence.createForum(forum, 1); Forum forum1 = persistence.getForum(forum.getId()); checkForum(forum, forum1); } /** * Tests createForum method * @throws Exception to JUnit */ public void testCreateForum2() throws Exception { Forum forum1 = new Forum(); forum1.setName("name1"); forum1.setDescription("desc1"); Forum forum2 = new Forum(); forum2.setName("name2"); forum2.setDescription("desc2"); persistence.createForum(forum1, 1); persistence.createForum(forum2, 1); Forum forum11 = persistence.getForum(forum1.getId()); checkForum(forum1, forum11); Forum forum22 = persistence.getForum(forum2.getId()); checkForum(forum2, forum22); } /** * Tests updateForum method * @throws Exception to JUnit */ public void testUpdateForum1() throws Exception { forum1.setName("new name"); forum1.setDescription("new desc"); persistence.updateForum(forum1, 1); Forum forum11 = persistence.getForum(forum1.getId()); checkForum(forum1, forum11); } /** * Tests updateForum method * @throws Exception to JUnit */ public void testUpdateForum2() throws Exception { try { Forum forum = new Forum(); forum.setName("foo"); forum.setDescription("bar"); persistence.updateForum(forum, 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests deleteForum method * @throws Exception to JUnit */ public void testDeleteForum1() throws Exception { persistence.deleteForum(forum1.getId(), 1); assertNull("forum should be deleted", persistence.getForum(forum1.getId())); } /** * Tests deleteForum method * @throws Exception to JUnit */ public void testDeleteForum2() throws Exception { try { persistence.deleteForum(-1, 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests searchThreads method * @throws Exception to JUnit */ public void testSearchThreads() throws Exception { // TODO } /** * Tests getThread method * @throws Exception to JUnit */ public void testGetThread() throws Exception { Thread thread = persistence.getThread(thread1.getId()); checkThread(thread1, thread); } /** * Tests createThread method * @throws Exception to JUnit */ public void testCreateThread1() throws Exception { Thread thread = newThread(-1, forum1.getId(), profile.getId()); persistence.createThread(thread, 1); Thread newThread = persistence.getThread(thread.getId()); checkThread(thread, newThread); } /** * Tests createThread method * @throws Exception to JUnit */ public void testCreateThread2() throws Exception { try { persistence.createThread(newThread(1, -1, profile.getId()), 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests createThread method * @throws Exception to JUnit */ public void testCreateThread3() throws Exception { try { persistence.createThread(newThread(1, forum1.getId(), -1), 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests updateThread method * @throws Exception to JUnit */ public void testUpdateThread1() throws Exception { thread1.setId(thread2.getId()); persistence.updateThread(thread1, 1); Thread thread = persistence.getThread(thread1.getId()); checkThread(thread1, thread); } /** * Tests updateThread method * @throws Exception to JUnit */ public void testUpdateThread2() throws Exception { try { persistence.updateThread(newThread(-1, forum1.getId(), profile.getId()), 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests updateThread method * @throws Exception to JUnit */ public void testUpdateThread3() throws Exception { try { persistence.updateThread(newThread(forum1.getId(), -1, profile.getId()), 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests updateThread method * @throws Exception to JUnit */ public void testUpdateThread4() throws Exception { try { persistence.updateThread(newThread(forum1.getId(), forum1.getId(), -1), 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests deleteThread method * @throws Exception to JUnit */ public void testDeleteThread1() throws Exception { persistence.deleteThread(thread1.getId(), 1); assertNull("thread should be deleted", persistence.getThread(thread1.getId())); } /** * Tests deleteThread method * @throws Exception to JUnit */ public void testDeleteThread2() throws Exception { try { persistence.deleteThread(-1, 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests getPost method * @throws Exception to JUnit */ public void testGetPost() throws Exception { Post post = persistence.getPost(post1.getId()); checkPost(post1, post); } /** * Tests createPost method * @throws Exception to JUnit */ public void testCreatePost1() throws Exception { Post post = newPost(-1, thread1.getId(), profile.getId()); persistence.createPost(post, 1); Post newPost = persistence.getPost(post.getId()); checkPost(post, newPost); } /** * Tests createPost method * @throws Exception to JUnit */ public void testCreatePost2() throws Exception { try { persistence.createPost(newPost(1, -1, profile.getId()), 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests createPost method * @throws Exception to JUnit */ public void testCreatePost3() throws Exception { try { persistence.createPost(newPost(1, thread1.getId(), -1), 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests updatePost method * @throws Exception to JUnit */ public void testUpdatePost1() throws Exception { post1.setId(post2.getId()); persistence.updatePost(post1, 1); Post post = persistence.getPost(post1.getId()); checkPost(post1, post); } /** * Tests updatePost method * @throws Exception to JUnit */ public void testUpdatePost2() throws Exception { try { persistence.updatePost(newPost(-1, thread1.getId(), profile.getId()), 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests updatePost method * @throws Exception to JUnit */ public void testUpdatePost3() throws Exception { try { persistence.updatePost(newPost(thread1.getId(), -1, profile.getId()), 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests updatePost method * @throws Exception to JUnit */ public void testUpdatePost4() throws Exception { try { persistence.updatePost(newPost(thread1.getId(), thread1.getId(), -1), 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests deletePost method * @throws Exception to JUnit */ public void testDeletePost1() throws Exception { persistence.deletePost(post1.getId(), 1); assertNull("post should be deleted", persistence.getPost(post1.getId())); } /** * Tests deletePost method * @throws Exception to JUnit */ public void testDeletePost2() throws Exception { try { persistence.deletePost(-1, 1); fail("PersistenceException should be thrown"); } catch (PersistenceException pe) { // ok } } /** * Tests getPosts method * @throws Exception to JUnit */ public void testGetPosts1() throws Exception { List posts = persistence.getPosts(thread3.getId(), 5, 0); assertEquals("the size is wrong", 0, posts.size()); } /** * Tests getPosts method * @throws Exception to JUnit */ public void testGetPosts2() throws Exception { List posts = persistence.getPosts(thread3.getId(), 10, 10); assertEquals("the size is wrong", 0, posts.size()); } /** * Tests getPosts method * @throws Exception to JUnit */ public void testGetPosts3() throws Exception { List posts = persistence.getPosts(thread3.getId(), 0, 10); assertEquals("the size is wrong", 10, posts.size()); checkPostList(thread3Posts, 0, posts, 0, 10); } /** * Tests getPosts method * @throws Exception to JUnit */ public void testGetPosts4() throws Exception { List posts = persistence.getPosts(thread3.getId(), 3, 5); assertEquals("the size is wrong", 5, posts.size()); checkPostList(thread3Posts, 3, posts, 0, 5); } /** * Tests getPosts method * @throws Exception to JUnit */ public void testGetPosts5() throws Exception { List posts = persistence.getPosts(thread3.getId(), 5, 10); assertEquals("the size is wrong", 5, posts.size()); checkPostList(thread3Posts, 5, posts, 0, 5); } /** * Checks whether the two Forum instances are same. * @param forum1 the expected forum * @param forum2 the forum to check */ private void checkForum(Forum forum1, Forum forum2) { assertEquals("wrong id", forum1.getId(), forum2.getId()); assertEquals("wrong Name", forum1.getName(), forum2.getName()); assertEquals("wrong Description", forum1.getDescription(), forum2.getDescription()); } /** * Checks whether the two Thread instances are same. * @param thread1 the expected thread * @param thread2 the thread to check */ private void checkThread(Thread thread1, Thread thread2) { assertEquals("wrong id", thread1.getId(), thread2.getId()); assertEquals("wrong forum id", thread1.getForumId(), thread2.getForumId()); assertEquals("wrong usre id", thread1.getUserProfileId(), thread2.getUserProfileId()); assertEquals("wrong usre title", thread1.getTitle(), thread2.getTitle()); } /** * Checks whether the two Post instances are same. * @param post1 the expected post * @param post2 the post to check */ private void checkPost(Post post1, Post post2) { assertEquals("wrong id", post1.getId(), post2.getId()); assertEquals("wrong thread id", post1.getThreadId(), post2.getThreadId()); assertEquals("wrong content", post1.getContent(), post2.getContent()); } /** * Checks whether the two lists are same. * @param posts1 the expected profile * @param posts2 the profile to check * @param offset1 the offset in post list 1. * @param offset2 the offset in post list 2. * @param count the count */ private void checkPostList(List posts1, int offset1, List posts2, int offset2, int count) { for (int i = 0; i < count; ++i) { Post post1 = (Post) posts1.get(offset1 + i); Post post2 = (Post) posts2.get(offset2 + i); checkPost(post1, post2); } } /** * Creates a new forum. * @param id the id * @return a new forum instance */ private Forum newForum(long id) { Forum forum = new Forum(); forum.setId(id); forum.setName("forum" + id); forum.setDescription("forum" + id + " description"); return forum; } /** * Creates a new thread. * @param id the id * @param forumId the forum id * @param userId the user id * @return a new thread instance */ private Thread newThread(long id, long forumId, long userId) { Thread thread = new Thread(); thread.setId(id); thread.setForumId(forumId); thread.setUserProfileId(userId); thread.setTitle("thread title" + id); return thread; } /** * Creates a new post. * @param id the id * @param threadId the thread id * @param userId the user id * @return a new post instance */ private Post newPost(long id, long threadId, long userId) { Post post = new Post(); post.setId(id); post.setThreadId(threadId); post.setUserProfileId(userId); post.setContent("post content" + id); return post; } }