package tests; import java.text.ParseException; import models.Answer; import models.Question; import models.SysInfo; import models.Tag; import models.User; import models.database.IQuestionDatabase; import models.database.IUserDatabase; import models.database.HotDatabase.HotQuestionDatabase; import models.database.HotDatabase.HotTagDatabase; import models.database.HotDatabase.HotUserDatabase; import models.helpers.ICleanup; import models.helpers.Tools; import org.junit.Before; import org.junit.Test; public class UserTest extends MockedUnitTest { private IQuestionDatabase questionDB; @Before public void setUp() { this.questionDB = new HotQuestionDatabase(new HotTagDatabase()); } @Test public void shouldCreateUser() { User user = new User("Jack"); assertTrue(user != null); } @Test public void shouldBeCalledJack() { User user = new User("Jack"); assertEquals(user.getName(), "Jack"); } @Test public void checkUsernameAvailable() { IUserDatabase userDB = new HotUserDatabase(); assertTrue(userDB.isAvailable("JaneSmith")); userDB.register("JaneSmith", "janesmith", "jane@smith.com"); assertFalse(userDB.isAvailable("JaneSmith")); assertFalse(userDB.isAvailable("janesmith")); assertFalse(userDB.isAvailable("jAnEsMiTh")); } @Test public void shouldCheckeMailValidation() { assertTrue(Tools.checkEmail("john@gmx.com")); assertTrue(Tools.checkEmail("john.smith@students.unibe.ch")); assertFalse(Tools.checkEmail("john@gmx.c")); assertFalse(Tools.checkEmail("john@info.museum")); assertFalse(Tools.checkEmail("john@...com")); } @Test public void checkMailAssertion() { User user = new User("Bill"); user.setEmail("bill@aol.com"); assertEquals(user.getEmail(), "bill@aol.com"); } @Test public void checkPassw() { User user = new User("Bill", "bill", "bill@example.net", null); assertTrue(user.checkPW("bill")); assertEquals(Tools.encrypt("bill"), user.getSHA1Password()); user.setSHA1Password("bill2"); assertFalse(user.checkPW("bill")); } @Test public void shouldEditProfileCorrectly() throws ParseException { sysInfo.year(2010).month(12).day(3); User user = new User("Jack"); assertEquals(user.getAge(), 0); assertNull(user.getBiographyHTML()); user.setDateOfBirth("14.9.1987"); user.setBiography("I lived"); user.setEmail("test@test.tt"); user.setEmployer("TestInc"); user.setFullname("Test Tester"); user.setProfession("tester"); user.setWebsite("http://www.test.ch"); assertEquals(user.getAge(), 23); assertEquals(user.getDateOfBirth(), "14.09.1987"); assertEquals(user.getBiography(), "I lived"); assertEquals(user.getBiographyHTML(), "<p>I lived</p>"); assertEquals(user.getEmail(), "test@test.tt"); assertEquals(user.getEmployer(), "TestInc"); assertEquals(user.getFullname(), "Test Tester"); assertEquals(user.getProfession(), "tester"); assertEquals(user.getWebsite(), "http://www.test.ch"); } @Test public void checkForSpammer() { User user = new User("Spammer"); assertFalse(user.isBlocked()); assertEquals(user.getStatusMessage(), ""); assertTrue(user.howManyItemsPerHour() == 0); new Question(user, "Why did the chicken cross the road?"); assertTrue(user.howManyItemsPerHour() == 1); new Question(user, "Does anybody know?"); assertFalse(user.howManyItemsPerHour() == 1); for (int i = 0; i < 57; i++) { new Question(user, "This is my " + i + ". question"); } assertTrue(!user.isSpammer()); assertTrue(user.howManyItemsPerHour() == 59); assertTrue(!user.isCheating()); new Question(user, "My last possible Post"); assertTrue(user.isSpammer()); assertTrue(user.isCheating()); assertEquals(user.getStatusMessage(), "User is a Spammer"); assertTrue(user.isBlocked()); } @Test public void checkForCheater() { User user = new User("TheSupported"); User user2 = new User("Cheater"); assertFalse(user.isBlocked()); assertFalse(user2.isBlocked()); assertFalse(user2.isMaybeCheater()); assertEquals(user.getStatusMessage(), ""); assertEquals(user2.getStatusMessage(), ""); for (int i = 0; i < 5; i++) { new Question(user, "This is my " + i + ". question").voteUp(user2); } SysInfo.setTestMode(false); assertTrue(user2.isMaybeCheater()); assertTrue(user2.isCheating()); assertTrue(user2.isBlocked()); SysInfo.setTestMode(true); assertFalse(user2.isCheating()); SysInfo.setTestMode(false); assertTrue(user2.isCheating()); assertEquals(user2.getStatusMessage(), "User voted up somebody"); assertFalse(user.isMaybeCheater()); assertFalse(user.isCheating()); assertFalse(user.isBlocked()); assertEquals(user.getStatusMessage(), ""); } @Test public void shouldAllowVotingOften() { User voter = new User("Voter"); User user1 = new User("User1"); User user2 = new User("User2"); for (int i = 0; i < 5; i++) { new Question(user1, "Q1-" + i).voteUp(voter); new Question(user2, "Q2-" + i).voteUp(voter); } assertFalse(voter.isMaybeCheater()); new Question(user1, "Q1-last").voteUp(voter); assertTrue(voter.isMaybeCheater()); } @Test public void shouldNotBeAbleToEditForeignPosts() { User user1 = new User("Jack"); User user2 = new User("John"); User user3 = new User("Geronimo"); user1.setModerator(true, null); Question q = new Question(user2, "Can you edit this post?"); /* moderator should be able to edit the question */ assertTrue(user1.canEdit(q)); /* owner should be able to edit the question */ assertTrue(user2.canEdit(q)); /* blocked owner should not be able to edit the question */ user2.block("for testing"); assertFalse(user2.canEdit(q)); /* user that is neither a moderator nor the owner of the question should NOT be able to edit the question */ assertFalse(user3.canEdit(q)); } @Test public void shouldHaveOneQuestion() { User user = new User("Jack"); Question q = new Question(user, "Why?"); assertEquals(1, user.getQuestions().size()); q.delete(); } @Test public void shouldHaveNoQuestion() { User user = new User("Jack"); Question q = new Question(user, "Why?"); q.delete(); assertEquals(0, user.getQuestions().size()); } @Test public void shouldHaveOneAnswer() { User user = new User("Jack"); Question q = new Question(user, "Why?"); q.answer(user, "Because"); assertEquals(1, user.getAnswers().size()); } @Test public void shouldHaveNoAnswer() { User user = new User("Jack"); Question q = new Question(user, "Why?"); q.answer(user, "Because"); q.answers().get(0).delete(); assertEquals(0, user.getAnswers().size()); } @Test public void shouldHaveOneBestAnswer() { User user = new User("Jack"); Question q = new Question(user, "Why?"); q.answer(user, "Because"); q.setBestAnswer(q.answers().get(0)); assertEquals(1, user.bestAnswers().size()); } @Test public void shouldHaveNoBestAnswer() { User user = new User("Jack"); Question q = new Question(user, "Why?"); q.answer(user, "Because"); q.setBestAnswer(q.answers().get(0)); q.answers().get(0).delete(); assertEquals(0, user.bestAnswers().size()); } @Test public void testModerator() { User user = new User("Jack"); assertFalse(user.isModerator()); user.setModerator(true, null); assertTrue(user.isModerator()); } @Test public void testBlock() { User user = new User("Jack"); assertFalse(user.isBlocked()); assertEquals(user.getStatusMessage(), ""); user.block("offending comments"); assertTrue(user.isBlocked()); assertEquals(user.getStatusMessage(), "offending comments"); user.unblock(); assertFalse(user.isBlocked()); assertEquals(user.getStatusMessage(), ""); } @Test public void shouldHaveRecentEntries() { sysInfo.year(2000).month(6).day(6).hour(12).minute(0).second(0); User user = new User("Jack"); assertEquals(0, user.getRecentQuestions().size()); assertEquals(0, user.getRecentAnswers().size()); assertEquals(0, user.getRecentComments().size()); Question question = new Question(user, "Question"); Answer answer = question.answer(user, "Answer"); question.comment(user, "Comment"); assertEquals(1, user.getRecentQuestions().size()); assertEquals(1, user.getRecentAnswers().size()); assertEquals(1, user.getRecentComments().size()); for (int i = 0; i < 4; i++) { sysInfo.second(i); question.answer(user, "Answer " + i); } assertEquals(3, user.getRecentAnswers().size()); assertFalse(user.getRecentAnswers().contains(answer)); } @Test public void shouldHaveOneHighRatedAnswer() { User user = new User("Jack"); Question q = this.questionDB.add(user, "Why?"); q.answer(user, "Because"); assertEquals(0, user.highRatedAnswers().size()); assertTrue(this.questionDB.countHighRatedAnswers() == 0); User A = new User("A"); User B = new User("B"); User C = new User("C"); User D = new User("D"); User E = new User("E"); q.answers().get(0).voteUp(A); q.answers().get(0).voteUp(B); q.answers().get(0).voteUp(C); q.answers().get(0).voteUp(D); q.answers().get(0).voteUp(E); assertEquals(1, user.highRatedAnswers().size()); assertTrue(this.questionDB.countHighRatedAnswers() > 0); A.delete(); B.delete(); C.delete(); D.delete(); E.delete(); assertEquals(0, user.highRatedAnswers().size()); } @Test public void shouldSuggestQuestion() { User user3 = new User("User3"); User user4 = new User("User4"); User user5 = new User("User5"); Question m = this.questionDB.add(user3, "Why?"); Question n = this.questionDB.add(user4, "Where?"); m.setTagString("demo"); n.setTagString("demo demo2"); m.answer(user3, "Because"); m.answer(user4, "No idea"); n.answer(user5, "Therefore"); assertEquals(1, this.questionDB.suggestQuestions(user5).size()); assertEquals(m, this.questionDB.suggestQuestions(user5).get(0)); n.answer(user5, "and then some"); assertEquals(1, this.questionDB.suggestQuestions(user5).size()); assertEquals(m, this.questionDB.suggestQuestions(user5).get(0)); } @Test public void shouldSuggestThreeQuestions() { User user3 = new User("User3"); User user4 = new User("User4"); User user5 = new User("User5"); Question m = this.questionDB.add(user3, "Why?"); Question n = this.questionDB.add(user4, "Where?"); Question o = this.questionDB.add(user3, "Who?"); Question p = this.questionDB.add(user4, "How old?"); m.setTagString("demo"); n.setTagString("demo demo2"); o.setTagString("demo demo3 demo4"); p.setTagString("demo demo3 demo4 demo5"); m.answer(user3, "Because"); m.answer(user4, "No idea"); n.answer(user5, "Therefore"); assertEquals(3, this.questionDB.suggestQuestions(user5).size()); assertEquals(m, this.questionDB.suggestQuestions(user5).get(0)); } @Test public void shouldSuggestSixQuestionsMax() { User user3 = new User("User3"); User user5 = new User("User5"); for (int i = 0; i < 10; i++) { Question q = this.questionDB.add(user3, "Hard question " + i); q.setTagString("demo"); } Question q = this.questionDB.add(user3, "Simple question"); q.setTagString("demo"); q.answer(user5, "Simple!"); assertEquals(6, this.questionDB.suggestQuestions(user5).size()); } @Test public void shouldNotSuggestSameQuestionTwice() { User user5 = new User("User5"); Question q = this.questionDB.add(null, "suggest me!"); q.setTagString("demo"); Question r = this.questionDB.add(null, "answer me!"); r.setTagString("demo"); r.answer(user5, "ok"); Question s = this.questionDB.add(null, "answer me, too!"); s.setTagString("demo"); s.answer(user5, "ok"); assertEquals(1, this.questionDB.suggestQuestions(user5).size()); assertEquals(q, this.questionDB.suggestQuestions(user5).get(0)); } @Test public void shouldNotSuggestOldQuestions() { sysInfo.year(2000).month(6).day(6).hour(12).minute(0).second(0); User user5 = new User("User5"); Question q = this.questionDB.add(null, "suggest me!"); q.setTagString("demo"); Question r = this.questionDB.add(null, "answer me!"); r.setTagString("demo"); r.answer(user5, "ok"); assertEquals(1, this.questionDB.suggestQuestions(user5).size()); sysInfo.year(2001); assertEquals(0, this.questionDB.suggestQuestions(user5).size()); } @Test public void shouldSuggestQuestionsFromBestAnswersFirst() { User user3 = new User("User3"); User user4 = new User("User4"); User user5 = new User("User5"); Question m = this.questionDB.add(user3, "Why?"); Question n = this.questionDB.add(user4, "Where?"); Question o = this.questionDB.add(user3, "Who?"); Question p = this.questionDB.add(user4, "How old?"); m.setTagString("demo"); n.setTagString("demo demo2"); o.setTagString("demo9 demo8"); p.setTagString("demo9 demo8"); m.answer(user3, "Because"); m.answer(user4, "No idea"); n.answer(user5, "Therefore"); o.answer(user5, "No"); o.setBestAnswer(user5.getAnswers().get(1)); assertEquals(2, this.questionDB.suggestQuestions(user5).size()); assertEquals(p, this.questionDB.suggestQuestions(user5).get(0)); assertEquals(m, this.questionDB.suggestQuestions(user5).get(1)); } @Test public void shouldSuggestQuestionsSortedByRatingOfAnswers() { User user3 = new User("User3"); User user4 = new User("User4"); User user5 = new User("User5"); Question m = this.questionDB.add(user3, "Why?"); Question n = this.questionDB.add(user4, "Where?"); Question o = this.questionDB.add(user3, "Who?"); Question p = this.questionDB.add(user4, "How old?"); Question q = this.questionDB.add(user3, "So?"); Question r = this.questionDB.add(user4, "For ho long?"); m.setTagString("demo"); n.setTagString("demo demo2"); o.setTagString("demo9 demo8"); p.setTagString("demo9 demo8"); q.setTagString("demo demo2 demo10"); r.setTagString("tag"); m.answer(user3, "Because"); m.answer(user4, "No idea"); n.answer(user5, "Therefore"); o.answer(user5, "No"); user5.getAnswers().get(1).voteUp(user3); user5.getAnswers().get(1).voteUp(user4); assertEquals(3, this.questionDB.suggestQuestions(user5).size()); assertEquals(q, this.questionDB.suggestQuestions(user5).get(0)); assertEquals(m, this.questionDB.suggestQuestions(user5).get(1)); assertEquals(p, this.questionDB.suggestQuestions(user5).get(2)); } @Test public void shouldNotSuggestQuestionsFromBadAnswers() { User user6 = new User("User6"); User user7 = new User("User7"); User user8 = new User("User8"); Question m = this.questionDB.add(user6, "Why?"); Question n = this.questionDB.add(user7, "Where?"); Question o = this.questionDB.add(user6, "Who?"); Question p = this.questionDB.add(user7, "How old?"); m.answer(user6, "Because"); m.answer(user7, "No idea"); p.answer(user8, "Therefore"); user8.getAnswers().get(0).voteDown(user6); m.setTagString("demo"); n.setTagString("demo demo2"); o.setTagString("demo demo3 demo4"); p.setTagString("demo demo3 demo4 demo5"); assertEquals(0, this.questionDB.suggestQuestions(user8).size()); } @Test public void shouldNotSuggestOwnQuestions() { User user = new User("Jack"); User user2 = new User("John"); Question q = this.questionDB.add(user, "Why?"); Question f = this.questionDB.add(user2, "Where?"); q.setTagString("demo"); f.setTagString("demo"); q.answer(user2, "Because"); assertEquals(0, this.questionDB.suggestQuestions(user2).size()); } @Test public void shouldNotSuggestQuestionsWithBestAnswer() { User james = new User("James"); User john = new User("John"); User kate = new User("Kate"); Question k = this.questionDB.add(james, "Why?"); Question l = this.questionDB.add(john, "Where?"); k.setTagString("demo"); l.setTagString("demo"); k.answer(james, "Because"); k.setBestAnswer(k.answer(john, "No idea")); l.answer(kate, "Therefore"); assertEquals(0, this.questionDB.suggestQuestions(kate).size()); } @Test public void shouldNotSuggestQuestionsWithManyAnswers() { User user3 = new User("User3"); User user5 = new User("User5"); Question p = this.questionDB.add(user3, "Hard question"); p.setTagString("demo"); Question q = this.questionDB.add(user3, "Simple question"); q.setTagString("demo"); q.answer(user5, "Simple!"); assertEquals(1, this.questionDB.suggestQuestions(user5).size()); for (int i = 0; i < 9; i++) { p.answer(null, "anonymous genious!"); } assertEquals(1, this.questionDB.suggestQuestions(user5).size()); p.answer(null, "yet another anonymous genious!"); assertEquals(0, this.questionDB.suggestQuestions(user5).size()); } @Test public void shouldHaveDebugFriendly_toString() { User james = new User("James"); Question question = new Question(james, "Why?"); Answer answer = question.answer(james, "No idea"); Tag tag = new Tag("tag", null); assertEquals(james.toString(), "U[James]"); assertEquals(question.toString(), "Question(Why?)"); assertEquals(answer.toString(), "Answer(No idea)"); assertEquals(tag.toString(), "Tag(tag)"); } @Test public void testPostAndSearchDelay() { sysInfo.year(2010).month(1).day(1).hour(1).minute(1).second(0); User james = new User("James"); assertTrue(james.canPost()); assertTrue(james.canSearchFor("search 1")); james.setLastPostTime(sysInfo.now()); assertFalse(james.canPost()); sysInfo.second(29); assertFalse(james.canPost()); sysInfo.second(30); assertTrue(james.canPost()); assertTrue(james.canPost()); james.block("You are blocked for making a good Test coverage"); assertFalse(james.canPost()); james.unblock(); assertTrue(james.canPost()); sysInfo.year(2010).month(1).day(1).hour(1).minute(1).second(0); james.setLastSearch("search 1"); assertFalse(james.canSearchFor("search 2")); sysInfo.second(14); assertFalse(james.canSearchFor("search 2")); sysInfo.second(15); assertTrue(james.canSearchFor("search 2")); } @Test public void testTimeToSearchAndPost() { sysInfo.year(2010).month(1).day(1).hour(1).minute(1).second(0); User james = new User("James"); james.setLastSearch("search 1"); assertEquals(james.timeToSearch(), 15); sysInfo.second(14); assertEquals(james.timeToSearch(), 1); assertFalse(james.canSearchFor("search 2")); assertTrue(james.canSearchFor("search 1")); sysInfo.second(15); assertEquals(james.timeToSearch(), 0); assertTrue(james.canSearchFor("search 2")); assertTrue(james.canSearchFor("search 1")); sysInfo.year(2010).month(1).day(1).hour(1).minute(1).second(0); james.setLastPostTime(sysInfo.now()); assertEquals(james.timeToPost(), 30); sysInfo.second(29); assertEquals(james.timeToPost(), 1); assertFalse(james.canPost()); sysInfo.second(30); assertEquals(james.timeToPost(), 0); assertTrue(james.canPost()); } @Test public void testTestMode() { sysInfo.year(2010).month(1).day(1).hour(1).minute(1).second(0); User james = new User("James"); sysInfo.setTestMode(false); assertFalse(sysInfo.isInTestMode()); james.setLastPostTime(sysInfo.now()); james.setLastSearch("search 1"); assertFalse(james.canSearchFor("search 2")); assertFalse(james.canPost()); sysInfo.setTestMode(false); assertEquals(sysInfo.isInTestMode(), false); sysInfo.setTestMode(true); assertEquals(sysInfo.isInTestMode(), true); assertTrue(sysInfo.isInTestMode()); sysInfo.isInTestMode(); james.setLastPostTime(sysInfo.now()); james.setLastSearch("search 3"); assertTrue(james.canSearchFor("search 4")); assertTrue(james.canPost()); } @Test public void shouldNotWatchAnything() { User user = new User("Jack"); assertEquals(0, this.questionDB.getWatchList(user).size()); } @Test public void shouldMakeCoberturaHappy() { // this one's tricky, as Cobertura complains in an obscure way about the // bridge function User.cleanUp(java.lang.Object) not being called; see // http://sourceforge.net/tracker/?func=detail&atid=720015&aid=2015158&group_id=130558 ICleanup user = new User("Jimmy"); user.cleanUp(new Question(null, "question")); } }