package org.buddycloud.channelserver.channel; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import static org.mockito.Mockito.never; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import java.util.ArrayList; import java.util.List; import org.buddycloud.channelserver.Configuration; import org.buddycloud.channelserver.channel.node.configuration.field.Ephemeral; import org.buddycloud.channelserver.db.NodeStore; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.junit.After; import org.junit.Before; import org.junit.Ignore; import org.junit.Test; import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; import org.xmpp.packet.JID; public class ChannelManagerImplTest { private static final String TEST_DOMAIN = "domain.com"; private static final String TEST_TOPICS_DOMAIN = "topics.domain.com"; @Mock NodeStore nodeStore; String user1 = "/user/user@" + TEST_DOMAIN + "/posts"; String user2 = "/user/user@server2.com/posts"; String user3 = "/user/user@topics.server3.com/posts"; String user4 = "/user/user@" + TEST_TOPICS_DOMAIN + "/status"; String user5 = "/user/user@server1.com/meta"; /** * Class under test */ ChannelManagerImpl channelManager; @Before public void setUp() throws Exception { MockitoAnnotations.initMocks(this); channelManager = new ChannelManagerImpl(nodeStore); // This is used loads Configuration.getInstance().putProperty(Configuration.CONFIGURATION_SERVER_DOMAIN, TEST_DOMAIN); Configuration.getInstance().putProperty(Configuration.CONFIGURATION_SERVER_TOPICS_DOMAIN, TEST_TOPICS_DOMAIN); Configuration.getInstance().remove(Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER); } @After public void tearDown() throws Exception { channelManager = null; } @Test @Ignore("Until we can so something about the millisecond matching") public void testCreatePersonalChannel() throws Exception { JID channelJID = new JID("testchannel@domain.com"); channelManager.createPersonalChannel(channelJID); verify(nodeStore).createNode(channelJID, Conf.getPostChannelNodename(channelJID), Conf.getDefaultPostChannelConf(channelJID)); verify(nodeStore).createNode(channelJID, Conf.getStatusChannelNodename(channelJID), Conf.getDefaultStatusChannelConf(channelJID)); verify(nodeStore).createNode(channelJID, Conf.getGeoPreviousChannelNodename(channelJID), Conf.getDefaultGeoPreviousChannelConf(channelJID)); verify(nodeStore).createNode(channelJID, Conf.getGeoCurrentChannelNodename(channelJID), Conf.getDefaultGeoCurrentChannelConf(channelJID)); verify(nodeStore).createNode(channelJID, Conf.getGeoNextChannelNodename(channelJID), Conf.getDefaultGeoNextChannelConf(channelJID)); } @Test(expected = IllegalArgumentException.class) public void testCreatePersonalChannelFailsForRemoteUser() throws Exception { JID channelJID = new JID("testchannel@otherdomain.com"); channelManager.createPersonalChannel(channelJID); } @Test public void testCreatePersonalWorksForExternallyValidatedDomain() throws Exception { Configuration.getInstance().putProperty(Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString()); JID channelJID = new JID("testchannel@otherdomain.com"); channelManager.createPersonalChannel(channelJID); } @Test @Ignore("Until we can so something about the millisecond matching") public void testCreatePersonalChannelSomeNodesExist() throws Exception { JID channelJID = new JID("testchannel@domain.com"); when(nodeStore.nodeExists(Conf.getPostChannelNodename(channelJID))).thenReturn(true); channelManager.createPersonalChannel(new JID("testchannel@domain.com")); verify(nodeStore, never()).createNode(channelJID, Conf.getPostChannelNodename(channelJID), Conf.getDefaultPostChannelConf(channelJID)); verify(nodeStore).createNode(channelJID, Conf.getStatusChannelNodename(channelJID), Conf.getDefaultStatusChannelConf(channelJID)); verify(nodeStore).createNode(channelJID, Conf.getGeoPreviousChannelNodename(channelJID), Conf.getDefaultGeoPreviousChannelConf(channelJID)); verify(nodeStore).createNode(channelJID, Conf.getGeoCurrentChannelNodename(channelJID), Conf.getDefaultGeoCurrentChannelConf(channelJID)); verify(nodeStore).createNode(channelJID, Conf.getGeoNextChannelNodename(channelJID), Conf.getDefaultGeoNextChannelConf(channelJID)); } @Test public void testIsLocalNodeSuccess() throws Exception { assertTrue(Configuration.getInstance().isLocalNode("/user/test@domain.com/posts")); } @Test public void testIsLocalNodeFailure() throws Exception { assertFalse(Configuration.getInstance().isLocalNode("/user/test@otherdomain.com/posts")); } @Test(expected = IllegalArgumentException.class) public void testIsLocalNodeWithInvalidNodeThrowsException() throws Exception { Configuration.getInstance().isLocalNode("somerandomnodeid"); } @Test public void testIsLocalJidForLocaJid() throws Exception { assertTrue(Configuration.getInstance().isLocalJID(new JID("user@" + TEST_DOMAIN))); } @Test public void testIsLocalJidForNonLocaJid() throws Exception { assertFalse(Configuration.getInstance().isLocalJID(new JID("user@server1.com"))); } @Test public void testDeleteRemoteDataDeletesRemoteData() throws Exception { List<String> remoteNodes = new ArrayList<String>(); remoteNodes.add(user2); remoteNodes.add(user3); remoteNodes.add(user5); when(nodeStore.getRemoteNodesList()).thenReturn(remoteNodes); channelManager.deleteRemoteData(); verify(nodeStore).getRemoteNodesList(); verify(nodeStore, Mockito.times(3)).purgeNodeItems(Mockito.anyString()); } @Test public void testGetNodeDefaultAffiliationForNodeWithConf() throws Exception { when(nodeStore.getNodeConfValue(user1, Conf.DEFAULT_AFFILIATION)).thenReturn("moderator"); Affiliations affiliation = channelManager.getDefaultNodeAffiliation(user1); assertEquals("Incorrect default affiliation", Affiliations.moderator, affiliation); } @Test public void testGetNodeDefaultAffiliationForNodeWithoutConf() throws Exception { Affiliations affiliation = channelManager.getDefaultNodeAffiliation(user1); // If nothing is specified, the default affiliation is "member" assertEquals("Incorrect default affiliation", Affiliations.member, affiliation); } @Test public void returnsEphemeralNodeIsFalseIfNoConfiguratonVaueProvided() throws Exception { Mockito.when(nodeStore.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))) .thenReturn(null); assertFalse(channelManager.isEphemeralNode(user1)); } @Test public void returnsEphemeralNodeIsFalseIfConfigurationValueIsNotTrue() throws Exception { Mockito.when(nodeStore.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))) .thenReturn("no way is this true"); assertFalse(channelManager.isEphemeralNode(user1)); } @Test public void returnsEphemeralNodeIsTrueIfConfigurationValueIsTrue() throws Exception { Mockito.when(nodeStore.getNodeConfValue(Mockito.anyString(), Mockito.eq(Ephemeral.FIELD_NAME))) .thenReturn("true"); assertTrue(channelManager.isEphemeralNode(user1)); } }