diff tests/libserver/db/account/main.cpp @ 116:d7025649d85c

Server: add database account Implement accounts using a abstract factory mechanism, the database object creates abstract account which are implemented differently depending on the backend. See: - test_database, - test_account - broken_account Refs #687, #682
author David Demelier <markand@malikania.fr>
date Mon, 11 Sep 2017 13:18:43 +0200
parents 90c51ffdbbce
children a8bddc9566b0
line wrap: on
line diff
--- a/tests/libserver/db/account/main.cpp	Mon Sep 11 16:26:35 2017 +0200
+++ b/tests/libserver/db/account/main.cpp	Mon Sep 11 13:18:43 2017 +0200
@@ -21,6 +21,7 @@
 
 #include <malikania/server/db/test_database.hpp>
 #include <malikania/server/db/broken_account.hpp>
+#include <malikania/server/db/broken_character.hpp>
 
 namespace mlk {
 
@@ -29,10 +30,46 @@
 class account_fixture {
 protected:
     std::shared_ptr<test_database> db_{new test_database};
+
+    inline const std::unordered_map<std::int64_t, nlohmann::json> accounts() const noexcept
+    {
+        return db_->test_account_dao().accounts();
+    }
+
+    inline std::unordered_map<std::int64_t, nlohmann::json> accounts() noexcept
+    {
+        return db_->test_account_dao().accounts();
+    }
+
+    inline const std::unordered_map<std::int64_t, nlohmann::json> characters() const noexcept
+    {
+        return db_->test_character_dao().characters();
+    }
+
+    inline std::unordered_map<std::int64_t, nlohmann::json> characters() noexcept
+    {
+        return db_->test_character_dao().characters();
+    }
+
+    const nlohmann::json& get(std::int64_t id) const noexcept
+    {
+        return db_->test_account_dao().accounts().at(id);
+    }
 };
 
+/*
+ * Basic suite using test database.
+ * ------------------------------------------------------------------
+ */
+
 BOOST_FIXTURE_TEST_SUITE(basic_suite, account_fixture)
 
+/*
+ * account::save.
+ * ------------------------------------------------------------------
+ *
+ * Verify that database is untouched during all operation on a draft account.
+ */
 BOOST_AUTO_TEST_CASE(save)
 {
     auto acc = db_->account_draft("nanahara", "dummypassword");
@@ -53,7 +90,7 @@
     BOOST_TEST(acc->email() == "nanahara@malikania.fr");
     BOOST_TEST(acc->firstname() == "Alexis");
     BOOST_TEST(acc->lastname() == "Dörr");
-    BOOST_TEST(db_->test_account_dao()->accounts().size() == 0U);
+    BOOST_TEST(accounts().size() == 0U);
 
     // Do save, database must be updated and account published.
     acc->save();
@@ -63,119 +100,143 @@
     BOOST_TEST(acc->email() == "nanahara@malikania.fr");
     BOOST_TEST(acc->firstname() == "Alexis");
     BOOST_TEST(acc->lastname() == "Dörr");
-    BOOST_TEST(db_->test_account_dao()->accounts().size() == 1U);
+    BOOST_TEST(accounts().size() == 1U);
 }
 
+/*
+ * account::set_password.
+ * ------------------------------------------------------------------
+ */
 BOOST_AUTO_TEST_CASE(set_password)
 {
     auto ac = db_->account_draft("markand", "nopassword");
 
     ac->set_password("temporarypassword");
-
-    BOOST_TEST(db_->test_account_dao()->accounts().size() == 0U);
-
     ac->save();
     ac->set_password("newpassword");
 
-    BOOST_TEST(db_->test_account_dao()->accounts().at(ac->id()).password() == "newpassword");
+    BOOST_TEST(get(ac->id())["password"].get<std::string>() == "newpassword");
 }
 
+/*
+ * account::set_email.
+ * ------------------------------------------------------------------
+ */
 BOOST_AUTO_TEST_CASE(set_email)
 {
     auto ac = db_->account_draft("markand", "nopassword");
 
     ac->set_email("fake@malikania.fr");
-
-    BOOST_TEST(db_->test_account_dao()->accounts().size() == 0U);
-
     ac->save();
     ac->set_email("markand@malikania.fr");
 
-    BOOST_TEST(db_->test_account_dao()->accounts().at(ac->id()).email() == "markand@malikania.fr");
+    BOOST_TEST(get(ac->id())["email"].get<std::string>() == "markand@malikania.fr");
 }
 
+/*
+ * account::set_firstname.
+ * ------------------------------------------------------------------
+ */
 BOOST_AUTO_TEST_CASE(set_firstname)
 {
     auto ac = db_->account_draft("markand", "nopassword");
 
     ac->set_firstname("Jean");
-
-    BOOST_TEST(db_->test_account_dao()->accounts().size() == 0U);
-
     ac->save();
     ac->set_firstname("David");
 
-    BOOST_TEST(db_->test_account_dao()->accounts().at(ac->id()).firstname() == "David");
+    BOOST_TEST(get(ac->id())["firstname"].get<std::string>() == "David");
 }
 
+/*
+ * account::set_lastname.
+ * ------------------------------------------------------------------
+ */
 BOOST_AUTO_TEST_CASE(set_lastname)
 {
     auto ac = db_->account_draft("markand", "nopassword");
 
     ac->set_lastname("Bertrand");
-
-    BOOST_TEST(db_->test_account_dao()->accounts().size() == 0U);
-
     ac->save();
     ac->set_lastname("Demelier");
 
-    BOOST_TEST(db_->test_account_dao()->accounts().at(ac->id()).lastname() == "Demelier");
+    BOOST_TEST(get(ac->id())["lastname"].get<std::string>() == "Demelier");
 }
 
-BOOST_AUTO_TEST_SUITE(find_by_login)
-
-BOOST_AUTO_TEST_CASE(simple)
+/*
+ * account::add_character.
+ * ------------------------------------------------------------------
+ */
+BOOST_AUTO_TEST_CASE(add_character)
 {
-    db_->account_draft("markand", "nopassword")->save();
-
-    auto ac = db_->account_dao()->find_by_login("markand");
+    auto ac = db_->account_draft("markand", "nopassword");
 
-    BOOST_TEST(ac);
-    BOOST_TEST(ac->is_published());
-    BOOST_TEST(ac->login() == "markand");
-}
+    ac->save();
 
-BOOST_AUTO_TEST_CASE(not_found)
-{
-    auto ac = db_->account_dao()->find_by_login("doesnotexist");
+    auto& ch = ac->add_character(db_->character_draft("erekin", "fire"));
 
-    BOOST_TEST(!ac);
+    BOOST_TEST(ch->is_published());
+    BOOST_TEST(characters().size() == 1U);
 }
 
-BOOST_AUTO_TEST_CASE(same_instance)
+/*
+ * account::dao::find_by_login suite.
+ * ------------------------------------------------------------------
+ */
+BOOST_AUTO_TEST_SUITE(find_by_login)
+
+/*
+ * Find existing account.
+ * ------------------------------------------------------------------
+ */
+BOOST_AUTO_TEST_CASE(simple)
 {
-    db_->account_draft("markand", "nopassword")->save();
+    {
+        auto ac = db_->account_draft("markand", "nopassword");
 
-    auto a1 = db_->account_dao()->find_by_login("markand");
-    auto a2 = db_->account_dao()->find_by_login("markand");
+        ac->set_email("markand@malikania.fr");
+        ac->set_firstname("David");
+        ac->set_lastname("Demelier");
+        ac->save();
+        ac->add_character(db_->character_draft("erekin", "mage"));
+        ac->add_character(db_->character_draft("irina", "fairy"));
+    }
 
-    BOOST_TEST(db_->test_account_dao()->accounts().size() == 1U);
-    BOOST_TEST(a1 == a2);
+    auto ac = db_->account_dao().find_by_login("markand");
+
+    BOOST_TEST(ac->is_published());
+    BOOST_TEST(ac->login() == "markand");
+    BOOST_TEST(ac->email() == "markand@malikania.fr");
+    BOOST_TEST(ac->firstname() == "David");
+    BOOST_TEST(ac->lastname() == "Demelier");
+    BOOST_TEST(ac->characters().size() == 2U);
 }
 
-BOOST_AUTO_TEST_CASE(new_instance)
+/*
+ * Not existing account.
+ * ------------------------------------------------------------------
+ */
+BOOST_AUTO_TEST_CASE(not_found)
 {
-    db_->account_draft("markand", "nopassword")->save();
+    auto ac = db_->account_dao().find_by_login("doesnotexist");
 
-    /*
-     * Get rid of a1 reference, account::dao is supposed to call
-     * do_find_by_login again, creating a new pointer to the account.
-     */
-    auto a1 = db_->account_dao()->find_by_login("markand");
-    a1 = nullptr;
-
-    auto a2 = db_->account_dao()->find_by_login("markand");
-
-    BOOST_TEST(db_->test_account_dao()->accounts().size() == 1U);
-    BOOST_TEST(a1 != a2);
+    BOOST_TEST(!ac);
 }
 
 BOOST_AUTO_TEST_SUITE_END()
 
 BOOST_AUTO_TEST_SUITE_END()
 
+/*
+ * Test behaviour with broken implementation.
+ * ------------------------------------------------------------------
+ */
 BOOST_AUTO_TEST_SUITE(broken)
 
+/*
+ * account::save.
+ * ------------------------------------------------------------------
+ */
 BOOST_AUTO_TEST_CASE(save)
 {
     broken_account ac("markand", "nopassword");
@@ -187,6 +248,27 @@
     BOOST_TEST(ac.is_draft());
 }
 
+/*
+ * account::remove.
+ * ------------------------------------------------------------------
+ */
+BOOST_AUTO_TEST_CASE(remove)
+{
+    broken_account ac("markand", "nopassword", broken_account::allow_flags::save);
+
+    ac.save();
+
+    try {
+        ac.remove();
+    } catch (...) {}
+
+    BOOST_TEST(ac.is_published());
+}
+
+/*
+ * account::set_password.
+ * ------------------------------------------------------------------
+ */
 BOOST_AUTO_TEST_CASE(set_password)
 {
     broken_account ac("markand", "nopassword", broken_account::allow_flags::save);
@@ -200,6 +282,10 @@
     BOOST_TEST(ac.password() == "nopassword");
 }
 
+/*
+ * account::set_email.
+ * ------------------------------------------------------------------
+ */
 BOOST_AUTO_TEST_CASE(set_email)
 {
     broken_account ac("markand", "nopassword", broken_account::allow_flags::save);
@@ -213,6 +299,10 @@
     BOOST_TEST(ac.email() == "");
 }
 
+/*
+ * account::set_firstname.
+ * ------------------------------------------------------------------
+ */
 BOOST_AUTO_TEST_CASE(set_firstname)
 {
     broken_account ac("markand", "nopassword", broken_account::allow_flags::save);
@@ -226,6 +316,10 @@
     BOOST_TEST(ac.firstname() == "");
 }
 
+/*
+ * account::set_lastname.
+ * ------------------------------------------------------------------
+ */
 BOOST_AUTO_TEST_CASE(set_lastname)
 {
     broken_account ac("markand", "nopassword", broken_account::allow_flags::save);
@@ -239,6 +333,23 @@
     BOOST_TEST(ac.lastname() == "");
 }
 
+/*
+ * account::add_character.
+ * ------------------------------------------------------------------
+ */
+BOOST_AUTO_TEST_CASE(add_character)
+{
+    broken_account ac("markand", "nopassword", broken_account::allow_flags::save);
+
+    ac.save();
+
+    try {
+        ac.add_character(std::make_unique<broken_character>("erekin", "fire"));
+    } catch (...) {}
+
+    BOOST_TEST(ac.characters().size() == 0U);
+}
+
 BOOST_AUTO_TEST_SUITE_END()
 
 } // !server