package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.result;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import junit.framework.Assert;
import org.buddycloud.channelserver.channel.ChannelManager;
import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler;
import org.buddycloud.channelserver.pubsub.model.NodeSubscription;
import org.buddycloud.channelserver.pubsub.subscription.Subscriptions;
import org.dom4j.Element;
import org.dom4j.tree.BaseElement;
import org.junit.Before;
import org.junit.Test;
import org.mockito.ArgumentCaptor;
import org.mockito.Mockito;
import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
public class SubscriptionsResultTest extends IQTestHandler {
private IQ resultWithNode;
private IQ resultNoNode;
private SubscriptionsResult subscriptionsResult;
private Element element;
private String node = "/user/pamela@denmark.lit/posts";
private JID jid = new JID("juliet@shakespeare.lit");
private ChannelManager channelManager;
private IQ resultInvite;
@Before
public void setUp() throws Exception {
channelManager = Mockito.mock(ChannelManager.class);
subscriptionsResult = new SubscriptionsResult(channelManager);
resultWithNode = readStanzaAsIq("/iq/pubsub/subscriptions/reply-with-node.stanza");
resultNoNode = readStanzaAsIq("/iq/pubsub/subscriptions/reply-no-node.stanza");
resultInvite = readStanzaAsIq("/iq/pubsub/subscriptions/reply-with-invite.stanza");
element = new BaseElement("subscriptions");
element.addAttribute("node", node);
subscriptionsResult.setChannelManager(channelManager);
}
@Test
public void testPassingSubsriptionsAsElementNameReturnsTrue() {
Assert.assertTrue(subscriptionsResult.accept(element));
}
@Test
public void testPassingNotSubscriptionsAsElementNameReturnsFalse() {
Element element = new BaseElement("not-subscriptions");
Assert.assertFalse(subscriptionsResult.accept(element));
}
@Test(expected = NullPointerException.class)
public void testInvalidStanzaThrowsException() throws Exception {
IQ result =
toIq("<iq type=\"result\" id=\"subscriptions1\" " + "from=\"channels.shakespeare.lit\" " + "to=\"channels.denmark.lit\">"
+ "<pubsub xmlns=\"http://jabber.org/protocol/pubsub#owner\" />" + "</iq>");
subscriptionsResult.process(element, jid, result, null);
}
@Test
public void testNoSubscriptionsCausesNoDatastoreInsert() throws Exception {
IQ result =
toIq("<iq type=\"result\" id=\"subscriptions1\" " + "from=\"channels.shakespeare.lit\" " + "to=\"channels.denmark.lit\">"
+ "<pubsub xmlns=\"http://jabber.org/protocol/pubsub#owner\">" + "<subscriptions />" + "</pubsub>" + "</iq>");
subscriptionsResult.process(element, jid, result, null);
Mockito.verify(channelManager, Mockito.times(0)).addUserSubscription(Mockito.any(NodeSubscription.class));
}
@Test
public void testOwnerSubscriptionsResultStanzaHandledCorrectly() throws Exception {
element = new BaseElement("affiliations");
subscriptionsResult.process(element, jid, resultNoNode, null);
Mockito.verify(channelManager, Mockito.times(7)).addUserSubscription(Mockito.any(NodeSubscription.class));
}
@Test
public void testNodeSubscriptionsResultStanzaHandledCorrectly() throws Exception {
subscriptionsResult.process(element, jid, resultWithNode, null);
Mockito.verify(channelManager, Mockito.times(7)).addUserSubscription(Mockito.any(NodeSubscription.class));
}
@Test
public void addsInvitedByDetails() throws Exception {
subscriptionsResult.process(element, jid, resultInvite, null);
ArgumentCaptor<NodeSubscription> subscription = ArgumentCaptor.forClass(NodeSubscription.class);
verify(channelManager, times(1)).addUserSubscription(subscription.capture());
Assert.assertEquals(new JID("romeo@shakespeare.lit"), subscription.getValue().getInvitedBy());
Assert.assertEquals(Subscriptions.invited, subscription.getValue().getSubscription());
Assert.assertEquals(node, subscription.getValue().getNodeId());
}
}