package org.buddycloud.channelserver.packetprocessor.message.event;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Properties;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;
import junit.framework.Assert;
import org.buddycloud.channelserver.Configuration;
import org.buddycloud.channelserver.channel.ChannelManager;
import org.buddycloud.channelserver.channel.node.configuration.Helper;
import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler;
import org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.JabberPubsub;
import org.buddycloud.channelserver.pubsub.affiliation.Affiliations;
import org.buddycloud.channelserver.pubsub.model.NodeMembership;
import org.buddycloud.channelserver.pubsub.model.impl.NodeMembershipImpl;
import org.buddycloud.channelserver.pubsub.subscription.Subscriptions;
import org.dom4j.Element;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.xmpp.packet.JID;
import org.xmpp.packet.Message;
import org.xmpp.packet.Packet;
import org.xmpp.resultsetmanagement.ResultSetImpl;
public class ConfigurationProcessorTest extends IQTestHandler {
private Message message;
private ConfigurationProcessor configurationProcessor;
private Element configurationElement;
private Element dataForm;
private BlockingQueue<Packet> queue = new LinkedBlockingQueue<Packet>();
private ChannelManager channelManager;
private JID jid = new JID("juliet@shakespeare.lit");
@Before
public void setUp() throws Exception {
Properties configuration = new Properties();
configuration.setProperty("server.domain.channels",
"chgnnels.shakespeare.lit");
channelManager = Mockito.mock(ChannelManager.class);
Configuration.getInstance().remove(
Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER);
Configuration.getInstance().putProperty(
Configuration.CONFIGURATION_SERVER_DOMAIN, "shakespeare.lit");
ArrayList<NodeMembership> members = new ArrayList<NodeMembership>();
members.add(new NodeMembershipImpl(
"/user/romeo@denmark.lit/posts", jid,
Subscriptions.subscribed, Affiliations.member, null));
Mockito.doReturn(new ResultSetImpl<NodeMembership>(members))
.when(channelManager).getNodeMemberships(Mockito.anyString());
configurationProcessor = new ConfigurationProcessor(queue,
configuration, channelManager);
HashMap<String, String> nodeConfiguration = new HashMap<String, String>();
nodeConfiguration.put("config1", "value1");
Helper helper = Mockito.mock(Helper.class);
Mockito.when(helper.getValues()).thenReturn(nodeConfiguration);
configurationProcessor.setConfigurationHelper(helper);
message = new Message();
message.setType(Message.Type.headline);
Element event = message.addChildElement("event",
JabberPubsub.NS_PUBSUB_EVENT);
configurationElement = event.addElement("configuration");
configurationElement.addAttribute("jid", "romeo@shakespeare.lit");
configurationElement.addAttribute("node",
"/user/juliet@denmark.lit/posts");
dataForm = configurationElement.addElement("x");
dataForm.addNamespace("", "jabber:x:data");
dataForm.addAttribute("type", "result");
Element field = dataForm.addElement("field");
field.addAttribute("var", "config1");
Element value = field.addElement("value");
value.addText("config1");
}
@Test
public void testEventForLocalNodeIsIgnored() throws Exception {
Configuration.getInstance().putProperty(
Configuration.CONFIGURATION_SERVER_DOMAIN, "denmark.lit");
configurationProcessor.process(message);
Assert.assertEquals(0, queue.size());
}
@Test
public void testRemoteNodeIsCreatedIfNotInDataStore() throws Exception {
Mockito.when(channelManager.nodeExists(Mockito.anyString()))
.thenReturn(false);
configurationProcessor.process(message);
Mockito.verify(channelManager, Mockito.times(1)).addRemoteNode(
Mockito.anyString());
}
@Test
public void testExpectedDetailsAreSavedToTheDataStore() throws Exception {
Mockito.when(channelManager.nodeExists(Mockito.anyString()))
.thenReturn(true);
configurationProcessor.process(message);
HashMap<String, String> match = new HashMap<String, String>();
match.put("config1", "value1");
Mockito.verify(channelManager, Mockito.times(1)).setNodeConf(
Mockito.anyString(), Mockito.eq(match));
Mockito.verify(channelManager, Mockito.times(0)).addRemoteNode(
Mockito.anyString());
}
@Test
public void testNotificationsAreSentOutAsExpected() throws Exception {
configurationProcessor.process(message);
Assert.assertEquals(1, queue.size());
message.setTo(jid.toString());
Assert.assertEquals(message.toString(), queue.poll().toString());
}
}