--- /dev/null
+package net.pterodactylus.irc.connection;
+
+import static java.util.Arrays.asList;
+import static net.pterodactylus.irc.event.ChannelNotJoined.Reason.badChannelKey;
+import static net.pterodactylus.irc.event.ChannelNotJoined.Reason.banned;
+import static net.pterodactylus.irc.event.ChannelNotJoined.Reason.inviteOnly;
+import static net.pterodactylus.irc.event.ChannelNotJoined.Reason.registeredNicknamesOnly;
+import static org.hamcrest.MatcherAssert.assertThat;
+import static org.hamcrest.Matchers.is;
+import static org.mockito.ArgumentCaptor.forClass;
+import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.verify;
+import static org.mockito.Mockito.when;
+
+import net.pterodactylus.irc.Connection;
+import net.pterodactylus.irc.Reply;
+import net.pterodactylus.irc.event.ChannelNotJoined;
+import net.pterodactylus.irc.event.ChannelNotJoined.Reason;
+
+import com.google.common.eventbus.EventBus;
+import org.junit.Test;
+import org.mockito.ArgumentCaptor;
+
+/**
+ * Unit test for {@link ChannelNotJoinedHandler}.
+ *
+ * @author <a href="mailto:bombe@pterodactylus.net">David ‘Bombe’ Roden</a>
+ */
+public class ChannelNotJoinedHandlerTest {
+
+ private final EventBus eventBus = mock(EventBus.class);
+ private final Connection connection = mock(Connection.class);
+ private final ChannelNotJoinedHandler handler =
+ new ChannelNotJoinedHandler(eventBus, connection);
+
+ @Test
+ public void handlerWillOnlyReactToSpecificCommands() {
+ for (String command : asList("473", "474", "475", "477")) {
+ assertThat(handler.willHandle(createReply(command)), is(true));
+ }
+ }
+
+ @Test
+ public void handlerWillNotWantToHandleOtherCommands() {
+ for (String command : asList("PRIVMSG", "NOTICE", "JOIN", "KICK",
+ "PART", "QUIT", "331", "433")) {
+ assertThat(handler.willHandle(createReply(command)), is(false));
+ }
+ }
+
+ private Reply createReply(String command) {
+ Reply reply = mock(Reply.class);
+ return when(reply.command()).thenReturn(command).getMock();
+ }
+
+ @Test
+ public void bannedChannelNotJoinedIsRecognizedCorrectly() {
+ handler.handleReply(createReply("474", "#test"));
+ verifyReasonIs(banned);
+ }
+
+ private void verifyReasonIs(Reason reason) {
+ ArgumentCaptor<ChannelNotJoined> channelNotJoined = forClass(
+ ChannelNotJoined.class);
+ verify(eventBus).post(channelNotJoined.capture());
+ assertThat(channelNotJoined.getValue().channel(), is("#test"));
+ assertThat(channelNotJoined.getValue().reason(), is(reason));
+ assertThat(channelNotJoined.getValue().connection(), is(connection));
+ }
+
+ @Test
+ public void inviteOnlyChannelNotJoinedIsRecognizedCorrectly() {
+ handler.handleReply(createReply("473", "#test"));
+ verifyReasonIs(inviteOnly);
+ }
+
+ @Test
+ public void channelWithBadChannelKeyNotJoinedIsRecognizedCorrectly() {
+ handler.handleReply(createReply("475", "#test"));
+ verifyReasonIs(badChannelKey);
+ }
+
+ @Test
+ public void channelRequiringRegisteredNicknamesNotJoinedIsRecognizedCorrectly() {
+ handler.handleReply(createReply("477", "#test"));
+ verifyReasonIs(registeredNicknamesOnly);
+ }
+
+ private Reply createReply(String command, String channel) {
+ final Reply reply = mock(Reply.class);
+ when(reply.command()).thenReturn(command);
+ when(reply.parameters()).thenReturn(asList(":some.server", channel));
+ return reply;
+ }
+
+}