diff tests/libserver/db/account/main.cpp @ 107:6f4965c26ceb

Server: add basic accounts tests, #682
author David Demelier <markand@malikania.fr>
date Tue, 05 Sep 2017 13:33:57 +0200
parents 41e5722da2ae
children 90c51ffdbbce
line wrap: on
line diff
--- a/tests/libserver/db/account/main.cpp	Mon Sep 04 19:41:18 2017 +0200
+++ b/tests/libserver/db/account/main.cpp	Tue Sep 05 13:33:57 2017 +0200
@@ -19,29 +19,160 @@
 #define BOOST_TEST_MODULE "database account"
 #include <boost/test/unit_test.hpp>
 
-#include <malikania/server/database_test.hpp>
-#include <malikania/server/account_dao_test.hpp>
-#include <malikania/server/db/account.hpp>
+#include <malikania/server/db/test_database.hpp>
 
 namespace mlk {
 
 namespace server {
 
-BOOST_AUTO_TEST_SUITE(basic)
+class account_fixture {
+protected:
+    std::shared_ptr<test_database> db_{new test_database};
+};
+
+BOOST_FIXTURE_TEST_SUITE(basic_suite, account_fixture)
+
+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(db_->test_account_dao()->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(db_->test_account_dao()->accounts().size() == 1U);
+}
+
+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_AUTO_TEST_CASE(set_email)
 {
-    auto db = std::make_shared<database_test>();
-    auto acc = std::make_shared<account>(db, "nanahara");
+    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_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_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_AUTO_TEST_SUITE(find_by_login)
 
-    BOOST_TEST(acc->is_draft());
-    acc->set_email("nanahara@malikania.fr");
-    BOOST_TEST(acc->is_draft());
-    BOOST_TEST(acc->email() == "nanahara@malikania.fr");
-    acc->save();
-    BOOST_TEST((acc->is_published() && !acc->is_draft()));
+BOOST_AUTO_TEST_CASE(simple)
+{
+    db_->account_draft("markand", "nopassword")->save();
+
+    auto ac = db_->account_dao()->find_by_login("markand");
+
+    BOOST_TEST(ac);
+    BOOST_TEST(ac->is_published());
+    BOOST_TEST(ac->login() == "markand");
+}
+
+BOOST_AUTO_TEST_CASE(not_found)
+{
+    auto ac = db_->account_dao()->find_by_login("doesnotexist");
+
+    BOOST_TEST(!ac);
+}
+
+BOOST_AUTO_TEST_CASE(same_instance)
+{
+    db_->account_draft("markand", "nopassword")->save();
+
+    auto a1 = db_->account_dao()->find_by_login("markand");
+    auto a2 = db_->account_dao()->find_by_login("markand");
+
+    BOOST_TEST(db_->test_account_dao()->accounts().size() == 1U);
+    BOOST_TEST(a1 == a2);
+}
+
+BOOST_AUTO_TEST_CASE(new_instance)
+{
+    db_->account_draft("markand", "nopassword")->save();
+
+    /*
+     * 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_AUTO_TEST_SUITE_END()
+
+BOOST_AUTO_TEST_SUITE_END()
+
 } // !server
+
 } // !mlk