view tests/libserver/db/account/main.cpp @ 181:fbfc2555bda5

Common: cleanup
author David Demelier <markand@malikania.fr>
date Fri, 12 Oct 2018 20:24:40 +0200
parents be0d90706ded
children
line wrap: on
line source

/*
 * main.cpp -- unit test for database
 *
 * Copyright (c) 2013-2018 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/broken_database.hpp>
#include <malikania/server/db/database_fixture.hpp>

namespace mlk {

namespace server {

/*
 * Test behaviour with broken implementation.
 * ------------------------------------------------------------------
 */

class broken_fixture {
protected:
    broken_database db_;
};

BOOST_FIXTURE_TEST_SUITE(broken_fixture_suite, broken_fixture)

BOOST_AUTO_TEST_CASE(save)
{
    account ac(db_, "markand", "nopassword");

    try {
        ac.save();
    } catch (...) {}

    BOOST_TEST(ac.is_draft());
}

BOOST_AUTO_TEST_CASE(remove)
{
    db_.set_account_flags(broken_account_dao::allow_flags::publish);
    account ac(db_, "markand", "nopassword");

    ac.save();

    try {
        ac.remove();
    } catch (...) {}

    BOOST_TEST(ac.is_published());
}

BOOST_AUTO_TEST_CASE(set_password)
{
    db_.set_account_flags(broken_account_dao::allow_flags::publish);
    account ac(db_, "markand", "nopassword");

    ac.save();

    try {
        ac.set_password("newpassword");
    } catch (...) {}

    BOOST_TEST(ac.get_password() == "nopassword");
}

BOOST_AUTO_TEST_CASE(set_email)
{
    db_.set_account_flags(broken_account_dao::allow_flags::publish);
    account ac(db_, "markand", "nopassword");

    ac.save();

    try {
        ac.set_email("markand@malikania.fr");
    } catch (...) {}

    BOOST_TEST(ac.get_email() == "");
}

BOOST_AUTO_TEST_CASE(set_firstname)
{
    db_.set_account_flags(broken_account_dao::allow_flags::publish);
    account ac(db_, "markand", "nopassword");

    ac.save();

    try {
        ac.set_firstname("David");
    } catch (...) {}

    BOOST_TEST(ac.get_firstname() == "");
}

BOOST_AUTO_TEST_CASE(set_lastname)
{
    db_.set_account_flags(broken_account_dao::allow_flags::publish);
    account ac(db_, "markand", "nopassword");

    ac.save();

    try {
        ac.set_lastname("David");
    } catch (...) {}

    BOOST_TEST(ac.get_lastname() == "");
}

BOOST_AUTO_TEST_CASE(add_character)
{
    db_.set_account_flags(broken_account_dao::allow_flags::publish);
    account ac(db_, "markand", "nopassword");

    ac.save();

    try {
        ac.add(character(db_, "erekin", "fire"));
    } catch (...) {}

    BOOST_TEST(ac.get_characters().size() == 0U);
}

BOOST_AUTO_TEST_SUITE_END()

/*
 * Generic tests using all backends.
 * ------------------------------------------------------------------
 */
BOOST_AUTO_TEST_SUITE(generic)

void fill(database& db)
{
    account ac(db, "markand", "nopassword");

    ac.set_email("markand@malikania.fr");
    ac.set_firstname("David");
    ac.set_lastname("Demelier");
    ac.save();

    {
        character ch(db, "erekin", "blackmage");

        ch.set_levels({10U, 7U, 12U, 9U, 8U});
        ch.set_factors({20U, 20U, 20U, 20U, 20U});
        ch.set_experience({1000U, 2000U, 3000U, 4000U, 5000U});
        ac.add(std::move(ch));
    }

    {
        character ch(db, "luna", "fairy");

        ch.set_levels({12U, 6U, 12U, 9U, 8U});
        ch.set_factors({20U, 20U, 20U, 20U, 20U});
        ch.set_experience({2000U, 3000U, 4000U, 5000U, 6000U});
        ac.add(std::move(ch));
    }
}


BOOST_AUTO_TEST_CASE_TEMPLATE(load, Database, database_types)
{
    Database db;

    fill(db.db());

    auto ac = db.db().accounts().find_by_login("markand");

    BOOST_TEST(ac->get_login() == "markand");
    BOOST_TEST(ac->get_password() == "nopassword");
    BOOST_TEST(ac->get_email() == "markand@malikania.fr");
    BOOST_TEST(ac->get_firstname() == "David");
    BOOST_TEST(ac->get_lastname() == "Demelier");
    BOOST_TEST(ac->get_characters().size() == 2U);

    const auto& characters = ac->get_characters();
    const auto erekin = std::find_if(characters.begin(), characters.end(), [] (const auto& c) {
        return c.get_nickname() == "erekin";
    });

    BOOST_TEST(erekin->get_nickname() == "erekin");
    BOOST_TEST(erekin->get_classname() == "blackmage");
    BOOST_TEST(erekin->get_levels()[character::hp] == 10U);
    BOOST_TEST(erekin->get_levels()[character::force] == 7U);
    BOOST_TEST(erekin->get_levels()[character::defense] == 12U);
    BOOST_TEST(erekin->get_levels()[character::agility] == 9U);
    BOOST_TEST(erekin->get_levels()[character::luck] == 8U);
    BOOST_TEST(erekin->get_factors()[character::hp] == 20U);
    BOOST_TEST(erekin->get_factors()[character::force] == 20U);
    BOOST_TEST(erekin->get_factors()[character::defense] == 20U);
    BOOST_TEST(erekin->get_factors()[character::agility] == 20U);
    BOOST_TEST(erekin->get_factors()[character::luck] == 20U);
    BOOST_TEST(erekin->get_experience()[character::hp] == 1000U);
    BOOST_TEST(erekin->get_experience()[character::force] == 2000U);
    BOOST_TEST(erekin->get_experience()[character::defense] == 3000U);
    BOOST_TEST(erekin->get_experience()[character::agility] == 4000U);
    BOOST_TEST(erekin->get_experience()[character::luck] == 5000U);

    const auto luna = std::find_if(characters.begin(), characters.end(), [] (const auto& c) {
        return c.get_nickname() == "luna";
    });

    BOOST_TEST(luna->get_nickname() == "luna");
    BOOST_TEST(luna->get_classname() == "fairy");
    BOOST_TEST(luna->get_levels()[character::hp] == 12U);
    BOOST_TEST(luna->get_levels()[character::force] == 6U);
    BOOST_TEST(luna->get_levels()[character::defense] == 12U);
    BOOST_TEST(luna->get_levels()[character::agility] == 9U);
    BOOST_TEST(luna->get_levels()[character::luck] == 8U);
    BOOST_TEST(luna->get_factors()[character::hp] == 20U);
    BOOST_TEST(luna->get_factors()[character::force] == 20U);
    BOOST_TEST(luna->get_factors()[character::defense] == 20U);
    BOOST_TEST(luna->get_factors()[character::agility] == 20U);
    BOOST_TEST(luna->get_factors()[character::luck] == 20U);
    BOOST_TEST(luna->get_experience()[character::hp] == 2000U);
    BOOST_TEST(luna->get_experience()[character::force] == 3000U);
    BOOST_TEST(luna->get_experience()[character::defense] == 4000U);
    BOOST_TEST(luna->get_experience()[character::agility] == 5000U);
    BOOST_TEST(luna->get_experience()[character::luck] == 6000U);
}

BOOST_AUTO_TEST_CASE_TEMPLATE(set_password, Database, database_types)
{
    Database db;

    fill(db.db());
    db.db().accounts().find_by_login("markand")->set_password("hello");

    BOOST_TEST(db.db().accounts().find_by_login("markand")->get_password() == "hello");
}

BOOST_AUTO_TEST_CASE_TEMPLATE(set_email, Database, database_types)
{
    Database db;

    fill(db.db());
    db.db().accounts().find_by_login("markand")->set_email("no@spam.org");

    BOOST_TEST(db.db().accounts().find_by_login("markand")->get_email() == "no@spam.org");
}

BOOST_AUTO_TEST_CASE_TEMPLATE(set_firstname, Database, database_types)
{
    Database db;

    fill(db.db());
    db.db().accounts().find_by_login("markand")->set_firstname("Francis");

    BOOST_TEST(db.db().accounts().find_by_login("markand")->get_firstname() == "Francis");
}

BOOST_AUTO_TEST_CASE_TEMPLATE(set_lastname, Database, database_types)
{
    Database db;

    fill(db.db());
    db.db().accounts().find_by_login("markand")->set_lastname("Lalanne");

    BOOST_TEST(db.db().accounts().find_by_login("markand")->get_lastname() == "Lalanne");
}

BOOST_AUTO_TEST_SUITE_END()

} // !server

} // !mlk