Mercurial > malikania
view 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 source
/* * main.cpp -- unit test for database * * Copyright (c) 2013-2017 Alexis Dörr <nanahara@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. */ #define BOOST_TEST_MODULE "database account" #include <boost/test/unit_test.hpp> #include <malikania/server/db/test_database.hpp> #include <malikania/server/db/broken_account.hpp> #include <malikania/server/db/broken_character.hpp> namespace mlk { namespace server { 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"); // Initial creation must be draft. BOOST_TEST(acc->is_draft()); /* * Set some fields, the database must not be modified at all but fields * must be set. */ acc->set_email("nanahara@malikania.fr"); acc->set_firstname("Alexis"); acc->set_lastname("Dörr"); BOOST_TEST(acc->is_draft()); BOOST_TEST(!acc->is_published()); BOOST_TEST(acc->email() == "nanahara@malikania.fr"); BOOST_TEST(acc->firstname() == "Alexis"); BOOST_TEST(acc->lastname() == "Dörr"); BOOST_TEST(accounts().size() == 0U); // Do save, database must be updated and account published. acc->save(); BOOST_TEST(!acc->is_draft()); BOOST_TEST(acc->is_published()); BOOST_TEST(acc->email() == "nanahara@malikania.fr"); BOOST_TEST(acc->firstname() == "Alexis"); BOOST_TEST(acc->lastname() == "Dörr"); 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"); ac->save(); ac->set_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"); ac->save(); ac->set_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"); ac->save(); ac->set_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"); ac->save(); ac->set_lastname("Demelier"); BOOST_TEST(get(ac->id())["lastname"].get<std::string>() == "Demelier"); } /* * account::add_character. * ------------------------------------------------------------------ */ BOOST_AUTO_TEST_CASE(add_character) { auto ac = db_->account_draft("markand", "nopassword"); ac->save(); auto& ch = ac->add_character(db_->character_draft("erekin", "fire")); BOOST_TEST(ch->is_published()); BOOST_TEST(characters().size() == 1U); } /* * account::dao::find_by_login suite. * ------------------------------------------------------------------ */ BOOST_AUTO_TEST_SUITE(find_by_login) /* * Find existing account. * ------------------------------------------------------------------ */ BOOST_AUTO_TEST_CASE(simple) { { auto ac = db_->account_draft("markand", "nopassword"); 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")); } 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); } /* * Not existing account. * ------------------------------------------------------------------ */ BOOST_AUTO_TEST_CASE(not_found) { auto ac = db_->account_dao().find_by_login("doesnotexist"); 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"); try { ac.save(); } catch (...) {} 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); ac.save(); try { ac.set_password("newpassword"); } catch (...) {} BOOST_TEST(ac.password() == "nopassword"); } /* * account::set_email. * ------------------------------------------------------------------ */ BOOST_AUTO_TEST_CASE(set_email) { broken_account ac("markand", "nopassword", broken_account::allow_flags::save); ac.save(); try { ac.set_email("markand@malikania.fr"); } catch (...) {} BOOST_TEST(ac.email() == ""); } /* * account::set_firstname. * ------------------------------------------------------------------ */ BOOST_AUTO_TEST_CASE(set_firstname) { broken_account ac("markand", "nopassword", broken_account::allow_flags::save); ac.save(); try { ac.set_firstname("David"); } catch (...) {} BOOST_TEST(ac.firstname() == ""); } /* * account::set_lastname. * ------------------------------------------------------------------ */ BOOST_AUTO_TEST_CASE(set_lastname) { broken_account ac("markand", "nopassword", broken_account::allow_flags::save); ac.save(); try { ac.set_lastname("David"); } catch (...) {} 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 } // !mlk