changeset 311:fa184c88b2c3

Tests: add test for server-connect, #559
author David Demelier <markand@malikania.fr>
date Fri, 21 Oct 2016 20:28:50 +0200
parents 7e5001552326
children a0180b5a150c
files libirccd/irccd/cmd-server-connect.cpp libirccd/irccd/cmd-server-connect.hpp tests/CMakeLists.txt tests/cmd-server-connect/CMakeLists.txt tests/cmd-server-connect/main.cpp
diffstat 5 files changed, 155 insertions(+), 59 deletions(-) [+]
line wrap: on
line diff
--- a/libirccd/irccd/cmd-server-connect.cpp	Thu Oct 20 19:21:07 2016 +0200
+++ b/libirccd/irccd/cmd-server-connect.cpp	Fri Oct 21 20:28:50 2016 +0200
@@ -18,66 +18,32 @@
 
 #include <limits>
 
-#include <format.h>
-
 #include "cmd-server-connect.hpp"
 #include "irccd.hpp"
 #include "server.hpp"
 #include "service-server.hpp"
+#include "transport.hpp"
 #include "util.hpp"
 
-using namespace fmt::literals;
-
-using json = nlohmann::json;
-
 namespace irccd {
 
 namespace command {
 
 ServerConnectCommand::ServerConnectCommand()
-    : Command("server-connect", "Server", "Connect to a server")
+    : Command("server-connect")
 {
 }
 
-std::vector<Command::Option> ServerConnectCommand::options() const
-{
-    return {
-        { "command",    "c", "command",     "char",     "command character to use"  },
-        { "nickname",   "n", "nickname",    "nickname", "nickname to use"           },
-        { "realname",   "r", "realname",    "realname", "realname to use"           },
-        { "sslverify",  "S", "ssl-verify",  "",         "verify SSL"                },
-        { "ssl",        "s", "ssl",         "",         "connect with SSL"          },
-        { "username",   "u", "username",    "",         "username to use"           }
-    };
-}
-
-std::vector<Command::Arg> ServerConnectCommand::args() const
+void ServerConnectCommand::exec(Irccd &irccd, TransportClient &client, const nlohmann::json &args)
 {
-    return {
-        { "id",     true    },
-        { "host",   true    },
-        { "port",   false   }
-    };
-}
-
-std::vector<Command::Property> ServerConnectCommand::properties() const
-{
-    return {
-        { "name",   { json::value_t::string }},
-        { "host",   { json::value_t::string }}
-    };
-}
-
-json ServerConnectCommand::exec(Irccd &irccd, const json &request) const
-{
-    auto server = Server::fromJson(request);
+    auto server = Server::fromJson(args);
 
     if (irccd.servers().has(server->name()))
-        throw std::invalid_argument("server '{}' already exists"_format(server->name()));
-
-    irccd.servers().add(std::move(server));
-
-    return Command::exec(irccd, request);
+        client.error("server-connect", "server already exists");
+    else {
+        irccd.servers().add(std::move(server));
+        client.success("server-connect");
+    }
 }
 
 } // !command
--- a/libirccd/irccd/cmd-server-connect.hpp	Thu Oct 20 19:21:07 2016 +0200
+++ b/libirccd/irccd/cmd-server-connect.hpp	Fri Oct 21 20:28:50 2016 +0200
@@ -41,24 +41,9 @@
     IRCCD_EXPORT ServerConnectCommand();
 
     /**
-     * \copydoc Command::options
-     */
-    IRCCD_EXPORT std::vector<Option> options() const override;
-
-    /**
-     * \copydoc Command::args
-     */
-    IRCCD_EXPORT std::vector<Arg> args() const override;
-
-    /**
-     * \copydoc Command::properties
-     */
-    IRCCD_EXPORT std::vector<Property> properties() const override;
-
-    /**
      * \copydoc Command::exec
      */
-    IRCCD_EXPORT nlohmann::json exec(Irccd &irccd, const nlohmann::json &request) const override;
+    IRCCD_EXPORT void exec(Irccd &irccd, TransportClient &client, const nlohmann::json &args) override;
 };
 
 } // !command
--- a/tests/CMakeLists.txt	Thu Oct 20 19:21:07 2016 +0200
+++ b/tests/CMakeLists.txt	Fri Oct 21 20:28:50 2016 +0200
@@ -22,6 +22,7 @@
 if (WITH_TESTS)
     add_subdirectory(cmd-server-cmode)
     add_subdirectory(cmd-server-cnotice)
+    add_subdirectory(cmd-server-connect)
     add_subdirectory(cmd-server-disconnect)
     add_subdirectory(cmd-server-info)
     add_subdirectory(cmd-server-invite)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/cmd-server-connect/CMakeLists.txt	Fri Oct 21 20:28:50 2016 +0200
@@ -0,0 +1,24 @@
+#
+# CMakeLists.txt -- CMake build system for irccd
+#
+# Copyright (c) 2013-2016 David Demelier <markand@malikania.fr>
+#
+# Permission to use, copy, modify, and/or distribute this software for any
+# purpose with or without fee is hereby granted, provided that the above
+# copyright notice and this permission notice appear in all copies.
+#
+# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+#
+
+irccd_define_test(
+    NAME cmd-server-connect
+    SOURCES main.cpp
+    LIBRARIES libirccd libirccdctl
+)
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/tests/cmd-server-connect/main.cpp	Fri Oct 21 20:28:50 2016 +0200
@@ -0,0 +1,120 @@
+/*
+ * main.cpp -- test server-connect remote command
+ *
+ * Copyright (c) 2013-2016 David Demelier <markand@malikania.fr>
+ *
+ * Permission to use, copy, modify, and/or distribute this software for any
+ * purpose with or without fee is hereby granted, provided that the above
+ * copyright notice and this permission notice appear in all copies.
+ *
+ * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+ * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+ * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+ * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+ */
+
+#include <cmd-server-connect.hpp>
+#include <command-tester.hpp>
+#include <server-tester.hpp>
+#include <service-server.hpp>
+
+using namespace irccd;
+using namespace irccd::command;
+
+namespace {
+
+nlohmann::json message;
+
+} // !namespace
+
+class ServerConnectCommandTest : public CommandTester {
+public:
+    ServerConnectCommandTest()
+        : CommandTester(std::make_unique<ServerConnectCommand>())
+    {
+        message = nullptr;
+
+        m_irccdctl.client().onMessage.connect([&] (auto message) {
+            ::message = message;
+        });
+    }
+};
+
+TEST_F(ServerConnectCommandTest, minimal)
+{
+    try {
+        m_irccdctl.client().request({
+            { "command",    "server-connect"    },
+            { "name",       "local"             },
+            { "host",       "irc.example.org"   }
+        });
+
+        poll([&] () {
+            return message.is_object();
+        });
+
+        auto s = m_irccd.servers().get("local");
+
+        ASSERT_TRUE(s != nullptr);
+        ASSERT_EQ("local", s->name());
+        ASSERT_EQ("irc.example.org", s->host());
+        ASSERT_EQ(6667U, s->port());
+    } catch (const std::exception &ex) {
+        FAIL() << ex.what();
+    }
+}
+
+TEST_F(ServerConnectCommandTest, full)
+{
+    try {
+        m_irccdctl.client().request({
+            { "command",    "server-connect"    },
+            { "name",       "local2"            },
+            { "host",       "irc.example2.org"  },
+            { "password",   "nonono"            },
+            { "nickname",   "francis"           },
+            { "realname",   "the_francis"       },
+            { "username",   "frc"               },
+            { "ctcpVersion", "ultra bot"        },
+            { "commandChar", "::"               },
+            { "port",       18000               },
+            { "ssl",        true                },
+            { "sslVerify",  true                },
+            { "autoRejoin", true                },
+            { "joinInvite", true                }
+        });
+
+        poll([&] () {
+            return message.is_object();
+        });
+
+        auto s = m_irccd.servers().get("local2");
+
+        ASSERT_TRUE(s != nullptr);
+        ASSERT_EQ("local2", s->name());
+        ASSERT_EQ("irc.example2.org", s->host());
+        ASSERT_EQ(18000U, s->port());
+        ASSERT_EQ("nonono", s->password());
+        ASSERT_EQ("francis", s->nickname());
+        ASSERT_EQ("the_francis", s->realname());
+        ASSERT_EQ("frc", s->username());
+        ASSERT_EQ("::", s->commandCharacter());
+        ASSERT_EQ("ultra bot", s->ctcpVersion());
+        ASSERT_TRUE(s->flags() & Server::Ssl);
+        ASSERT_TRUE(s->flags() & Server::SslVerify);
+        ASSERT_TRUE(s->flags() & Server::AutoRejoin);
+        ASSERT_TRUE(s->flags() & Server::JoinInvite);
+    } catch (const std::exception &ex) {
+        FAIL() << ex.what();
+    }
+}
+
+int main(int argc, char **argv)
+{
+    testing::InitGoogleTest(&argc, argv);
+
+    return RUN_ALL_TESTS();
+}