diff --git a/src/main/java/net/thauvin/erik/mobibot/modules/Joke.java b/src/main/java/net/thauvin/erik/mobibot/modules/Joke.java
index 53f2036..98fa80f 100644
--- a/src/main/java/net/thauvin/erik/mobibot/modules/Joke.java
+++ b/src/main/java/net/thauvin/erik/mobibot/modules/Joke.java
@@ -32,6 +32,8 @@
package net.thauvin.erik.mobibot.modules;
import net.thauvin.erik.mobibot.Mobibot;
+import net.thauvin.erik.mobibot.msg.Message;
+import net.thauvin.erik.mobibot.msg.PublicMessage;
import org.jibble.pircbot.Colors;
import org.json.JSONObject;
@@ -65,6 +67,37 @@ public final class Joke extends AbstractModule {
commands.add(JOKE_CMD);
}
+ /**
+ * Retrieves a random joke.
+ *
+ * @return The new joke.
+ */
+ static Message randomJoke() throws ModuleException {
+ try {
+ final URL url = new URL(JOKE_URL);
+ final URLConnection conn = url.openConnection();
+
+ final StringBuilder sb = new StringBuilder();
+ try (final BufferedReader reader =
+ new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
+ String line;
+ while ((line = reader.readLine()) != null) {
+ sb.append(line);
+ }
+
+ final JSONObject json = new JSONObject(sb.toString());
+
+ return new PublicMessage(
+ Colors.CYAN
+ + json.getJSONObject("value").get("joke").toString().replaceAll("\\'", "'")
+ .replaceAll("\\\"", "\"")
+ + Colors.NORMAL);
+ }
+ } catch (Exception e) {
+ throw new ModuleException("An error has occurred retrieving a random joke.", e);
+ }
+ }
+
/**
* {@inheritDoc}
*/
@@ -87,28 +120,10 @@ public final class Joke extends AbstractModule {
*/
private void run(final Mobibot bot, final String sender) {
try {
- final URL url = new URL(JOKE_URL);
- final URLConnection conn = url.openConnection();
-
- final StringBuilder sb = new StringBuilder();
- try (final BufferedReader reader =
- new BufferedReader(new InputStreamReader(conn.getInputStream(), StandardCharsets.UTF_8))) {
- String line;
- while ((line = reader.readLine()) != null) {
- sb.append(line);
- }
-
- final JSONObject json = new JSONObject(sb.toString());
-
- bot.send(bot.getChannel(),
- Colors.CYAN
- + json.getJSONObject("value").get("joke").toString().replaceAll("\\'", "'")
- .replaceAll("\\\"", "\"")
- + Colors.NORMAL);
- }
- } catch (Exception e) {
- bot.getLogger().warn("Unable to retrieve random joke.", e);
- bot.send(sender, "An error has occurred retrieving a random joke: " + e.getMessage());
+ randomJoke();
+ } catch (ModuleException e) {
+ bot.getLogger().warn(e.getMessage(), e);
+ bot.send(sender, e.getMessage());
}
}
}
diff --git a/src/test/java/net/thauvin/erik/mobibot/modules/JokeTest.java b/src/test/java/net/thauvin/erik/mobibot/modules/JokeTest.java
new file mode 100644
index 0000000..38eeabf
--- /dev/null
+++ b/src/test/java/net/thauvin/erik/mobibot/modules/JokeTest.java
@@ -0,0 +1,55 @@
+/*
+ * JokeTest.java
+ *
+ * Copyright (c) 2004-2019, Erik C. Thauvin (erik@thauvin.net)
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions are met:
+ *
+ * Redistributions of source code must retain the above copyright notice, this
+ * list of conditions and the following disclaimer.
+ *
+ * Redistributions in binary form must reproduce the above copyright notice,
+ * this list of conditions and the following disclaimer in the documentation
+ * and/or other materials provided with the distribution.
+ *
+ * Neither the name of this project nor the names of its contributors may be
+ * used to endorse or promote products derived from this software without
+ * specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
+ * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+ * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
+ * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
+ * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ */
+package net.thauvin.erik.mobibot.modules;
+
+import org.testng.annotations.Test;
+
+import static org.assertj.core.api.Assertions.assertThat;
+
+/**
+ * The JokeTest
class.
+ *
+ * @author Erik C. Thauvin
+ * @created 2019-04-07
+ * @since 1.0
+ */
+public class JokeTest {
+ @Test
+ public void testLookupImpl() {
+ AbstractModuleTest.testAbstractModule(new Joke());
+ }
+
+ @Test
+ public void testRamdomJoke() throws ModuleException {
+ assertThat(Joke.randomJoke().getMessage().length() > 0).as("randomJoke()").isTrue();
+ }
+}