Add unit test for CTCP handler; refactor CTCP handler.
[xudocci.git] / src / test / java / net / pterodactylus / irc / connection / CtcpHandlerTest.java
diff --git a/src/test/java/net/pterodactylus/irc/connection/CtcpHandlerTest.java b/src/test/java/net/pterodactylus/irc/connection/CtcpHandlerTest.java
new file mode 100644 (file)
index 0000000..e1463c9
--- /dev/null
@@ -0,0 +1,181 @@
+package net.pterodactylus.irc.connection;
+
+import static net.pterodactylus.irc.Source.parseSource;
+import static net.pterodactylus.irc.connection.Replies.createReply;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.mockito.ArgumentCaptor.forClass;
+import static org.mockito.Matchers.anyObject;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.never;
+import static org.mockito.Mockito.verify;
+
+import net.pterodactylus.irc.Connection;
+import net.pterodactylus.irc.event.DccAcceptReceived;
+import net.pterodactylus.irc.event.DccSendReceived;
+
+import com.google.common.eventbus.EventBus;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+/**
+ * Unit test for {@link CtcpHandler}.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public class CtcpHandlerTest {
+
+       private final EventBus eventBus = mock(EventBus.class);
+       private final Connection connection = mock(Connection.class);
+       private final CtcpHandler handler = new CtcpHandler(eventBus, connection);
+
+       @Test
+       public void handlerWillHandleCtcpMessagesSentAsNotice() {
+               assertThat(handler.willHandle(createReply("NOTICE", "\u0001ACTION\u0001")), is(true));
+       }
+
+       @Test
+       public void handlerWillHandleCtcpMessagesSentAsPrivmsg() {
+               assertThat(handler.willHandle(createReply("PRIVMSG", "\u0001ACTION\u0001")), is(true));
+       }
+
+       @Test
+       public void handlerWillNotHandleNormalMessages() {
+               assertThat(handler.willHandle(createReply("NOTICE", "ACTION")), is(false));
+       }
+
+       @Test
+       public void handlerWillNotHandleMalformedMessages() {
+               assertThat(handler.willHandle(createReply("NOTICE", "\u0001ACTION")), is(false));
+       }
+
+       @Test
+       public void dccSendCommandAsNoticeIsRecognizedCorrectly() {
+               dccSendCommandIsRecognizedCorrectly("NOTICE", "23456", 23456L);
+       }
+
+       private void dccSendCommandIsRecognizedCorrectly(String command,
+                       Object sizeAsString, long expectedSize) {
+               handler.handleReply(createReply(parseSource("User!user@host"),
+                               command,
+                               "\u0001DCC SEND test.dat 2130706433 12345 " + sizeAsString + "\u0001"));
+               ArgumentCaptor<DccSendReceived> eventCaptor = forClass(
+                               DccSendReceived.class);
+               verify(eventBus).post(eventCaptor.capture());
+               DccSendReceived dccSendReceived = eventCaptor.getValue();
+               assertThat(dccSendReceived.connection(), is(connection));
+               assertThat(dccSendReceived.filename(), is("test.dat"));
+               assertThat(dccSendReceived.inetAddress().getHostAddress(),
+                               is("127.0.0.1"));
+               assertThat(dccSendReceived.port(), is(12345));
+               assertThat(dccSendReceived.filesize(), is(expectedSize));
+               assertThat(dccSendReceived.source().nick().get(), is("User"));
+       }
+
+       @Test
+       public void dccSendCommandAsPrivmsgIsRecognizedCorrectly() {
+               dccSendCommandIsRecognizedCorrectly("PRIVMSG", "23456", 23456L);
+       }
+
+       @Test
+       public void nonDccCommandDoesNotCauseEvent() {
+               handler.handleReply(createReply(parseSource("User!user@host"),
+                               "NOTICE",
+                               "\u0001FOO SEND test.dat 2130706433 12345 23456\u0001"));
+               verify(eventBus, never()).post(anyObject());
+       }
+
+       @Test
+       public void nonSendDccCommandDoesNotCauseEvent() {
+               handler.handleReply(createReply(parseSource("User!user@host"),
+                               "NOTICE",
+                               "\u0001DCC FOO test.dat 2130706433 12345 23456\u0001"));
+               verify(eventBus, never()).post(anyObject());
+       }
+
+       @Test
+       public void dccCommandWithoutPortNumberDoesNotCauseEvent() {
+               handler.handleReply(createReply(parseSource("User!user@host"),
+                               "NOTICE",
+                               "\u0001DCC SEND test.dat 2130706433\u0001"));
+               verify(eventBus, never()).post(anyObject());
+       }
+
+       @Test
+       public void dccCommandWithInvalidPortNumberDoesNotCauseEvent() {
+               handler.handleReply(createReply(parseSource("User!user@host"),
+                               "NOTICE",
+                               "\u0001DCC SEND test.dat 2130706433 abc\u0001"));
+               verify(eventBus, never()).post(anyObject());
+       }
+
+       @Test
+       public void dccCommandWithoutIpAddressDoesNotCauseEvent() {
+               handler.handleReply(createReply(parseSource("User!user@host"),
+                               "NOTICE",
+                               "\u0001DCC SEND test.dat\u0001"));
+               verify(eventBus, never()).post(anyObject());
+       }
+
+       @Test
+       public void dccCommandWithInvalidIpAddressDoesNotCauseEvent() {
+               handler.handleReply(createReply(parseSource("User!user@host"),
+                               "NOTICE",
+                               "\u0001DCC SEND test.dat abc abc\u0001"));
+               verify(eventBus, never()).post(anyObject());
+       }
+
+       @Test
+       public void dccCommandWithoutLengthIsRecognizedCorrectly() {
+               dccSendCommandIsRecognizedCorrectly("PRIVMSG", "", -1);
+       }
+
+       @Test
+       public void dccAcceptCommandIsRecognized() {
+               handler.handleReply(createReply(parseSource("User!user@host"),
+                               "NOTICE",
+                               "\u0001DCC ACCEPT test.dat 12345 23456\u0001"));
+               ArgumentCaptor<DccAcceptReceived> eventCaptor = forClass(
+                               DccAcceptReceived.class);
+               verify(eventBus).post(eventCaptor.capture());
+               DccAcceptReceived dccAcceptReceived = eventCaptor.getValue();
+               assertThat(dccAcceptReceived.connection(), is(connection));
+               assertThat(dccAcceptReceived.filename(), is("test.dat"));
+               assertThat(dccAcceptReceived.port(), is(12345));
+               assertThat(dccAcceptReceived.position(), is(23456L));
+               assertThat(dccAcceptReceived.source().nick().get(), is("User"));
+       }
+
+       @Test
+       public void dccAcceptCommandWithoutParametersDoesNotCauseEvent() {
+               handler.handleReply(createReply(parseSource("User!user@host"),
+                               "NOTICE",
+                               "\u0001DCC ACCEPT\u0001"));
+               verify(eventBus,never()).post(anyObject());
+       }
+
+       @Test
+       public void dccAcceptCommandWithInvalidPortDoesNotCauseEvent() {
+               handler.handleReply(createReply(parseSource("User!user@host"),
+                               "NOTICE",
+                               "\u0001DCC ACCEPT test.dat abc\u0001"));
+               verify(eventBus,never()).post(anyObject());
+       }
+
+       @Test
+       public void dccAcceptCommandWithMissingPositionIsRecognized() {
+               handler.handleReply(createReply(parseSource("User!user@host"),
+                               "NOTICE",
+                               "\u0001DCC ACCEPT test.dat 12345\u0001"));
+               ArgumentCaptor<DccAcceptReceived> eventCaptor = forClass(
+                               DccAcceptReceived.class);
+               verify(eventBus).post(eventCaptor.capture());
+               DccAcceptReceived dccAcceptReceived = eventCaptor.getValue();
+               assertThat(dccAcceptReceived.connection(), is(connection));
+               assertThat(dccAcceptReceived.filename(), is("test.dat"));
+               assertThat(dccAcceptReceived.port(), is(12345));
+               assertThat(dccAcceptReceived.position(), is(-1L));
+               assertThat(dccAcceptReceived.source().nick().get(), is("User"));
+       }
+
+}