Merge branch 'tests' into 'master'

Tests

See merge request bartoszek/eedb!9
This commit is contained in:
Bartosz Wieczorek 2018-06-11 07:53:16 +00:00
commit bc05f176c5
28 changed files with 242 additions and 122 deletions

View File

@ -16,6 +16,9 @@ set(CMAKE_CXX_STANDARD 17)
set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE) set(CMAKE_EXPORT_COMPILE_COMMANDS TRUE)
set(HUNTER_BUILD_SHARED_LIBS TRUE) set(HUNTER_BUILD_SHARED_LIBS TRUE)
#pip install conan
#cmake -DSIPLASPLAS_LIBCLANG_VERSION=5.0 -DSIPLASPLAS_LIBCLANG_SYSTEM_INCLUDE_DIR=/usr/lib/clang/5.0/include -DSIPLASPLAS_LIBCLANG_LIBRARY=/usr/lib/clang/5.0/lib
include(cmake/Compiler.cmake) include(cmake/Compiler.cmake)
include(cmake/FindAllRequirements.cmake) include(cmake/FindAllRequirements.cmake)
include(cmake/cotire.cmake) include(cmake/cotire.cmake)

View File

@ -0,0 +1 @@
add_compile_options(-pedantic -Wall -Wextra)

View File

@ -5,6 +5,9 @@ find_package(Boost CONFIG REQUIRED ${_BOOST_COMPONENTS})
hunter_add_package(nlohmann_json) hunter_add_package(nlohmann_json)
find_package(nlohmann_json CONFIG REQUIRED) find_package(nlohmann_json CONFIG REQUIRED)
hunter_add_package(inja)
find_package(inja CONFIG REQUIRED)
hunter_add_package(GTest) hunter_add_package(GTest)
find_package(GMock CONFIG REQUIRED) find_package(GMock CONFIG REQUIRED)

View File

@ -2,9 +2,11 @@ set(SOURCES
main.cpp main.cpp
) )
find_package(chaiscript)
add_executable(eedb ${SOURCES}) add_executable(eedb ${SOURCES})
target_link_libraries(eedb target_link_libraries(eedb
PRIVATE webapp PRIVATE webapp
PRIVATE postgres_connector PRIVATE postgres_connector
PRIVATE dl
) )

View File

@ -10,6 +10,8 @@
#include <Wt/WEnvironment.h> #include <Wt/WEnvironment.h>
#include <chaiscript/chaiscript.hpp>
static auto _createSinks() { static auto _createSinks() {
std::vector< spdlog::sink_ptr > sinks; std::vector< spdlog::sink_ptr > sinks;
auto stdout_sink = spdlog::sinks::stdout_sink_mt::instance(); auto stdout_sink = spdlog::sinks::stdout_sink_mt::instance();
@ -41,8 +43,8 @@ static auto createDbConnection(std::function< bool(const std::string &, std::str
} }
} }
std::unique_ptr< Wt::WApplication >createApplication (const Wt::WEnvironment &env) { std::unique_ptr< Wt::WApplication > createApplication(const Wt::WEnvironment & env) {
auto server = env.server(); auto server = env.server();
auto connection = createDbConnection([server](const auto & name, auto & val) { // auto connection = createDbConnection([server](const auto & name, auto & val) { //
return server->readConfigurationProperty(name, val); return server->readConfigurationProperty(name, val);
}); });

View File

@ -17,7 +17,7 @@ target_include_directories( ${LIB}
target_link_libraries( ${LIB} target_link_libraries( ${LIB}
PRIVATE nlohmann_json PRIVATE nlohmann_json
PRIVATE eedb-api PRIVATE eedb_api
) )
# add cotire # add cotire

View File

@ -64,8 +64,6 @@ struct UserDatabase::UserAuthPriv {
return _users->findWith(extractEmail(user)); return _users->findWith(extractEmail(user));
} }
std::unique_ptr< eedb::Users > _users; std::unique_ptr< eedb::Users > _users;
std::optional< std::string > _email; std::optional< std::string > _email;
std::optional< std::string > _unverifiedEmail; std::optional< std::string > _unverifiedEmail;

View File

@ -20,7 +20,7 @@ target_include_directories(${LIB}
) )
target_link_libraries(${LIB} target_link_libraries(${LIB}
PUBLIC eedb-api PUBLIC eedb_api
PRIVATE sqlpp11-connector-postgresql PRIVATE sqlpp11-connector-postgresql
PRIVATE pq PRIVATE pq
PRIVATE Boost::system PRIVATE Boost::system

View File

@ -9,5 +9,5 @@ target_include_directories(${LIB} INTERFACE
) )
target_link_libraries(${LIB} INTERFACE target_link_libraries(${LIB} INTERFACE
eedb-mock eedb_api-mock
) )

View File

@ -46,7 +46,7 @@ struct CategoryImpl::CategoryImplPrivate {
Category * _self{nullptr}; Category * _self{nullptr};
CategoryImplPrivate(Connection & db, Category * parent) : _db{db}, _parent{parent} { CategoryImplPrivate(Connection & db, Category * parent) : _db{db}, _parent{parent} {
auto row = _db(select(columns()).from(table_list()).where(root_path_match()).limit(0ul)); auto row = _db(select(columns()).from(table_list()).where(root_path_match()).limit(1ul));
if(row.empty()) { if(row.empty()) {
// no root category // no root category
row = _db(sqlpp::postgresql::insert_into(t_category) row = _db(sqlpp::postgresql::insert_into(t_category)

View File

@ -5,6 +5,7 @@
#include <eedb/pg/User.hpp> #include <eedb/pg/User.hpp>
#include <eedb/pg/model/all.hpp> #include <eedb/pg/model/all.hpp>
#include <sqlpp11/postgresql/exception.h>
#include <sqlpp11/sqlpp11.h> #include <sqlpp11/sqlpp11.h>
#include <experimental/array> #include <experimental/array>
@ -26,8 +27,8 @@ struct SessionImpl::SessionImplPriv {
return dynamic_cast< const eedb::pg::impl::UserImplPriv * >(u)->id(); return dynamic_cast< const eedb::pg::impl::UserImplPriv * >(u)->id();
} }
template <typename T> template < typename T >
auto select_last(T& t, const eedb::User * u, std::string action) const { auto select_last(T & t, const eedb::User * u, std::string action) const {
using namespace sqlpp; using namespace sqlpp;
return select(t_user_audit.id.as(t)) return select(t_user_audit.id.as(t))
.from(t_user_audit) .from(t_user_audit)
@ -39,32 +40,57 @@ struct SessionImpl::SessionImplPriv {
auto failedLoginCount(const eedb::User * u) const { auto failedLoginCount(const eedb::User * u) const {
using namespace sqlpp; using namespace sqlpp;
return _db((select(count(t_user_audit.id)) try {
.from(t_user_audit.join(select_last(cteLastLogin, u, actions.at(0)).as(sqlpp::alias::a)) return _db((select(count(t_user_audit.id))
.on(verbatim< boolean >("true")) .from(t_user_audit.join(select_last(cteLastLogin, u, actions.at(0)).as(sqlpp::alias::a))
.join(select_last(cteLastFailed, u, actions.at(2)).as(sqlpp::alias::b)) .on(verbatim< boolean >("true"))
.on(verbatim< boolean >("true"))) .join(select_last(cteLastFailed, u, actions.at(2)).as(sqlpp::alias::b))
.where( // .on(verbatim< boolean >("true")))
t_user_audit.auth_info_id == auto_info_id(u) and // .where( //
verbatim< boolean >("cteLastFailed >= cteLastLogin") and // t_user_audit.auth_info_id == auto_info_id(u) and //
(t_user_audit.id >= verbatim< integer >("cteLastLogin"))))) verbatim< boolean >("cteLastFailed >= cteLastLogin") and //
.front() (t_user_audit.id >= verbatim< integer >("cteLastLogin")))))
.count; .front()
.count.value();
} catch(sqlpp::postgresql::sql_error &) {
return 0l;
};
} }
void loginAction(const User * u, const nlohmann::json & payload) { void loginAction(const User * u, const nlohmann::json & payload) {
_db(insert_into(t_user_audit) // assert(u);
.set(t_user_audit.auth_info_id = auto_info_id(u), t_user_audit.action = actions.at(0), t_user_audit.data = payload.dump())); try {
_user = u; _db(
insert_into(t_user_audit) //
.set(t_user_audit.auth_info_id = auto_info_id(u), t_user_audit.action = actions.at(0), t_user_audit.data = payload.dump()));
_user = u;
_db.execute(R"(set session "eedb.user.id" =)" + std::to_string(auto_info_id(_user)) + ";");
} catch(sqlpp::postgresql::sql_error &) {
}
} }
void failedLogin(const User * u, const nlohmann::json & payload) { void failedLogin(const User * u, const nlohmann::json & payload) {
assert(u);
_db(insert_into(t_user_audit) // _db(insert_into(t_user_audit) //
.set(t_user_audit.auth_info_id = auto_info_id(u), t_user_audit.action = actions.at(2), t_user_audit.data = payload.dump())); .set(t_user_audit.auth_info_id = auto_info_id(u), t_user_audit.action = actions.at(2), t_user_audit.data = payload.dump()));
} }
auto lastLoginAttempt(const User *u )const { auto lastLoginAttempt(const User * u) const -> std::chrono::system_clock::time_point {
return _db(select(t_user_audit.when_happened).from(t_user_audit).where(t_user_audit.auth_info_id == auto_info_id(u)).order_by(t_user_audit.id.desc()).limit(1u)).front().when_happened; try {
auto last = _db(select(t_user_audit.when_happened)
.from(t_user_audit)
.where(t_user_audit.auth_info_id == auto_info_id(u))
.order_by(t_user_audit.id.desc())
.limit(1u));
if(last.empty()) {
return std::chrono::system_clock::now();
} else {
return last.front().when_happened.value();
}
} catch(sqlpp::postgresql::sql_error &) {
return std::chrono::system_clock::now();
}
} }
void logout() { void logout() {
@ -96,7 +122,7 @@ uint SessionImpl::failedLogins(const User * u) const {
} }
std::chrono::system_clock::time_point SessionImpl::lastLoginAttempt(const User * user) const { std::chrono::system_clock::time_point SessionImpl::lastLoginAttempt(const User * user) const {
return _priv->lastLoginAttempt(user).value(); return _priv->lastLoginAttempt(user);
} }
void SessionImpl::logout() { void SessionImpl::logout() {

View File

@ -12,7 +12,7 @@ file(GLOB_RECURSE TEST_FILES test_*.cpp )
add_executable( ${TEST_EXECUTABLE_NAME} ${TEST_FILES}) add_executable( ${TEST_EXECUTABLE_NAME} ${TEST_FILES})
target_link_libraries(${TEST_EXECUTABLE_NAME} target_link_libraries(${TEST_EXECUTABLE_NAME}
PRIVATE postgres_connector-mock PRIVATE postgres_connector-mock
PRIVATE eedb-api PRIVATE eedb_api
PRIVATE postgres_connector PRIVATE postgres_connector
PRIVATE GMock::main PRIVATE GMock::main
) )

View File

@ -1,4 +1,4 @@
set(LIB eedb-api) set(LIB eedb_api)
# find packages # find packages
find_package(nlohmann_json CONFIG REQUIRED) find_package(nlohmann_json CONFIG REQUIRED)

View File

@ -47,6 +47,8 @@ class Category {
public: public:
virtual ~Category() = default; virtual ~Category() = default;
virtual int foo(){}
/** /**
* @brief displayName * @brief displayName
* @return category display name * @return category display name

View File

@ -25,6 +25,9 @@ class Parameters;
*/ */
class ItemQueryFilters { class ItemQueryFilters {
public: public:
/**
* @brief ItemQueryFilters blah
*/
ItemQueryFilters() : _category{nullptr} {} ItemQueryFilters() : _category{nullptr} {}
ItemQueryFilters(const Category * category) : _category{category} {} ItemQueryFilters(const Category * category) : _category{category} {}
@ -46,7 +49,7 @@ class ItemQueryFilters {
}; };
namespace item { namespace item {
using Iterator = IteratorTypeErasure::any_iterator< std::unique_ptr<Item> , std::forward_iterator_tag, std::unique_ptr<Item> >; using Iterator = IteratorTypeErasure::any_iterator< std::unique_ptr< Item >, std::forward_iterator_tag, std::unique_ptr< Item > >;
using IteratorRange = boost::iterator_range< Iterator >; using IteratorRange = boost::iterator_range< Iterator >;
class Identyfier { class Identyfier {

View File

@ -1,4 +1,4 @@
set(LIB eedb-mock) set(LIB eedb_api-mock)
# create library # create library
add_library(${LIB} INTERFACE) add_library(${LIB} INTERFACE)

View File

@ -9,8 +9,8 @@ file(GLOB_RECURSE TEST_FILES test_*.cpp )
add_executable( ${TEST_EXECUTABLE_NAME} ${TEST_FILES}) add_executable( ${TEST_EXECUTABLE_NAME} ${TEST_FILES})
target_link_libraries(${TEST_EXECUTABLE_NAME} target_link_libraries(${TEST_EXECUTABLE_NAME}
PRIVATE eedb-api PRIVATE eedb_api
PRIVATE eedb-mock PRIVATE eedb_api-mock
PRIVATE GMock::main PRIVATE GMock::main
) )

View File

@ -29,7 +29,7 @@ target_include_directories(${LIB}
target_link_libraries(${LIB} target_link_libraries(${LIB}
PUBLIC auth PUBLIC auth
PUBLIC eedb-api PUBLIC eedb_api
PUBLIC stdc++fs PUBLIC stdc++fs
PUBLIC nlohmann_json PUBLIC nlohmann_json
PRIVATE ${Wt_HTTP_LIBRARY} PRIVATE ${Wt_HTTP_LIBRARY}

View File

@ -11,10 +11,15 @@ class DefaultCategoriesTree final : public CategoriesTree {
public: public:
DefaultCategoriesTree(std::unique_ptr< CategoriesRepository > categories); DefaultCategoriesTree(std::unique_ptr< CategoriesRepository > categories);
constexpr auto widget_name() const {
return "eedb.home.categories.tree";
}
void registerOnCategoryChanged(std::function< void(const Category *) >) override; void registerOnCategoryChanged(std::function< void(const Category *) >) override;
private: private:
std::unique_ptr< CategoriesRepository > _categories; std::unique_ptr< CategoriesRepository > _categories;
std::unique_ptr< Category > _root;
Wt::Signal< const Category * > _categorySelected; Wt::Signal< const Category * > _categorySelected;
}; };
} // namespace eedb } // namespace eedb

View File

@ -0,0 +1,13 @@
#pragma once
#include <gmock/gmock.h>
#include <eedb/Category.hpp>
namespace eedb{
class CategoriesRepositoryMock : public CategoriesRepository {
public:
MOCK_CONST_METHOD0(root, std::unique_ptr< Category >());
};
}

View File

@ -0,0 +1,18 @@
#pragma once
#include <gmock/gmock.h>
#include <eedb/Category.hpp>
namespace eedb{
class CategoryMock : public Category {
public:
// Category interface
public:
MOCK_CONST_METHOD0(displayName, string_view());
MOCK_CONST_METHOD0(parent, Category *());
MOCK_CONST_METHOD2(create, std::unique_ptr< Category >(std::string name, std::string description));
MOCK_CONST_METHOD0(children, std::unique_ptr< CategoriesChildren >());
};
}

View File

@ -2,6 +2,11 @@
#include <eedb/Factory.hpp> #include <eedb/Factory.hpp>
#include <gmock/gmock.h> #include <gmock/gmock.h>
#include <eedb/Category.hpp>
#include <eedb/Item.hpp>
#include <eedb/Session.hpp>
#include <eedb/Users.hpp>
namespace eedb { namespace eedb {
class FactoryMock : public Factory { class FactoryMock : public Factory {
@ -9,11 +14,11 @@ class FactoryMock : public Factory {
virtual ~FactoryMock() = default; virtual ~FactoryMock() = default;
// Factory interface // Factory interface
public: public:
std::unique_ptr<Users> usersRepository() const override{}; MOCK_CONST_METHOD0(usersRepository, std::unique_ptr< Users >());
std::unique_ptr<CategoriesRepository> categoriesRepository() const override{;} MOCK_CONST_METHOD0(categoriesRepository, std::unique_ptr< CategoriesRepository >());
std::unique_ptr<ItemsRepository> itemsRepository() const override{;} MOCK_CONST_METHOD0(itemsRepository, std::unique_ptr< ItemsRepository >());
std::unique_ptr<Session> session() const override{;} MOCK_CONST_METHOD0(session, std::unique_ptr< Session >());
}; };
} // namespace eedb } // namespace eedb

View File

@ -8,41 +8,47 @@
#include <Wt/WTreeView.h> #include <Wt/WTreeView.h>
namespace eedb { namespace eedb {
DefaultCategoriesTree::DefaultCategoriesTree(std::unique_ptr< CategoriesRepository > categories) : _categories{std::move(categories)} { DefaultCategoriesTree::DefaultCategoriesTree(std::unique_ptr< CategoriesRepository > categories)
: _categories{std::move(categories)}, _root{_categories->root()} {
using namespace Wt; using namespace Wt;
setObjectName("eedb.home.categories.tree"); setObjectName(widget_name());
setSelectionMode(Wt::SelectionMode::Single); setSelectionMode(Wt::SelectionMode::Single);
auto node = std::make_unique< WTreeNode >("Furniture"); auto node = std::make_unique< WTreeNode >(_root->displayName().data());
setTreeRoot(std::move(node)); setTreeRoot(std::move(node));
treeRoot()->label()->setTextFormat(Wt::TextFormat::Plain); treeRoot()->label()->setTextFormat(Wt::TextFormat::Plain);
treeRoot()->setChildCountPolicy(Wt::ChildCountPolicy::Disabled);
treeRoot()->setLoadPolicy(ContentLoading::NextLevel); treeRoot()->setLoadPolicy(ContentLoading::NextLevel);
treeRoot()->addChildNode(cpp14::make_unique< WTreeNode >("Table"))->selected().connect([](bool selected) { // treeRoot()->addChildNode();
if(selected)
std::cout << "selected Table\n";
});
treeRoot()->addChildNode(cpp14::make_unique< WTreeNode >("Cupboard"))->selected().connect([](bool selected) { treeRoot()->addChildNode(cpp14::make_unique< WTreeNode >("Table"))->selected().connect([](bool selected) {
if(selected) if(selected)
std::cout << "selected Cupboard\n"; std::cout << "selected Table\n";
}); });
auto subtree = cpp14::make_unique< WTreeNode >("Chair"); treeRoot()->addChildNode(cpp14::make_unique< WTreeNode >("Cupboard"))->selected().connect([](bool selected) {
auto subtree_ = treeRoot()->addChildNode(std::move(subtree)); if(selected)
treeRoot()->addChildNode(cpp14::make_unique< WTreeNode >("Coach")); std::cout << "selected Cupboard\n";
treeRoot()->expand(); });
subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Doc")); auto subtree = cpp14::make_unique< WTreeNode >("Chair");
subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Grumpy")); auto subtree_ = treeRoot()->addChildNode(std::move(subtree));
subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Happy")); treeRoot()->addChildNode(cpp14::make_unique< WTreeNode >("Coach"));
subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Sneezy")); treeRoot()->expand();
subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Dopey"));
subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Bashful")); subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Doc"));
subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Sleepy")); subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Grumpy"));
subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Happy"));
subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Sneezy"));
subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Dopey"));
subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Bashful"));
subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Sleepy"));
// Wt::WTreeNode node{""}; // Wt::WTreeNode node{""};

View File

@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.0.2)
#find packages #find packages
find_package(GMock CONFIG REQUIRED) find_package(GMock CONFIG REQUIRED)
set(TEST_EXECUTABLE_NAME test-eedb_app) set(TEST_EXECUTABLE_NAME test-webapp)
#add test files #add test files
file(GLOB_RECURSE TEST_FILES *.cpp ) file(GLOB_RECURSE TEST_FILES *.cpp )
@ -11,7 +11,7 @@ file(GLOB_RECURSE TEST_FILES *.cpp )
add_executable( ${TEST_EXECUTABLE_NAME} ${TEST_FILES}) add_executable( ${TEST_EXECUTABLE_NAME} ${TEST_FILES})
target_link_libraries(${TEST_EXECUTABLE_NAME} target_link_libraries(${TEST_EXECUTABLE_NAME}
PRIVATE ${Wt_TEST_LIBRARY} PRIVATE ${Wt_TEST_LIBRARY}
PRIVATE eedb-api PRIVATE eedb_api
PRIVATE webapp PRIVATE webapp
PRIVATE webapp-mock PRIVATE webapp-mock
PRIVATE GMock::gmock PRIVATE GMock::gmock

View File

@ -3,6 +3,9 @@
#include <Wt/Test/WTestEnvironment.h> #include <Wt/Test/WTestEnvironment.h>
#include <Wt/WApplication.h> #include <Wt/WApplication.h>
#include <Wt/WContainerWidget.h>
#include <utils/UniquePtrMockWrapper.hpp>
class WidgetTest : public testing::Test { class WidgetTest : public testing::Test {
public: public:
@ -10,7 +13,16 @@ class WidgetTest : public testing::Test {
template < typename T > template < typename T >
T * ut_find(const std::string & id) { T * ut_find(const std::string & id) {
T * item = dynamic_cast< T * >(app.findWidget(id)); auto findByAnything = [this](const std::string & id) {
auto ptr = app.root()->findById(id);
if (not ptr){
ptr = app.root()->find(id);
}
return ptr;
};
auto ptr = findByAnything(id);
T * item = dynamic_cast< T * >(ptr);
_assert_not_null(item); _assert_not_null(item);
return item; return item;
} }

View File

@ -7,7 +7,7 @@ class nullsink : public spdlog::sinks::sink{
// sink interface // sink interface
public: public:
void log(const spdlog::details::log_msg &msg) override{} void log(const spdlog::details::log_msg &) override{}
void flush() override{} void flush() override{}
}; };

View File

@ -2,21 +2,42 @@
#include <widget/DefaultCategoryTree.hpp> #include <widget/DefaultCategoryTree.hpp>
#include <eedb/mock/CategoriesRepositoryMock.hpp>
#include <eedb/mock/CategoryMock.hpp>
#include <Wt/WTreeView.h> #include <Wt/WTreeView.h>
//class CategoriesTreeTest : public WidgetTest { using namespace testing;
// public:
// CategoriesTreeTest() : WidgetTest(), sut(std::make_unique< eedb::DefaultCategoriesTree >()) {
// sut->attachTo(app.root());
// }
// auto find_tree() {
// return ut_find< Wt::WTreeView >("home.categories");
// }
// protected: class CategoriesTreeTest : public WidgetTest {
// std::unique_ptr< eedb::DefaultCategoriesTree > sut; public:
//}; CategoriesTreeTest() : WidgetTest(), sut{nullptr} {
}
//TEST_F(CategoriesTreeTest, hasElements) { auto init(){
// find_tree(); EXPECT_CALL(*_categoriesRepo, root()).WillOnce(Return(ByMove(_categoryMock.getPtr())));
//} EXPECT_CALL(*_categoryMock, displayName() ).WillOnce(Return("root"));
sut.reset(new eedb::DefaultCategoriesTree(_categoriesRepo.getPtr()));
app.root()->addWidget(sut.getPtr());
}
auto find_tree() {
return ut_find< Wt::WWidget >("eedb.home.categories.tree");
}
protected:
UniquePtrMockWrapper< eedb::CategoriesRepositoryMock > _categoriesRepo;
UniquePtrMockWrapper< eedb::CategoryMock > _categoryMock;
UniquePtrMockWrapper< eedb::DefaultCategoriesTree > sut;
};
TEST_F(CategoriesTreeTest, hasTree) {
init();
EXPECT_TRUE(find_tree());
}
TEST_F(CategoriesTreeTest, createsRoot) {
init();
}

View File

@ -19,10 +19,10 @@
class Veryfier : public Wt::Auth::PasswordService::AbstractVerifier { class Veryfier : public Wt::Auth::PasswordService::AbstractVerifier {
public: public:
bool needsUpdate(const Wt::Auth::PasswordHash & hash) const override { bool needsUpdate(const Wt::Auth::PasswordHash & ) const override {
return false; return false;
} }
Wt::Auth::PasswordHash hashPassword(const Wt::WString & password) const override { Wt::Auth::PasswordHash hashPassword(const Wt::WString & ) const override {
return {"", "", ""}; return {"", "", ""};
} }
MOCK_CONST_METHOD2(verify, bool(const Wt::WString & password, const Wt::Auth::PasswordHash & hash)); MOCK_CONST_METHOD2(verify, bool(const Wt::WString & password, const Wt::Auth::PasswordHash & hash));
@ -54,13 +54,13 @@ class DefaultAuthPageTest : public Test {
services.authService()->setEmailVerificationRequired(false); services.authService()->setEmailVerificationRequired(false);
// sut = std::make_unique< eedb::DefaultAuthPage >(services, this->usedDatabaseMock.getPtr(), login); // sut = std::make_unique< eedb::DefaultAuthPage >(services, this->usedDatabaseMock.getPtr(), login);
sut->model()->setValidator("password", nullptr); // sut->model()->setValidator("password", nullptr);
sut->create(); // sut->create();
sut->registerOnUserStrongLogin(_strongLoginCallback.AsStdFunction()); // sut->registerOnUserStrongLogin(_strongLoginCallback.AsStdFunction());
sut->registerOnUserWeakLogin(_weakLoginCallback.AsStdFunction()); // sut->registerOnUserWeakLogin(_weakLoginCallback.AsStdFunction());
sut->registerOnLoginAttempt(_attemptLoginCallback.AsStdFunction()); // sut->registerOnLoginAttempt(_attemptLoginCallback.AsStdFunction());
sut->registerOnUserLogout(_logoutCallback.AsStdFunction()); // sut->registerOnUserLogout(_logoutCallback.AsStdFunction());
} }
Wt::WPushButton * loginBtn() const { Wt::WPushButton * loginBtn() const {
@ -103,51 +103,51 @@ class DefaultAuthPageTest : public Test {
std::unique_ptr< eedb::DefaultAuthPage > sut; std::unique_ptr< eedb::DefaultAuthPage > sut;
}; };
TEST_F(DefaultAuthPageTest, emitLoginNoUser) { //TEST_F(DefaultAuthPageTest, emitLoginNoUser) {
EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString(""))) // EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString("")))
.Times(AtLeast(2)) // .Times(AtLeast(2))
.WillRepeatedly(Return(Wt::Auth::User{})); // .WillRepeatedly(Return(Wt::Auth::User{}));
clickLogin(); // clickLogin();
} //}
TEST_F(DefaultAuthPageTest, emitLoginBadUser) { //TEST_F(DefaultAuthPageTest, emitLoginBadUser) {
EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString("username"))) // EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString("username")))
.Times(AtLeast(2)) // .Times(AtLeast(2))
.WillRepeatedly(Return(Wt::Auth::User{})); // .WillRepeatedly(Return(Wt::Auth::User{}));
setUsername("username"); // setUsername("username");
setPassword("password"); // setPassword("password");
clickLogin(); // clickLogin();
} //}
TEST_F(DefaultAuthPageTest, emitLoginGoodUser) { //TEST_F(DefaultAuthPageTest, emitLoginGoodUser) {
EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString("username"))) // EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString("username")))
.Times(AtLeast(2)) // .Times(AtLeast(2))
.WillRepeatedly(Return(Wt::Auth::User{"id", *usedDatabaseMock})); // .WillRepeatedly(Return(Wt::Auth::User{"id", *usedDatabaseMock}));
EXPECT_CALL(*usedDatabaseMock, identity(_, _)).WillOnce(Return("user")); // EXPECT_CALL(*usedDatabaseMock, identity(_, _)).WillOnce(Return("user"));
EXPECT_CALL(*passwordVerifier, verify(Wt::WString("password"), _)).WillOnce(Return(true)); // EXPECT_CALL(*passwordVerifier, verify(Wt::WString("password"), _)).WillOnce(Return(true));
EXPECT_CALL(_strongLoginCallback, Call(_, _)); // EXPECT_CALL(_strongLoginCallback, Call(_, _));
setUsername("username"); // setUsername("username");
setPassword("password"); // setPassword("password");
clickLogin(); // clickLogin();
} //}
TEST_F(DefaultAuthPageTest, loginAttempt) { //TEST_F(DefaultAuthPageTest, loginAttempt) {
EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString("username"))) // EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString("username")))
.Times(AtLeast(2)) // .Times(AtLeast(2))
.WillRepeatedly(Return(Wt::Auth::User{"id", *usedDatabaseMock})); // .WillRepeatedly(Return(Wt::Auth::User{"id", *usedDatabaseMock}));
EXPECT_CALL(*passwordVerifier, verify(Wt::WString("password"), _)).WillOnce(Return(false)); // EXPECT_CALL(*passwordVerifier, verify(Wt::WString("password"), _)).WillOnce(Return(false));
// EXPECT_CALL(_attemptLoginCallback, Call(_, _)); //// EXPECT_CALL(_attemptLoginCallback, Call(_, _));
setUsername("username"); // setUsername("username");
setPassword("password"); // setPassword("password");
clickLogin(); // clickLogin();
} //}