# HG changeset patch # User David Demelier # Date 1464206700 -7200 # Node ID 2380d476f9879bb68e5643222ccb4a2016fa453f # Parent 6e27e3cf98fb9b5611459e994a5c7fb910955493 Plugin plugin: add initial unit test diff -r 6e27e3cf98fb -r 2380d476f987 plugins/plugin/plugin.js --- a/plugins/plugin/plugin.js Wed May 25 21:34:26 2016 +0200 +++ b/plugins/plugin/plugin.js Wed May 25 22:05:00 2016 +0200 @@ -16,10 +16,6 @@ * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ -// Modules. -var Util = Irccd.Util; -var Plugin = Irccd.Plugin; - // Plugin information. info = { author: "David Demelier ", @@ -28,6 +24,10 @@ version: "@IRCCD_VERSION@" }; +// Modules. +var Util = Irccd.Util; +var Plugin = Irccd.Plugin; + Plugin.format = { "usage": "#{nickname}, usage: #{command} list | info plugin", "info": "#{nickname}, #{name}: #{summary}, version #{version} by #{author} (#{license} license).", diff -r 6e27e3cf98fb -r 2380d476f987 tests/CMakeLists.txt --- a/tests/CMakeLists.txt Wed May 25 21:34:26 2016 +0200 +++ b/tests/CMakeLists.txt Wed May 25 22:05:00 2016 +0200 @@ -43,5 +43,6 @@ add_subdirectory(plugin-hangman) add_subdirectory(plugin-history) add_subdirectory(plugin-logger) + add_subdirectory(plugin-plugin) endif () endif () diff -r 6e27e3cf98fb -r 2380d476f987 tests/plugin-plugin/CMakeLists.txt --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/plugin-plugin/CMakeLists.txt Wed May 25 22:05:00 2016 +0200 @@ -0,0 +1,24 @@ +# +# CMakeLists.txt -- CMake build system for irccd +# +# Copyright (c) 2013-2016 David Demelier +# +# 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 plugin-plugin + SOURCES main.cpp + LIBRARIES libirccd + FLAGS PLUGINDIR=\"${IRCCD_FAKEROOTDIR}/${WITH_PLUGINDIR}\" +) diff -r 6e27e3cf98fb -r 2380d476f987 tests/plugin-plugin/main.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/tests/plugin-plugin/main.cpp Wed May 25 22:05:00 2016 +0200 @@ -0,0 +1,133 @@ +/* + * main.cpp -- test plugin plugin + * + * Copyright (c) 2013-2016 David Demelier + * + * 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 + +#include + +#include +#include +#include +#include + +using namespace fmt::literals; + +using namespace irccd; + +class ServerTest : public Server { +private: + std::string m_last; + +public: + inline ServerTest() + : Server("test", ServerInfo()) + { + } + + inline const std::string &last() const noexcept + { + return m_last; + } + + void message(std::string target, std::string message) override + { + m_last = util::join({target, message}); + } +}; + +class FakePlugin : public Plugin { +public: + FakePlugin() + : Plugin("fake", "") + { + setAuthor("jean"); + setVersion("0.0.0.0.0.1"); + setLicense("BEER"); + setSummary("Fake White Beer 2000"); + } +}; + +class PluginTest : public testing::Test { +protected: + Irccd m_irccd; + PluginService &m_ps; + + std::shared_ptr m_server; + std::shared_ptr m_plugin; + +public: + PluginTest() + : m_ps(m_irccd.pluginService()) + , m_server(std::make_shared()) + { + m_ps.add(std::make_shared()); + m_ps.setFormats("plugin", { + { "usage", "usage=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}" }, + { "info", "info=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{author}:#{license}:#{name}:#{summary}:#{version}" }, + { "not-found", "not-found=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}:#{name}" }, + { "too-long", "too-long=#{plugin}:#{command}:#{server}:#{channel}:#{origin}:#{nickname}" } + }); + m_ps.load("plugin", PLUGINDIR "/plugin.js"); + m_plugin = m_ps.require("plugin"); + } +}; + +TEST_F(PluginTest, formatUsage) +{ + m_plugin->onCommand(m_irccd, m_server, "jean!jean@localhost", "#staff", ""); + ASSERT_EQ("#staff:usage=plugin:!plugin:test:#staff:jean!jean@localhost:jean", m_server->last()); + + m_plugin->onCommand(m_irccd, m_server, "jean!jean@localhost", "#staff", "fail"); + ASSERT_EQ("#staff:usage=plugin:!plugin:test:#staff:jean!jean@localhost:jean", m_server->last()); + + m_plugin->onCommand(m_irccd, m_server, "jean!jean@localhost", "#staff", "info"); + ASSERT_EQ("#staff:usage=plugin:!plugin:test:#staff:jean!jean@localhost:jean", m_server->last()); +} + +TEST_F(PluginTest, formatInfo) +{ + m_plugin->onCommand(m_irccd, m_server, "jean!jean@localhost", "#staff", "info fake"); + + ASSERT_EQ("#staff:info=plugin:!plugin:test:#staff:jean!jean@localhost:jean:jean:BEER:fake:Fake White Beer 2000:0.0.0.0.0.1", m_server->last()); +} + +TEST_F(PluginTest, formatNotFound) +{ + m_plugin->onCommand(m_irccd, m_server, "jean!jean@localhost", "#staff", "info doesnotexistsihope"); + + ASSERT_EQ("#staff:not-found=plugin:!plugin:test:#staff:jean!jean@localhost:jean:doesnotexistsihope", m_server->last()); +} + +TEST_F(PluginTest, formatTooLong) +{ + for (int i = 0; i < 100; ++i) + m_ps.add(std::make_shared("plugin-n-{}"_format(i), "")); + + m_plugin->onCommand(m_irccd, m_server, "jean!jean@localhost", "#staff", "list"); + + ASSERT_EQ("#staff:too-long=plugin:!plugin:test:#staff:jean!jean@localhost:jean", m_server->last()); +} + +int main(int argc, char **argv) +{ + path::setApplicationPath(argv[0]); + testing::InitGoogleTest(&argc, argv); + log::setInterface(std::make_unique()); + + return RUN_ALL_TESTS(); +}