/* * Copyright (c) JForum Team. All rights reserved. * * The software in this package is published under the terms of the LGPL * license a copy of which has been included with this distribution in the * license.txt file. * * The JForum Project * http://www.jforum.net */ package net.jforum.controllers; import static org.junit.Assert.*; import static org.mockito.Matchers.*; import static org.mockito.Mockito.*; import java.lang.reflect.Method; import java.util.ArrayList; import net.jforum.actions.helpers.Actions; import net.jforum.actions.helpers.PostFormOptions; import net.jforum.core.Role; import net.jforum.core.SecurityConstraint; import net.jforum.core.exceptions.ForumException; import net.jforum.entities.Group; import net.jforum.entities.Post; import net.jforum.entities.PrivateMessage; import net.jforum.entities.PrivateMessageType; import net.jforum.entities.User; import net.jforum.entities.UserSession; import net.jforum.repository.PrivateMessageRepository; import net.jforum.repository.UserRepository; import net.jforum.security.AuthenticatedRule; import net.jforum.security.PrivateMessageOwnerRule; import net.jforum.security.RoleManager; import net.jforum.services.PrivateMessageService; import net.jforum.util.SecurityConstants; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.mockito.InjectMocks; import org.mockito.Mock; import org.mockito.Spy; import org.mockito.runners.MockitoJUnitRunner; import br.com.caelum.vraptor.util.test.MockResult; /** * @author Rafael Steil, Jonatan Cloutier */ @RunWith(MockitoJUnitRunner.class) public class PrivateMessageControllerTestCase { @Mock private PrivateMessageRepository repository; @Mock private UserRepository userRepository; @Mock private PrivateMessageService service; @Spy private MockResult mockResult; @Mock private UserSession userSession; @InjectMocks private PrivateMessageController controller; @Mock private RoleManager roleManager; @Mock private TopicController mockTopicController; @Test public void review() { PrivateMessage pm = new PrivateMessage(); pm.setId(1); when(repository.get(1)).thenReturn(pm); controller.review(1); assertEquals(pm, mockResult.included("pm")); assertEquals(pm.asPost(), mockResult.included("post")); } @Test public void delete() { when(userSession.getUser()).thenReturn(new User()); controller.delete(1, 2, 3); verify(service).delete(new User(), 1, 2, 3); verify(mockResult).redirectTo(Actions.INBOX); } @Test public void readExpectSuccess() { PrivateMessage pm = new PrivateMessage(); User toUser = new User(); toUser.setId(1); User fromUser = new User(); fromUser.setId(3); pm.setToUser(toUser); pm.setFromUser(fromUser); when(repository.get(1)).thenReturn(pm); controller.read(1); assertEquals(pm, mockResult.included("pm")); assertEquals(new Post(), mockResult.included("post")); } @Test public void readStatusIsNewShouldMarkAsRead() { PrivateMessage pm = new PrivateMessage(); User toUser = new User(); toUser.setId(1); User fromUser = new User(); fromUser.setId(3); pm.setToUser(toUser); pm.setFromUser(fromUser); pm.setType(PrivateMessageType.NEW); when(repository.get(1)).thenReturn(pm); controller.read(1); Assert.assertEquals(PrivateMessageType.READ, pm.getType()); } @Test public void sent() { when(userSession.getUser()).thenReturn(new User()); ArrayList<PrivateMessage> privateMessages = new ArrayList<PrivateMessage>(); when(repository.getFromSentBox(new User())).thenReturn(privateMessages); controller.sent(); assertEquals(privateMessages, mockResult.included("privateMessages")); assertEquals(true, mockResult.included("sentbox")); } @Test public void sendSaveExpectSuccess() { when(userSession.getIp()).thenReturn("0.0.0.0"); when(userSession.getRoleManager()).thenReturn(roleManager); when(roleManager.roleExists(SecurityConstants.INTERACT_OTHER_GROUPS)).thenReturn(true); when(userRepository.get(1)).thenReturn(new User()); when(userSession.getUser()).thenReturn(new User()); controller.sendSave(new Post(), new PostFormOptions(), null, 1); verify(service).send(notNull(PrivateMessage.class)); verify(mockResult).redirectTo(Actions.INBOX); } @Test(expected = ForumException.class) public void sendSaveWithoutUserIdShouldTryInvalidUsernameExpectsException() { when(userRepository.getByUsername("invalid user")).thenReturn(null); controller.sendSave(null, null, "invalid user", 0); } @Test(expected = ForumException.class) public void sendSaveWithInvalidUserIdExpectsException() { when(userRepository.get(1)).thenReturn(null); controller.sendSave(null, null, null, 1); } @Test public void sendToCanInteractWithOtherGroups() { User recipient = new User(); when(userRepository.get(1)).thenReturn(recipient); when(userSession.getRoleManager()).thenReturn(roleManager); when(userSession.getUser()).thenReturn(new User()); when(roleManager.roleExists(SecurityConstants.INTERACT_OTHER_GROUPS)).thenReturn(true); when(mockResult.forwardTo(TopicController.class)).thenReturn(mockTopicController); controller.sendTo(1); verify(mockTopicController).add(0); assertEquals(recipient, mockResult.included("pmRecipient")); assertEquals(true, mockResult.included("isPrivateMessage")); assertEquals(false, mockResult.included("attachmentsEnabled")); assertEquals(recipient, mockResult.included("user")); assertEquals(new Post(), mockResult.included("post")); } @Test public void sendToCanotInteractWithOtherGroupsMatchingGroupFoundShouldFillPropertyBag() { Group g1 = new Group(); g1.setId(1); Group g2 = new Group(); g2.setId(2); User recipient = new User(); recipient.addGroup(g1); User currentUser = new User(); currentUser.addGroup(g2); currentUser.addGroup(g1); when(userRepository.get(1)).thenReturn(recipient); when(userSession.getRoleManager()).thenReturn(roleManager); when(roleManager.roleExists(SecurityConstants.INTERACT_OTHER_GROUPS)).thenReturn(false); when(userSession.getUser()).thenReturn(currentUser); when(roleManager.getCanOnlyContactModerators()).thenReturn(true); controller.sendTo(1); verify(mockResult).forwardTo("sendToDenied"); } @Test public void sendToCanotInteractWithOtherGroupsNoMatchingGroupFoundShouldNotFillPropertyBag() { Group g1 = new Group(); User recipient = new User(); recipient.addGroup(g1); Group g2 = new Group(); User currentUser = new User(); currentUser.addGroup(g2); when(userRepository.get(1)).thenReturn(recipient); when(userSession.getRoleManager()).thenReturn(roleManager); when(roleManager.roleExists(SecurityConstants.INTERACT_OTHER_GROUPS)).thenReturn(false); when(userSession.getUser()).thenReturn(currentUser); when(roleManager.getCanOnlyContactModerators()).thenReturn(true); controller.sendTo(1); verify(mockResult).forwardTo("sendToDenied"); } @Test public void findUserWithUsernameCanInteractWithOtherGroups() { ArrayList<User> users = new ArrayList<User>(); when(userSession.getRoleManager()).thenReturn(roleManager); when(roleManager.getCanOnlyContactModerators()).thenReturn(true); when(userRepository.findByUserName("an user")).thenReturn(users); controller.findUser("an user"); assertEquals(users, mockResult.included("users")); assertEquals("an user", mockResult.included("username")); } @Test public void findUserWithUsernameCannotInteractWithOtherGroups() { User user = new User(); ArrayList<User> users = new ArrayList<User>(); when(userSession.getRoleManager()).thenReturn(roleManager); when(roleManager.getCanOnlyContactModerators()).thenReturn(false); when(roleManager.roleExists("interact_other_groups")).thenReturn(false); when(userSession.getUser()).thenReturn(user); when(userRepository.findByUserName("an user", user.getGroups())).thenReturn(users); controller.findUser("an user"); assertEquals(users, mockResult.included("users")); assertEquals("an user", mockResult.included("username")); } @Test public void findUserWithoutUsername() { controller.findUser(null); assertEquals(null, mockResult.included("username")); } @Test public void send() { User user = new User(); user.setId(1); when(userSession.getUser()).thenReturn(user); when(mockResult.forwardTo(TopicController.class)).thenReturn(mockTopicController); controller.send(); verify(mockTopicController).add(0); assertEquals(new Post(), mockResult.included("post")); assertEquals(true, mockResult.included("isPrivateMessage")); assertEquals(false, mockResult.included("attachmentsEnabled")); assertEquals(user, mockResult.included("user")); } @Test public void inbox() { User user = new User(); user.setId(1); ArrayList<PrivateMessage> privateMessages = new ArrayList<PrivateMessage>(); when(userSession.getUser()).thenReturn(user); when(repository.getFromInbox(user)).thenReturn(privateMessages); controller.inbox(); assertEquals(true, mockResult.included("inbox")); assertEquals(privateMessages, mockResult.included("privateMessages")); } @Test public void quoteShouldHaveOwnerConstraint() throws Exception { Method method = controller.getClass().getMethod("quote", int.class); Assert.assertTrue(method.isAnnotationPresent(SecurityConstraint.class)); Assert.assertEquals(PrivateMessageOwnerRule.class, method.getAnnotation(SecurityConstraint.class).value()); } @Test public void replyShouldHaveOwnerConstraint() throws Exception { Method method = controller.getClass().getMethod("reply", int.class); Assert.assertTrue(method.isAnnotationPresent(SecurityConstraint.class)); Assert.assertEquals(PrivateMessageOwnerRule.class, method.getAnnotation(SecurityConstraint.class).value()); } @Test public void readShouldHaveOwnerConstraint() throws Exception { Method method = controller.getClass().getMethod("read", int.class); Assert.assertTrue(method.isAnnotationPresent(SecurityConstraint.class)); Assert.assertEquals(PrivateMessageOwnerRule.class, method.getAnnotation(SecurityConstraint.class).value()); } @Test public void reviewShouldHaveOwnerConstraint() throws Exception { Method method = controller.getClass().getMethod("review", int.class); Assert.assertTrue(method.isAnnotationPresent(SecurityConstraint.class)); Assert.assertEquals(PrivateMessageOwnerRule.class, method.getAnnotation(SecurityConstraint.class).value()); } @Test public void shouldHaveAuthenticatedConstraintAndDisplayLogin() throws Exception { Assert.assertTrue(controller.getClass().isAnnotationPresent(SecurityConstraint.class)); SecurityConstraint annotation = controller.getClass().getAnnotation(SecurityConstraint.class); Role[] roles = annotation.multiRoles(); boolean found = false; for (Role role : roles) { if (role.value().equals(AuthenticatedRule.class)) { found = true; Assert.assertTrue(role.displayLogin()); } } Assert.assertTrue(found); } }