package org.buddycloud.channelserver.packetprocessor.iq.namespace.pubsub.get;
import java.util.ArrayList;
import java.util.List;
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.packetHandler.iq.IQTestHandler;
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.buddycloud.channelserver.utils.XMLConstants;
import org.buddycloud.channelserver.utils.node.item.payload.Buddycloud;
import org.dom4j.Element;
import org.dom4j.Namespace;
import org.dom4j.QName;
import org.dom4j.tree.BaseElement;
import org.junit.Before;
import org.junit.Test;
import org.mockito.Mockito;
import org.xmpp.packet.IQ;
import org.xmpp.packet.JID;
import org.xmpp.packet.Packet;
import org.xmpp.resultsetmanagement.ResultSetImpl;
public class SubscriptionsGetTest extends IQTestHandler {
private IQ userRequest;
private IQ nodeRequest;
private SubscriptionsGet subscriptionsGet;
private Element element;
private BlockingQueue<Packet> queue = new LinkedBlockingQueue<Packet>();
private String node = "/user/pamela@denmark.lit/posts";
private JID jid = new JID("juliet@shakespeare.lit");
private JID invitedBy = new JID("romeo@shakespeare.lit");
private ChannelManager channelManager;
@Before
public void setUp() throws Exception {
queue = new LinkedBlockingQueue<Packet>();
subscriptionsGet = new SubscriptionsGet(queue, channelManager);
element = new BaseElement("subscriptions");
channelManager = Mockito.mock(ChannelManager.class);
Configuration.getInstance().putProperty(Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.TRUE.toString());
NodeMembership nodeMembership = new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.member, null);
Mockito.when(channelManager.getNodeMembership(Mockito.anyString(), Mockito.any(JID.class))).thenReturn(nodeMembership);
subscriptionsGet.setChannelManager(channelManager);
userRequest = readStanzaAsIq("/iq/pubsub/subscriptions/request.stanza");
nodeRequest = readStanzaAsIq("/iq/pubsub/subscriptions/requestExistingNode.stanza");
}
@Test
public void testPassingSubscriptionsAsElementNameReturnsTrue() {
Assert.assertTrue(subscriptionsGet.accept(element));
}
@Test
public void testPassingNotSubscriptionsAsElementNameReturnsFalse() {
Element element = new BaseElement("not-subscriptions");
Assert.assertFalse(subscriptionsGet.accept(element));
}
@Test
public void addsInvitedByToUserSubscriptionsList() throws Exception {
ArrayList<NodeMembership> members = new ArrayList<NodeMembership>();
members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy));
Mockito.when(channelManager.getUserMemberships(Mockito.any(JID.class), Mockito.eq(false))).thenReturn(new ResultSetImpl<NodeMembership>(members));
subscriptionsGet.process(element, jid, userRequest, null);
Assert.assertEquals(1, queue.size());
IQ response = (IQ) queue.poll();
Assert.assertEquals(IQ.Type.result, response.getType());
Assert.assertEquals(userRequest.getTo(), response.getFrom());
Assert.assertEquals(userRequest.getFrom(), response.getTo());
Assert.assertEquals(userRequest.getID(), response.getID());
Assert.assertEquals(1, response.getChildElement().element("subscriptions").elements("subscription").size());
}
// ------------- node subscripton tests
@Test
public void remoteNodeForwardsStanza() throws Exception {
Configuration.getInstance().putProperty(Configuration.CONFIGURATION_LOCAL_DOMAIN_CHECKER, Boolean.FALSE.toString());
Mockito.when(channelManager.isCachedNode(Mockito.anyString())).thenReturn(false);
subscriptionsGet.process(element, jid, nodeRequest, null);
IQ response = (IQ) queue.poll();
Assert.assertEquals(IQ.Type.get, response.getType());
Assert.assertEquals(new JID("denmark.lit"), response.getTo());
Assert.assertEquals(userRequest.getID(), response.getID());
}
@Test
public void doesntAddInvitedByToNodeSubscriptionsListIfNotUserOrOwnerOrModerator() throws Exception {
List<NodeMembership> members = new ArrayList<NodeMembership>();
members.add(new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.publisher, invitedBy));
Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn(new ResultSetImpl<NodeMembership>(members));
// Run the processing as a JID other than the one used in the above 'add'
subscriptionsGet.process(element, new JID("shylock@shakespeare.lit"), nodeRequest, null);
Assert.assertEquals(1, queue.size());
IQ response = (IQ) queue.poll();
Assert.assertEquals(IQ.Type.result, response.getType());
Assert.assertEquals(userRequest.getTo(), response.getFrom());
Assert.assertEquals(userRequest.getFrom(), response.getTo());
Assert.assertEquals(userRequest.getID(), response.getID());
Element subscription = (Element) response.getChildElement().element("subscriptions").elements("subscription").get(0);
Assert.assertNull(subscription.attributeValue("invited-by"));
}
@Test
public void addsInvitedByToNodeSubscriptionsListIfOwner() throws Exception {
NodeMembership nodeMembership = new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.owner, null);
Mockito.when(channelManager.getNodeMembership(Mockito.anyString(), Mockito.any(JID.class))).thenReturn(nodeMembership);
ArrayList<NodeMembership> members = new ArrayList<NodeMembership>();
members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy));
Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn(new ResultSetImpl<NodeMembership>(members));
subscriptionsGet.process(element, jid, nodeRequest, null);
Assert.assertEquals(1, queue.size());
IQ response = (IQ) queue.poll();
Assert.assertEquals(IQ.Type.result, response.getType());
Assert.assertEquals(userRequest.getTo(), response.getFrom());
Assert.assertEquals(userRequest.getFrom(), response.getTo());
Assert.assertEquals(userRequest.getID(), response.getID());
Assert.assertEquals(1, response.getChildElement().element("subscriptions").elements("subscription").size());
Element subscription = (Element) response.getChildElement().element("subscriptions").elements("subscription").get(0);
Assert.assertEquals(node, subscription.attributeValue("node"));
Assert.assertEquals(invitedBy.toBareJID(), subscription.attributeValue("invited-by"));
Assert.assertEquals(jid.toBareJID(), subscription.attributeValue("jid"));
Assert.assertEquals(Subscriptions.invited.toString(), subscription.attributeValue("subscription"));
}
@Test
public void addsInvitedByToNodeSubscriptionsListIfModerator() throws Exception {
NodeMembership nodeMembership = new NodeMembershipImpl(node, jid, Subscriptions.subscribed, Affiliations.moderator, null);
Mockito.when(channelManager.getNodeMembership(Mockito.anyString(), Mockito.any(JID.class))).thenReturn(nodeMembership);
ArrayList<NodeMembership> members = new ArrayList<NodeMembership>();
members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy));
Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn(new ResultSetImpl<NodeMembership>(members));
subscriptionsGet.process(element, jid, nodeRequest, null);
Assert.assertEquals(1, queue.size());
IQ response = (IQ) queue.poll();
Assert.assertEquals(IQ.Type.result, response.getType());
Assert.assertEquals(userRequest.getTo(), response.getFrom());
Assert.assertEquals(userRequest.getFrom(), response.getTo());
Assert.assertEquals(userRequest.getID(), response.getID());
Assert.assertEquals(1, response.getChildElement().element("subscriptions").elements("subscription").size());
}
@Test
public void addsInvitedByToUserSubscriptionsListIfUser() throws Exception {
NodeMembership nodeMembership = new NodeMembershipImpl(node, nodeRequest.getFrom(), Subscriptions.subscribed, Affiliations.moderator, null);
Mockito.when(channelManager.getNodeMembership(Mockito.anyString(), Mockito.any(JID.class))).thenReturn(nodeMembership);
ArrayList<NodeMembership> members = new ArrayList<NodeMembership>();
members.add(new NodeMembershipImpl(node, jid, Subscriptions.invited, Affiliations.publisher, invitedBy));
Mockito.when(channelManager.getNodeMemberships(Mockito.anyString())).thenReturn(new ResultSetImpl<NodeMembership>(members));
subscriptionsGet.process(element, jid, nodeRequest, null);
Assert.assertEquals(1, queue.size());
IQ response = (IQ) queue.poll();
Assert.assertEquals(IQ.Type.result, response.getType());
Assert.assertEquals(userRequest.getTo(), response.getFrom());
Assert.assertEquals(userRequest.getFrom(), response.getTo());
Assert.assertEquals(userRequest.getID(), response.getID());
Assert.assertEquals(1, response.getChildElement().element("subscriptions").elements("subscription").size());
}
@Test
public void canRequestUserSubscriptionsForEphemeralOnlyNodes() throws Exception {
IQ request = userRequest.createCopy();
Element subscriptions =
request.getElement().element(XMLConstants.PUBSUB_ELEM)
.element(XMLConstants.SUBSCRIPTIONS_ELEM);
subscriptions.addNamespace("bc", Buddycloud.NS);
subscriptions.addAttribute(new QName(
XMLConstants.EPHEMERAL, Namespace.get(Buddycloud.NS)), "true");
try {
subscriptionsGet.process(element, jid, request, null);
} catch (NullPointerException e) {
}
Mockito.verify(channelManager, Mockito.times(1)).getUserMemberships(Mockito.any(JID.class), Mockito.eq(true));
}
@Test
public void notProvidingEphemeralAttributeForUserSubscriptionsResultsInNotEphemeralNodeGathering() throws Exception {
try {
subscriptionsGet.process(element, jid, userRequest, null);
} catch (NullPointerException e) {
}
Mockito.verify(channelManager, Mockito.times(1)).getUserMemberships(Mockito.any(JID.class), Mockito.eq(false));
}
@Test
public void providingAnIncorrectValueForEphemeralAttributeResultsInNotEphemeralGatheringOfUserSubscriptions() throws Exception {
IQ request = userRequest.createCopy();
Element subscriptions =
request.getElement().element(XMLConstants.PUBSUB_ELEM)
.element(XMLConstants.SUBSCRIPTIONS_ELEM);
subscriptions.addNamespace("bc", Buddycloud.NS);
subscriptions.addAttribute(new QName(
XMLConstants.EPHEMERAL, Namespace.get(Buddycloud.NS)), "sure");
try {
subscriptionsGet.process(element, jid, request, null);
} catch (NullPointerException e) {
}
Mockito.verify(channelManager, Mockito.times(1)).getUserMemberships(Mockito.any(JID.class), Mockito.eq(false));
}
}