Mercurial > malikania
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