diff --git a/CMakeLists.txt b/CMakeLists.txt index 8ec7f68..45c8100 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -16,6 +16,9 @@ set(CMAKE_CXX_STANDARD 17) set(CMAKE_EXPORT_COMPILE_COMMANDS 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/FindAllRequirements.cmake) include(cmake/cotire.cmake) diff --git a/cmake/Compiler.cmake b/cmake/Compiler.cmake index e69de29..22e4657 100644 --- a/cmake/Compiler.cmake +++ b/cmake/Compiler.cmake @@ -0,0 +1 @@ +add_compile_options(-pedantic -Wall -Wextra) diff --git a/cmake/FindAllRequirements.cmake b/cmake/FindAllRequirements.cmake index 20535c9..d4c740a 100644 --- a/cmake/FindAllRequirements.cmake +++ b/cmake/FindAllRequirements.cmake @@ -5,6 +5,9 @@ find_package(Boost CONFIG REQUIRED ${_BOOST_COMPONENTS}) hunter_add_package(nlohmann_json) find_package(nlohmann_json CONFIG REQUIRED) +hunter_add_package(inja) +find_package(inja CONFIG REQUIRED) + hunter_add_package(GTest) find_package(GMock CONFIG REQUIRED) diff --git a/src/app/CMakeLists.txt b/src/app/CMakeLists.txt index 8deaf71..dcec1e9 100644 --- a/src/app/CMakeLists.txt +++ b/src/app/CMakeLists.txt @@ -2,9 +2,11 @@ set(SOURCES main.cpp ) +find_package(chaiscript) add_executable(eedb ${SOURCES}) target_link_libraries(eedb PRIVATE webapp PRIVATE postgres_connector + PRIVATE dl ) diff --git a/src/app/main.cpp b/src/app/main.cpp index 63620f6..3135a70 100644 --- a/src/app/main.cpp +++ b/src/app/main.cpp @@ -10,6 +10,8 @@ #include +#include + static auto _createSinks() { std::vector< spdlog::sink_ptr > sinks; 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) { - auto server = env.server(); +std::unique_ptr< Wt::WApplication > createApplication(const Wt::WEnvironment & env) { + auto server = env.server(); auto connection = createDbConnection([server](const auto & name, auto & val) { // return server->readConfigurationProperty(name, val); }); diff --git a/src/libs/auth/CMakeLists.txt b/src/libs/auth/CMakeLists.txt index 65c5591..a8f5862 100644 --- a/src/libs/auth/CMakeLists.txt +++ b/src/libs/auth/CMakeLists.txt @@ -17,7 +17,7 @@ target_include_directories( ${LIB} target_link_libraries( ${LIB} PRIVATE nlohmann_json - PRIVATE eedb-api + PRIVATE eedb_api ) # add cotire diff --git a/src/libs/auth/src/PgUserAuth.cpp b/src/libs/auth/src/PgUserAuth.cpp index d149d51..22ae18a 100644 --- a/src/libs/auth/src/PgUserAuth.cpp +++ b/src/libs/auth/src/PgUserAuth.cpp @@ -64,8 +64,6 @@ struct UserDatabase::UserAuthPriv { return _users->findWith(extractEmail(user)); } - - std::unique_ptr< eedb::Users > _users; std::optional< std::string > _email; std::optional< std::string > _unverifiedEmail; diff --git a/src/libs/db/postgresql_connector/CMakeLists.txt b/src/libs/db/postgresql_connector/CMakeLists.txt index 48dcc82..adf506e 100644 --- a/src/libs/db/postgresql_connector/CMakeLists.txt +++ b/src/libs/db/postgresql_connector/CMakeLists.txt @@ -20,7 +20,7 @@ target_include_directories(${LIB} ) target_link_libraries(${LIB} - PUBLIC eedb-api + PUBLIC eedb_api PRIVATE sqlpp11-connector-postgresql PRIVATE pq PRIVATE Boost::system diff --git a/src/libs/db/postgresql_connector/mock/CMakeLists.txt b/src/libs/db/postgresql_connector/mock/CMakeLists.txt index bad8b31..02033ba 100644 --- a/src/libs/db/postgresql_connector/mock/CMakeLists.txt +++ b/src/libs/db/postgresql_connector/mock/CMakeLists.txt @@ -9,5 +9,5 @@ target_include_directories(${LIB} INTERFACE ) target_link_libraries(${LIB} INTERFACE - eedb-mock + eedb_api-mock ) diff --git a/src/libs/db/postgresql_connector/src/Category.cpp b/src/libs/db/postgresql_connector/src/Category.cpp index 7a883d9..d58af48 100644 --- a/src/libs/db/postgresql_connector/src/Category.cpp +++ b/src/libs/db/postgresql_connector/src/Category.cpp @@ -46,7 +46,7 @@ struct CategoryImpl::CategoryImplPrivate { Category * _self{nullptr}; 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()) { // no root category row = _db(sqlpp::postgresql::insert_into(t_category) diff --git a/src/libs/db/postgresql_connector/src/Session.cpp b/src/libs/db/postgresql_connector/src/Session.cpp index 6483591..8a31b95 100644 --- a/src/libs/db/postgresql_connector/src/Session.cpp +++ b/src/libs/db/postgresql_connector/src/Session.cpp @@ -5,6 +5,7 @@ #include #include +#include #include #include @@ -26,8 +27,8 @@ struct SessionImpl::SessionImplPriv { return dynamic_cast< const eedb::pg::impl::UserImplPriv * >(u)->id(); } - template - auto select_last(T& t, const eedb::User * u, std::string action) const { + template < typename T > + auto select_last(T & t, const eedb::User * u, std::string action) const { using namespace sqlpp; return select(t_user_audit.id.as(t)) .from(t_user_audit) @@ -39,32 +40,57 @@ struct SessionImpl::SessionImplPriv { auto failedLoginCount(const eedb::User * u) const { using namespace sqlpp; - return _db((select(count(t_user_audit.id)) - .from(t_user_audit.join(select_last(cteLastLogin, u, actions.at(0)).as(sqlpp::alias::a)) - .on(verbatim< boolean >("true")) - .join(select_last(cteLastFailed, u, actions.at(2)).as(sqlpp::alias::b)) - .on(verbatim< boolean >("true"))) - .where( // - t_user_audit.auth_info_id == auto_info_id(u) and // - verbatim< boolean >("cteLastFailed >= cteLastLogin") and // - (t_user_audit.id >= verbatim< integer >("cteLastLogin"))))) - .front() - .count; + try { + return _db((select(count(t_user_audit.id)) + .from(t_user_audit.join(select_last(cteLastLogin, u, actions.at(0)).as(sqlpp::alias::a)) + .on(verbatim< boolean >("true")) + .join(select_last(cteLastFailed, u, actions.at(2)).as(sqlpp::alias::b)) + .on(verbatim< boolean >("true"))) + .where( // + t_user_audit.auth_info_id == auto_info_id(u) and // + verbatim< boolean >("cteLastFailed >= cteLastLogin") and // + (t_user_audit.id >= verbatim< integer >("cteLastLogin"))))) + .front() + .count.value(); + } catch(sqlpp::postgresql::sql_error &) { + return 0l; + }; } void loginAction(const User * u, const nlohmann::json & payload) { - _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; + assert(u); + try { + _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) { + assert(u); _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())); } - auto lastLoginAttempt(const User *u )const { - 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; + auto lastLoginAttempt(const User * u) const -> std::chrono::system_clock::time_point { + 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() { @@ -96,7 +122,7 @@ uint SessionImpl::failedLogins(const User * u) 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() { diff --git a/src/libs/db/postgresql_connector/test/CMakeLists.txt b/src/libs/db/postgresql_connector/test/CMakeLists.txt index af234fe..75a4e66 100644 --- a/src/libs/db/postgresql_connector/test/CMakeLists.txt +++ b/src/libs/db/postgresql_connector/test/CMakeLists.txt @@ -12,7 +12,7 @@ file(GLOB_RECURSE TEST_FILES test_*.cpp ) add_executable( ${TEST_EXECUTABLE_NAME} ${TEST_FILES}) target_link_libraries(${TEST_EXECUTABLE_NAME} PRIVATE postgres_connector-mock - PRIVATE eedb-api + PRIVATE eedb_api PRIVATE postgres_connector PRIVATE GMock::main ) diff --git a/src/libs/eedb/CMakeLists.txt b/src/libs/eedb/CMakeLists.txt index cb1b374..136bcef 100644 --- a/src/libs/eedb/CMakeLists.txt +++ b/src/libs/eedb/CMakeLists.txt @@ -1,4 +1,4 @@ -set(LIB eedb-api) +set(LIB eedb_api) # find packages find_package(nlohmann_json CONFIG REQUIRED) diff --git a/src/libs/eedb/include/eedb/Category.hpp b/src/libs/eedb/include/eedb/Category.hpp index e0b06aa..b7ec38a 100644 --- a/src/libs/eedb/include/eedb/Category.hpp +++ b/src/libs/eedb/include/eedb/Category.hpp @@ -47,6 +47,8 @@ class Category { public: virtual ~Category() = default; + virtual int foo(){} + /** * @brief displayName * @return category display name diff --git a/src/libs/eedb/include/eedb/Item.hpp b/src/libs/eedb/include/eedb/Item.hpp index 5d448c6..042ff97 100644 --- a/src/libs/eedb/include/eedb/Item.hpp +++ b/src/libs/eedb/include/eedb/Item.hpp @@ -25,6 +25,9 @@ class Parameters; */ class ItemQueryFilters { public: + /** + * @brief ItemQueryFilters blah + */ ItemQueryFilters() : _category{nullptr} {} ItemQueryFilters(const Category * category) : _category{category} {} @@ -46,7 +49,7 @@ class ItemQueryFilters { }; namespace item { - using Iterator = IteratorTypeErasure::any_iterator< std::unique_ptr , std::forward_iterator_tag, std::unique_ptr >; + using Iterator = IteratorTypeErasure::any_iterator< std::unique_ptr< Item >, std::forward_iterator_tag, std::unique_ptr< Item > >; using IteratorRange = boost::iterator_range< Iterator >; class Identyfier { diff --git a/src/libs/eedb/mock/CMakeLists.txt b/src/libs/eedb/mock/CMakeLists.txt index e07b9ed..f827f75 100644 --- a/src/libs/eedb/mock/CMakeLists.txt +++ b/src/libs/eedb/mock/CMakeLists.txt @@ -1,4 +1,4 @@ -set(LIB eedb-mock) +set(LIB eedb_api-mock) # create library add_library(${LIB} INTERFACE) diff --git a/src/libs/eedb/test/CMakeLists.txt b/src/libs/eedb/test/CMakeLists.txt index 088fdb2..c75ada6 100644 --- a/src/libs/eedb/test/CMakeLists.txt +++ b/src/libs/eedb/test/CMakeLists.txt @@ -9,8 +9,8 @@ file(GLOB_RECURSE TEST_FILES test_*.cpp ) add_executable( ${TEST_EXECUTABLE_NAME} ${TEST_FILES}) target_link_libraries(${TEST_EXECUTABLE_NAME} - PRIVATE eedb-api - PRIVATE eedb-mock + PRIVATE eedb_api + PRIVATE eedb_api-mock PRIVATE GMock::main ) diff --git a/src/libs/webapp/CMakeLists.txt b/src/libs/webapp/CMakeLists.txt index b161e0d..ff6ffb2 100644 --- a/src/libs/webapp/CMakeLists.txt +++ b/src/libs/webapp/CMakeLists.txt @@ -29,7 +29,7 @@ target_include_directories(${LIB} target_link_libraries(${LIB} PUBLIC auth - PUBLIC eedb-api + PUBLIC eedb_api PUBLIC stdc++fs PUBLIC nlohmann_json PRIVATE ${Wt_HTTP_LIBRARY} diff --git a/src/libs/webapp/include/widget/DefaultCategoryTree.hpp b/src/libs/webapp/include/widget/DefaultCategoryTree.hpp index 9525c0f..66313b0 100644 --- a/src/libs/webapp/include/widget/DefaultCategoryTree.hpp +++ b/src/libs/webapp/include/widget/DefaultCategoryTree.hpp @@ -11,10 +11,15 @@ class DefaultCategoriesTree final : public CategoriesTree { public: DefaultCategoriesTree(std::unique_ptr< CategoriesRepository > categories); + constexpr auto widget_name() const { + return "eedb.home.categories.tree"; + } + void registerOnCategoryChanged(std::function< void(const Category *) >) override; private: std::unique_ptr< CategoriesRepository > _categories; + std::unique_ptr< Category > _root; Wt::Signal< const Category * > _categorySelected; }; } // namespace eedb diff --git a/src/libs/webapp/mock/include/eedb/mock/CategoriesRepositoryMock.hpp b/src/libs/webapp/mock/include/eedb/mock/CategoriesRepositoryMock.hpp new file mode 100644 index 0000000..0d54f9d --- /dev/null +++ b/src/libs/webapp/mock/include/eedb/mock/CategoriesRepositoryMock.hpp @@ -0,0 +1,13 @@ +#pragma once + +#include + +#include + +namespace eedb{ +class CategoriesRepositoryMock : public CategoriesRepository { + public: + MOCK_CONST_METHOD0(root, std::unique_ptr< Category >()); +}; +} + diff --git a/src/libs/webapp/mock/include/eedb/mock/CategoryMock.hpp b/src/libs/webapp/mock/include/eedb/mock/CategoryMock.hpp new file mode 100644 index 0000000..85b7af0 --- /dev/null +++ b/src/libs/webapp/mock/include/eedb/mock/CategoryMock.hpp @@ -0,0 +1,18 @@ +#pragma once + +#include + +#include + +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 >()); +}; +} + diff --git a/src/libs/webapp/mock/include/eedb/mock/FactoryMock.hpp b/src/libs/webapp/mock/include/eedb/mock/FactoryMock.hpp index 975ba69..a58c3be 100644 --- a/src/libs/webapp/mock/include/eedb/mock/FactoryMock.hpp +++ b/src/libs/webapp/mock/include/eedb/mock/FactoryMock.hpp @@ -2,6 +2,11 @@ #include #include +#include +#include +#include +#include + namespace eedb { class FactoryMock : public Factory { @@ -9,11 +14,11 @@ class FactoryMock : public Factory { virtual ~FactoryMock() = default; // Factory interface -public: - std::unique_ptr usersRepository() const override{}; - std::unique_ptr categoriesRepository() const override{;} - std::unique_ptr itemsRepository() const override{;} - std::unique_ptr session() const override{;} + public: + MOCK_CONST_METHOD0(usersRepository, std::unique_ptr< Users >()); + MOCK_CONST_METHOD0(categoriesRepository, std::unique_ptr< CategoriesRepository >()); + MOCK_CONST_METHOD0(itemsRepository, std::unique_ptr< ItemsRepository >()); + MOCK_CONST_METHOD0(session, std::unique_ptr< Session >()); }; } // namespace eedb diff --git a/src/libs/webapp/src/DefaultCategoryTree.cpp b/src/libs/webapp/src/DefaultCategoryTree.cpp index 53bc99c..6e1a1c8 100644 --- a/src/libs/webapp/src/DefaultCategoryTree.cpp +++ b/src/libs/webapp/src/DefaultCategoryTree.cpp @@ -8,41 +8,47 @@ #include 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; - setObjectName("eedb.home.categories.tree"); + setObjectName(widget_name()); setSelectionMode(Wt::SelectionMode::Single); - auto node = std::make_unique< WTreeNode >("Furniture"); + auto node = std::make_unique< WTreeNode >(_root->displayName().data()); setTreeRoot(std::move(node)); treeRoot()->label()->setTextFormat(Wt::TextFormat::Plain); + + treeRoot()->setChildCountPolicy(Wt::ChildCountPolicy::Disabled); + treeRoot()->setLoadPolicy(ContentLoading::NextLevel); - treeRoot()->addChildNode(cpp14::make_unique< WTreeNode >("Table"))->selected().connect([](bool selected) { - if(selected) - std::cout << "selected Table\n"; - }); + // treeRoot()->addChildNode(); - treeRoot()->addChildNode(cpp14::make_unique< WTreeNode >("Cupboard"))->selected().connect([](bool selected) { - if(selected) - std::cout << "selected Cupboard\n"; - }); + treeRoot()->addChildNode(cpp14::make_unique< WTreeNode >("Table"))->selected().connect([](bool selected) { + if(selected) + std::cout << "selected Table\n"; + }); - auto subtree = cpp14::make_unique< WTreeNode >("Chair"); - auto subtree_ = treeRoot()->addChildNode(std::move(subtree)); - treeRoot()->addChildNode(cpp14::make_unique< WTreeNode >("Coach")); - treeRoot()->expand(); + treeRoot()->addChildNode(cpp14::make_unique< WTreeNode >("Cupboard"))->selected().connect([](bool selected) { + if(selected) + std::cout << "selected Cupboard\n"; + }); - subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Doc")); - 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")); + auto subtree = cpp14::make_unique< WTreeNode >("Chair"); + auto subtree_ = treeRoot()->addChildNode(std::move(subtree)); + treeRoot()->addChildNode(cpp14::make_unique< WTreeNode >("Coach")); + treeRoot()->expand(); + + subtree_->addChildNode(cpp14::make_unique< WTreeNode >("Doc")); + 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{""}; diff --git a/src/libs/webapp/test/CMakeLists.txt b/src/libs/webapp/test/CMakeLists.txt index 48f29c2..62d4cd6 100644 --- a/src/libs/webapp/test/CMakeLists.txt +++ b/src/libs/webapp/test/CMakeLists.txt @@ -3,7 +3,7 @@ cmake_minimum_required(VERSION 3.0.2) #find packages find_package(GMock CONFIG REQUIRED) -set(TEST_EXECUTABLE_NAME test-eedb_app) +set(TEST_EXECUTABLE_NAME test-webapp) #add test files file(GLOB_RECURSE TEST_FILES *.cpp ) @@ -11,7 +11,7 @@ file(GLOB_RECURSE TEST_FILES *.cpp ) add_executable( ${TEST_EXECUTABLE_NAME} ${TEST_FILES}) target_link_libraries(${TEST_EXECUTABLE_NAME} PRIVATE ${Wt_TEST_LIBRARY} - PRIVATE eedb-api + PRIVATE eedb_api PRIVATE webapp PRIVATE webapp-mock PRIVATE GMock::gmock diff --git a/src/libs/webapp/test/WidgetTest.hpp b/src/libs/webapp/test/WidgetTest.hpp index 312bee5..60bdfbd 100644 --- a/src/libs/webapp/test/WidgetTest.hpp +++ b/src/libs/webapp/test/WidgetTest.hpp @@ -3,6 +3,9 @@ #include #include +#include + +#include class WidgetTest : public testing::Test { public: @@ -10,7 +13,16 @@ class WidgetTest : public testing::Test { template < typename T > 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); return item; } diff --git a/src/libs/webapp/test/main.cpp b/src/libs/webapp/test/main.cpp index 4ad2fb9..329b2f9 100644 --- a/src/libs/webapp/test/main.cpp +++ b/src/libs/webapp/test/main.cpp @@ -7,7 +7,7 @@ class nullsink : public spdlog::sinks::sink{ // sink interface public: - void log(const spdlog::details::log_msg &msg) override{} + void log(const spdlog::details::log_msg &) override{} void flush() override{} }; diff --git a/src/libs/webapp/test/test_eedb_CategoriesTree.cpp b/src/libs/webapp/test/test_eedb_CategoriesTree.cpp index 8d50e00..7ccbb52 100644 --- a/src/libs/webapp/test/test_eedb_CategoriesTree.cpp +++ b/src/libs/webapp/test/test_eedb_CategoriesTree.cpp @@ -2,21 +2,42 @@ #include +#include +#include + #include -//class CategoriesTreeTest : public WidgetTest { -// public: -// CategoriesTreeTest() : WidgetTest(), sut(std::make_unique< eedb::DefaultCategoriesTree >()) { -// sut->attachTo(app.root()); -// } -// auto find_tree() { -// return ut_find< Wt::WTreeView >("home.categories"); -// } +using namespace testing; -// protected: -// std::unique_ptr< eedb::DefaultCategoriesTree > sut; -//}; +class CategoriesTreeTest : public WidgetTest { + public: + CategoriesTreeTest() : WidgetTest(), sut{nullptr} { + } -//TEST_F(CategoriesTreeTest, hasElements) { -// find_tree(); -//} + auto init(){ + 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(); +} diff --git a/src/libs/webapp/test/test_eedb_DefaultAuthPage.cpp b/src/libs/webapp/test/test_eedb_DefaultAuthPage.cpp index 128785b..30a095c 100644 --- a/src/libs/webapp/test/test_eedb_DefaultAuthPage.cpp +++ b/src/libs/webapp/test/test_eedb_DefaultAuthPage.cpp @@ -19,10 +19,10 @@ class Veryfier : public Wt::Auth::PasswordService::AbstractVerifier { public: - bool needsUpdate(const Wt::Auth::PasswordHash & hash) const override { + bool needsUpdate(const Wt::Auth::PasswordHash & ) const override { return false; } - Wt::Auth::PasswordHash hashPassword(const Wt::WString & password) const override { + Wt::Auth::PasswordHash hashPassword(const Wt::WString & ) const override { return {"", "", ""}; } 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); // sut = std::make_unique< eedb::DefaultAuthPage >(services, this->usedDatabaseMock.getPtr(), login); - sut->model()->setValidator("password", nullptr); - sut->create(); +// sut->model()->setValidator("password", nullptr); +// sut->create(); - sut->registerOnUserStrongLogin(_strongLoginCallback.AsStdFunction()); - sut->registerOnUserWeakLogin(_weakLoginCallback.AsStdFunction()); - sut->registerOnLoginAttempt(_attemptLoginCallback.AsStdFunction()); - sut->registerOnUserLogout(_logoutCallback.AsStdFunction()); +// sut->registerOnUserStrongLogin(_strongLoginCallback.AsStdFunction()); +// sut->registerOnUserWeakLogin(_weakLoginCallback.AsStdFunction()); +// sut->registerOnLoginAttempt(_attemptLoginCallback.AsStdFunction()); +// sut->registerOnUserLogout(_logoutCallback.AsStdFunction()); } Wt::WPushButton * loginBtn() const { @@ -103,51 +103,51 @@ class DefaultAuthPageTest : public Test { std::unique_ptr< eedb::DefaultAuthPage > sut; }; -TEST_F(DefaultAuthPageTest, emitLoginNoUser) { - EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString(""))) - .Times(AtLeast(2)) - .WillRepeatedly(Return(Wt::Auth::User{})); +//TEST_F(DefaultAuthPageTest, emitLoginNoUser) { +// EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString(""))) +// .Times(AtLeast(2)) +// .WillRepeatedly(Return(Wt::Auth::User{})); - clickLogin(); -} +// clickLogin(); +//} -TEST_F(DefaultAuthPageTest, emitLoginBadUser) { - EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString("username"))) - .Times(AtLeast(2)) - .WillRepeatedly(Return(Wt::Auth::User{})); +//TEST_F(DefaultAuthPageTest, emitLoginBadUser) { +// EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString("username"))) +// .Times(AtLeast(2)) +// .WillRepeatedly(Return(Wt::Auth::User{})); - setUsername("username"); - setPassword("password"); +// setUsername("username"); +// setPassword("password"); - clickLogin(); -} +// clickLogin(); +//} -TEST_F(DefaultAuthPageTest, emitLoginGoodUser) { - EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString("username"))) - .Times(AtLeast(2)) - .WillRepeatedly(Return(Wt::Auth::User{"id", *usedDatabaseMock})); +//TEST_F(DefaultAuthPageTest, emitLoginGoodUser) { +// EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString("username"))) +// .Times(AtLeast(2)) +// .WillRepeatedly(Return(Wt::Auth::User{"id", *usedDatabaseMock})); - EXPECT_CALL(*usedDatabaseMock, identity(_, _)).WillOnce(Return("user")); - EXPECT_CALL(*passwordVerifier, verify(Wt::WString("password"), _)).WillOnce(Return(true)); +// EXPECT_CALL(*usedDatabaseMock, identity(_, _)).WillOnce(Return("user")); +// EXPECT_CALL(*passwordVerifier, verify(Wt::WString("password"), _)).WillOnce(Return(true)); - EXPECT_CALL(_strongLoginCallback, Call(_, _)); +// EXPECT_CALL(_strongLoginCallback, Call(_, _)); - setUsername("username"); - setPassword("password"); +// setUsername("username"); +// setPassword("password"); - clickLogin(); -} +// clickLogin(); +//} -TEST_F(DefaultAuthPageTest, loginAttempt) { - EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString("username"))) - .Times(AtLeast(2)) - .WillRepeatedly(Return(Wt::Auth::User{"id", *usedDatabaseMock})); - EXPECT_CALL(*passwordVerifier, verify(Wt::WString("password"), _)).WillOnce(Return(false)); +//TEST_F(DefaultAuthPageTest, loginAttempt) { +// EXPECT_CALL(*usedDatabaseMock, findWithIdentity("loginname", Wt::WString("username"))) +// .Times(AtLeast(2)) +// .WillRepeatedly(Return(Wt::Auth::User{"id", *usedDatabaseMock})); +// EXPECT_CALL(*passwordVerifier, verify(Wt::WString("password"), _)).WillOnce(Return(false)); -// EXPECT_CALL(_attemptLoginCallback, Call(_, _)); +//// EXPECT_CALL(_attemptLoginCallback, Call(_, _)); - setUsername("username"); - setPassword("password"); +// setUsername("username"); +// setPassword("password"); - clickLogin(); -} +// clickLogin(); +//}