@Override public void sendLocalMessage(Message message) { sendMessage(MgnlContext.getUser().getName(), message); }
private void sendMessageSentEvent(String userName, Message message) { final List<MessageListener> userListener = new LinkedList<MessageListener>(listeners.get(userName)); for (final MessageListener listener : userListener) { try { listener.messageSent(cloneMessage(message)); } catch (CloneNotSupportedException e) { logger.warn("Exception caught when dispatching event: " + e.getMessage(), e); } } }
@Override public void clearMessage(final String userName, final String messageId) { final Message message = messageStore.findMessageById(userName, messageId); if (message != null && !message.isCleared()) { message.setCleared(true); messageStore.saveMessage(userName, message); sendMessageClearedEvent(userName, message); } }
@Test public void testDoesNotInvokeListenerAfterUnregistration() throws RepositoryException { // GIVEN MessagesManager.MessageListener listener1 = mock(MessagesManager.MessageListener.class); messagesManager.registerMessagesListener("bob", listener1); MessagesManager.MessageListener listener2 = mock(MessagesManager.MessageListener.class); messagesManager.registerMessagesListener("bob", listener2); Message message = new Message(); message.setType(MessageType.ERROR); message.setSubject("subject"); message.setMessage("message"); // WHEN messagesManager.sendMessage("bob", message); verify(listener1, times(1)).messageSent(any(Message.class)); verify(listener2, times(1)).messageSent(any(Message.class)); // WHEN messagesManager.unregisterMessagesListener("bob", listener1); messagesManager.sendMessage("bob", message); // THEN verify(listener1, times(1)).messageSent(any(Message.class)); // still one, not called verify(listener2, times(2)).messageSent(any(Message.class)); } }
@Test public void testDoNoClearAlreadyClearedMessage() throws RepositoryException { // GIVEN MessagesManager.MessageListener listener = mock(MessagesManager.MessageListener.class); messagesManager.registerMessagesListener("bob", listener); Message message = new Message(); message.setType(MessageType.ERROR); message.setSubject("subject"); message.setMessage("message"); message.setCleared(true); messagesManager.sendMessage("bob", message); // WHEN // this happens when clicking on a message row in pulse messagesManager.clearMessage("bob", message.getId()); // THEN verify(listener, never()).messageCleared(any(Message.class)); }
@Test public void testBroadcastMessage() throws RepositoryException { // GIVEN MessagesManager.MessageListener listenerA = mock(MessagesManager.MessageListener.class); messagesManager.registerMessagesListener("alice", listenerA); MessagesManager.MessageListener listenerB = mock(MessagesManager.MessageListener.class); messagesManager.registerMessagesListener("bob", listenerB); MessagesManager.MessageListener listenerC = mock(MessagesManager.MessageListener.class); messagesManager.registerMessagesListener("charlie", listenerC); Message message = new Message(); message.setType(MessageType.ERROR); message.setSubject("subject"); message.setMessage("message"); // WHEN messagesManager.broadcastMessage(message); // THEN assertNull(message.getId()); verify(listenerA).messageSent(any(Message.class)); verify(listenerB).messageSent(any(Message.class)); verify(listenerC, never()).messageSent(any(Message.class)); assertTrue(session.nodeExists("/alice/0")); assertTrue(session.nodeExists("/bob/0")); assertFalse(session.nodeExists("/charlie")); assertTrue(session.getNode("/alice").getPrimaryNodeType().getName().equals(NodeTypes.Content.NAME)); assertTrue(session.getNode("/alice/0").getPrimaryNodeType().getName().equals(MessageStore.MESSAGE_NODE_TYPE)); assertEquals(1, messagesManager.getMessagesForUser("alice").size()); assertEquals(1, messagesManager.getMessagesForUser("bob").size()); assertEquals(0, messagesManager.getMessagesForUser("charlie").size()); }
@Test public void testSendMessage() throws RepositoryException { // GIVEN MessagesManager.MessageListener listenerA = mock(MessagesManager.MessageListener.class); messagesManager.registerMessagesListener("alice", listenerA); MessagesManager.MessageListener listenerB = mock(MessagesManager.MessageListener.class); messagesManager.registerMessagesListener("bob", listenerB); MessagesManager.MessageListener listenerC = mock(MessagesManager.MessageListener.class); messagesManager.registerMessagesListener("charlie", listenerC); Message message = new Message(); message.setType(MessageType.ERROR); message.setSubject("subject"); message.setMessage("message"); // WHEN messagesManager.sendMessage("bob", message); // THEN assertNotNull(message.getId()); verify(listenerA, never()).messageSent(any(Message.class)); verify(listenerB).messageSent(any(Message.class)); verify(listenerC, never()).messageSent(any(Message.class)); assertFalse(session.nodeExists("/alice")); assertTrue(session.nodeExists("/bob/0")); assertFalse(session.nodeExists("/charlie")); assertThat(session.getNode("/bob").getPrimaryNodeType().getName(), equalTo(NodeTypes.Content.NAME)); assertThat(session.getNode("/bob/0").getPrimaryNodeType().getName(), equalTo(MessageStore.MESSAGE_NODE_TYPE)); }
@Test public void testSendGroupMessage() throws RepositoryException { // GIVEN MessagesManager.MessageListener listenerA = mock(MessagesManager.MessageListener.class); messagesManager.registerMessagesListener("alice", listenerA); MessagesManager.MessageListener listenerB = mock(MessagesManager.MessageListener.class); messagesManager.registerMessagesListener("bob", listenerB); final String testGroup = "bobOnlyGroup"; when(userManager.getUsersWithGroup(testGroup, true)).thenReturn(Arrays.asList(new String[]{"bob"})); Message message = new Message(); message.setType(MessageType.ERROR); message.setSubject("subject"); message.setMessage("message"); // WHEN messagesManager.sendGroupMessage(testGroup, message); // THEN assertNull(message.getId()); verify(listenerA, never()).messageSent(any(Message.class)); verify(listenerB).messageSent(any(Message.class)); assertFalse("Alice is not in that group, so she should not have received any message", session.nodeExists("/alice")); assertTrue("Bob is in that group, so he should have received a message", session.nodeExists("/bob/0")); }
@Test public void testSendLocalMessage() throws RepositoryException { // GIVEN final User me = createMockUser("me"); ((MockWebContext) MgnlContext.getInstance()).setUser(me); MessagesManager.MessageListener listenerA = mock(MessagesManager.MessageListener.class); messagesManager.registerMessagesListener(me.getName(), listenerA); Message message = new Message(); message.setType(MessageType.INFO); message.setSubject("subject"); message.setMessage("message"); // WHEN messagesManager.sendLocalMessage(message); // THEN assertNotNull("Local messages have id", message.getId()); verify(listenerA).messageSent(any(Message.class)); assertTrue("Local message are persisted.", session.nodeExists("/me")); }
@Override @Before public void setUp() throws Exception { super.setUp(); session = SessionTestUtil.createSession("messages", "/"); MockUtil.initMockContext(); MockUtil.setSystemContextSessionAndHierarchyManager(session); MockUtil.getMockContext().setUser(createMockUser("system")); MessageStore messageStore = new MessageStore(); alice = createMockUser("alice"); bob = createMockUser("bob"); ArrayList<User> users = new ArrayList<User>(); users.add(alice); users.add(bob); when(userManager.getAllUsers()).thenReturn(users); SecuritySupport securitySupport = mock(SecuritySupport.class); when(securitySupport.getUserManager()).thenReturn(userManager); messagesManager = new MessagesManagerImpl(Providers.of(securitySupport), messageStore); }
@Test public void testSendTransitiveGroupMessage() throws RepositoryException { // GIVEN MessagesManager.MessageListener listenerB = mock(MessagesManager.MessageListener.class); messagesManager.registerMessagesListener("bob", listenerB); final String transitiveGroup = "group2"; // bob is in the transitive but not in the direct group ... however, // since we use only UserManager.getUsersWithGroup(String groupName, boolean includeUsersFromTransitiveGroups) in MessagesManagerImpl, there is not so much to mock here // Testing returning the correct users (including users from transitive groups) is tested in MgnlUserManagerRepositoryTest now. // Hence, this test here might be removed. when(userManager.getUsersWithGroup(transitiveGroup, true)).thenReturn(Arrays.asList(new String[]{"bob"})); Message message = new Message(); message.setType(MessageType.ERROR); message.setSubject("subject"); message.setMessage("message"); // WHEN messagesManager.sendGroupMessage(transitiveGroup, message); // THEN assertNull(message.getId()); verify(listenerB).messageSent(any(Message.class)); assertTrue("Bob is in that group, so he should have received a message", session.nodeExists("/bob/0")); }
@Override public void sendGroupMessage(final String groupName, final Message message) { Collection<String> userNames = securitySupportProvider.get().getUserManager().getUsersWithGroup(groupName, true); for (String userName : userNames) { sendMessage(userName, message); } // Reset it to null simply to avoid assumptions about the id in calling code message.setId(null); }
@Override public void broadcastMessage(Message message) { Collection<User> users; try { users = securitySupportProvider.get().getUserManager().getAllUsers(); } catch (UnsupportedOperationException e) { logger.error("Unable to broadcast message because UserManager does not support enumerating its users", e); return; } for (User user : users) { sendMessage(user.getName(), message); } // Reset it to null simply to avoid assumptions about the id in calling code message.setId(null); }