package org.buddycloud.channelserver.db.jdbc; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertTrue; import java.io.IOException; import java.sql.SQLException; import java.util.Date; import java.util.HashMap; import java.util.HashSet; import junit.framework.Assert; import org.apache.commons.collections.CollectionUtils; import org.buddycloud.channelserver.packetHandler.iq.IQTestHandler; import org.buddycloud.channelserver.pubsub.affiliation.Affiliations; import org.buddycloud.channelserver.pubsub.model.NodeSubscription; import org.buddycloud.channelserver.pubsub.model.impl.NodeSubscriptionImpl; import org.buddycloud.channelserver.pubsub.subscription.Subscriptions; import org.junit.Ignore; import org.junit.Test; import org.xmpp.packet.JID; import org.xmpp.resultsetmanagement.ResultSet; public class JDBCNodeStoreSubscriptionsTest extends JDBCNodeStoreAbstract { public JDBCNodeStoreSubscriptionsTest() throws SQLException, IOException, ClassNotFoundException { dbTester = new DatabaseTester(); IQTestHandler.readConf(); } @Test public void testAddUserSubscriptionNewSubscription() throws Exception { dbTester.loadData("node_1"); NodeSubscriptionImpl nodeSubscription = new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER1_JID, Subscriptions.subscribed, null); store.addUserSubscription(nodeSubscription); dbTester.assertions().assertTableContains("subscriptions", new HashMap<String, Object>() { { put("node", TEST_SERVER1_NODE1_ID); put("user", TEST_SERVER1_USER1_JID.toString()); put("subscription", Subscriptions.subscribed.toString()); } }); } @Test public void testAddUserSubscriptionNewSubscriptionWithListener() throws Exception { dbTester.loadData("node_1"); NodeSubscriptionImpl nodeSubscription = new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER2_USER1_JID, TEST_SERVER2_CHANNELS_JID, Subscriptions.subscribed, null); store.addUserSubscription(nodeSubscription); dbTester.assertions().assertTableContains("subscriptions", new HashMap<String, Object>() { { put("node", TEST_SERVER1_NODE1_ID); put("user", TEST_SERVER2_USER1_JID.toString()); put("listener", TEST_SERVER2_CHANNELS_JID.toString()); put("subscription", Subscriptions.subscribed.toString()); } }); } @Test public void testAddUserSubscriptionUpdateSubscriptionWithListener() throws Exception { dbTester.loadData("node_1"); NodeSubscriptionImpl nodeSubscription = new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER2_USER1_JID, TEST_SERVER2_CHANNELS_JID, Subscriptions.subscribed, null); store.addUserSubscription(nodeSubscription); dbTester.assertions().assertTableContains("subscriptions", new HashMap<String, Object>() { { put("node", TEST_SERVER1_NODE1_ID); put("user", TEST_SERVER2_USER1_JID.toString()); put("listener", TEST_SERVER2_CHANNELS_JID.toString()); put("subscription", Subscriptions.subscribed.toString()); } }); } @Test public void testAddUserSubscriptionWithNoneSubscriptionRemovesSubscription() throws Exception { dbTester.loadData("node_1"); NodeSubscriptionImpl nodeSubscription = new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER1_JID, Subscriptions.none, null); store.addUserSubscription(nodeSubscription); dbTester.assertions().assertTableContains("subscriptions", new HashMap<String, Object>() { { put("node", TEST_SERVER1_NODE1_ID); put("user", TEST_SERVER1_USER1_JID.toString()); } }, 0); } @Test public void testAddUserSubscriptionWithNoneSubscriptionRemovesSubscriptionIgnoringListener() throws Exception { dbTester.loadData("node_1"); NodeSubscriptionImpl nodeSubscription = new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER1_JID, new JID("randomlistener"), Subscriptions.none, null); store.addUserSubscription(nodeSubscription); dbTester.assertions().assertTableContains("subscriptions", new HashMap<String, Object>() { { put("node", TEST_SERVER1_NODE1_ID); put("user", TEST_SERVER1_USER1_JID.toString()); } }, 0); } @Test(expected = NullPointerException.class) public void testAddUserSubscriptionWithNullSubscriptionThrowsException() throws Exception { dbTester.loadData("node_1"); NodeSubscriptionImpl nodeSubscription = new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER1_JID, null, null); store.addUserSubscription(nodeSubscription); } @Test public void testAddUserSubscriptionUpdateSubscription() throws Exception { dbTester.loadData("node_1"); NodeSubscriptionImpl nodeSubscription = new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER1_JID, Subscriptions.unconfigured, null); store.addUserSubscription(nodeSubscription); dbTester.assertions().assertTableContains("subscriptions", new HashMap<String, Object>() { { put("node", TEST_SERVER1_NODE1_ID); put("user", TEST_SERVER1_USER1_JID.toString()); put("subscription", Subscriptions.subscribed.toString()); } }, 0); dbTester.assertions().assertTableContains("subscriptions", new HashMap<String, Object>() { { put("node", TEST_SERVER1_NODE1_ID); put("user", TEST_SERVER1_USER1_JID.toString()); put("subscription", Subscriptions.unconfigured.toString()); } }); } @Test public void testAddUserSubscriptionUsesBareJID() throws Exception { dbTester.loadData("node_1"); NodeSubscriptionImpl nodeSubscription = new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER1_JID_WITH_RESOURCE, Subscriptions.subscribed, null); store.addUserSubscription(nodeSubscription); dbTester.assertions().assertTableContains("subscriptions", new HashMap<String, Object>() { { put("node", TEST_SERVER1_NODE1_ID); put("user", TEST_SERVER1_USER1_JID.toString()); put("subscription", Subscriptions.subscribed.toString()); } }); } @Test @Ignore("hsql doesn't like DISTINCT ON") public void testGetNodeSubscriptionListeners() throws Exception { dbTester.loadData("node_1"); ResultSet<NodeSubscription> result = store.getNodeSubscriptionListeners(TEST_SERVER1_NODE1_ID); HashSet<NodeSubscription> expected = new HashSet<NodeSubscription>() { { add(new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER1_JID, Subscriptions.subscribed, null)); add(new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER2_JID, Subscriptions.subscribed, null)); add(new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER2_CHANNELS_JID, Subscriptions.subscribed, null)); } }; assertEquals("Incorrect number of node subscriptions returned", expected.size(), result.size()); assertTrue("Incorrect node subscriptions returned", CollectionUtils.isEqualCollection(expected, result)); } @Test public void testCanGetSubscriptionChanges() throws Exception { dbTester.loadData("node_1"); store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER2_JID, Subscriptions.subscribed, null)); store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER3_JID, Subscriptions.pending, null)); ResultSet<NodeSubscription> changes = store.getSubscriptionChanges(TEST_SERVER1_USER1_JID, new Date(0), new Date()); assertEquals(6, changes.size()); } @Test public void testNoSubscriptionChangesFromOutcastNode() throws Exception { dbTester.loadData("node_1"); store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER2_JID, Subscriptions.subscribed, null)); store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER3_JID, Subscriptions.pending, null)); store.setUserAffiliation(TEST_SERVER1_NODE1_ID, TEST_SERVER1_USER1_JID, Affiliations.outcast); ResultSet<NodeSubscription> changes = store.getSubscriptionChanges(TEST_SERVER1_USER1_JID, new Date(0), new Date()); assertEquals(0, changes.size()); } @Test public void returnsCountOfLocalSubscriptionsToNode() throws Exception { dbTester.loadData("node_1"); store.addUserSubscription(new NodeSubscriptionImpl(TEST_SERVER1_NODE1_ID, new JID("test@extern.al"), Subscriptions.subscribed, null)); Assert.assertEquals(3, store.getCountLocalSubscriptionsToNode(TEST_SERVER1_NODE1_ID)); Assert.assertEquals(0, store.getCountLocalSubscriptionsToNode(TEST_SERVER1_NODE2_ID)); } }