~aleteoryx/muditaos

5fae63df3ef0389eb0ba1bfea1a85e94a211d909 — Radoslaw Wicik 4 years ago d4e5807
[EGD-6648] Fix Events Record tests

Update UT for work with SQLite WAL.
1 files changed, 208 insertions(+), 207 deletions(-)

M module-db/tests/EventsRecord_tests.cpp
M module-db/tests/EventsRecord_tests.cpp => module-db/tests/EventsRecord_tests.cpp +208 -207
@@ 1,21 1,23 @@
// Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved.
// For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md

#include <catch2/catch.hpp>
#include "common.hpp"

#include <Interface/EventsRecord.hpp>
#include <Database/Database.hpp>
#include <Databases/EventsDB.hpp>
#include <module-db/queries/calendar/QueryEventsGet.hpp>
#include <module-db/queries/calendar/QueryEventsGetAll.hpp>
#include <module-db/queries/calendar/QueryEventsGetAllLimited.hpp>
#include <module-db/queries/calendar/QueryEventsGetFiltered.hpp>
#include <module-db/queries/calendar/QueryEventsAdd.hpp>
#include <module-db/queries/calendar/QueryEventsRemove.hpp>
#include <module-db/queries/calendar/QueryEventsRemoveICS.hpp>
#include <module-db/queries/calendar/QueryEventsEdit.hpp>
#include <module-db/queries/calendar/QueryEventsEditICS.hpp>
#include <module-db/queries/calendar/QueryEventsSelectFirstUpcoming.hpp>

#include "Interface/EventsRecord.hpp"
#include "Database/Database.hpp"
#include "Databases/EventsDB.hpp"
#include "module-db/queries/calendar/QueryEventsGet.hpp"
#include "module-db/queries/calendar/QueryEventsGetAll.hpp"
#include "module-db/queries/calendar/QueryEventsGetAllLimited.hpp"
#include "module-db/queries/calendar/QueryEventsGetFiltered.hpp"
#include "module-db/queries/calendar/QueryEventsAdd.hpp"
#include "module-db/queries/calendar/QueryEventsRemove.hpp"
#include "module-db/queries/calendar/QueryEventsRemoveICS.hpp"
#include "module-db/queries/calendar/QueryEventsEdit.hpp"
#include "module-db/queries/calendar/QueryEventsEditICS.hpp"
#include "module-db/queries/calendar/QueryEventsSelectFirstUpcoming.hpp"
#include <catch2/catch.hpp>

#include <algorithm>
#include <cstdint>


@@ 40,22 42,12 @@ TEST_CASE("Events Record tests")
    Database::initialize();

    const auto eventsPath = (std::filesystem::path{"sys/user"} / "events.db");
    if (std::filesystem::exists(eventsPath)) {
        REQUIRE(std::filesystem::remove(eventsPath));
    }
    RemoveDbFiles(eventsPath.stem());

    EventsDB eventsDb{eventsPath.c_str()};

    REQUIRE(eventsDb.isInitialized());

    SECTION("Default Constructor")
    {
        EventsRecord testRec;
        REQUIRE(testRec.title == "");
        REQUIRE(testRec.reminder == 0);
        REQUIRE(testRec.repeat == 0);
    }

    EventsTableRow testRow = {{1},
                              .UID              = "test1",
                              .title            = "Event1",


@@ 142,11 134,6 @@ TEST_CASE("Events Record tests")
        CHECK(actual.isValid());
    };

    SECTION("Constructor from EventsTableRow")
    {
        EventsRecord testRecord(testRow);
        check_record(testRecord, testRow);
    }

    EventsRecordInterface eventsRecordInterface(&eventsDb);
    auto numberOfEvents = eventsRecordInterface.GetCount();


@@ 169,6 156,197 @@ TEST_CASE("Events Record tests")
    numberOfEvents = eventsRecordInterface.GetCount();
    REQUIRE(numberOfEvents == 6);

    ///====TEST QUERY====
    auto getQuery = [&](uint32_t id, EventsRecord expected_record) {
        auto query  = std::make_shared<db::query::events::Get>(id);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::GetResult *>(ret.get());
        REQUIRE(result != nullptr);
        auto record = result->getResult();
        check_record(record, expected_record);
    };

    [[maybe_unused]] auto getAll = [&](std::vector<EventsRecord> expected_records, uint32_t expectedAllRecsNumber) {
        auto query  = std::make_shared<db::query::events::GetAll>();
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::GetAllResult *>(ret.get());
        REQUIRE(result != nullptr);
        auto records = result->getResult();
        REQUIRE(records.size() == expectedAllRecsNumber);

        auto expected_record = expected_records.begin();
        std::for_each(records.begin(), records.end(), [&expected_record](const EventsRecord &record) {
            CHECK(record.ID == expected_record->ID);
            CHECK(record.UID == expected_record->UID);
            CHECK(record.title == expected_record->title);
            CHECK(TimePointToString(record.date_from) == TimePointToString(expected_record->date_from));
            CHECK(TimePointToString(record.date_till) == TimePointToString(expected_record->date_till));
            CHECK(record.reminder == expected_record->reminder);
            CHECK(record.repeat == expected_record->repeat);
            CHECK(record.reminder_fired == expected_record->reminder_fired);
            CHECK(record.provider_type == expected_record->provider_type);
            CHECK(record.provider_id == expected_record->provider_id);
            CHECK(record.provider_iCalUid == expected_record->provider_iCalUid);
            CHECK(record.isValid());
            expected_record++;
        });
    };

    auto getFiltered = [&](TimePoint filter_from, TimePoint filter_till, std::vector<EventsRecord> expected_records) {
        auto query  = std::make_shared<db::query::events::GetFiltered>(filter_from, filter_till);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::GetFilteredResult *>(ret.get());
        REQUIRE(result != nullptr);
        auto records = result->getResult();
        REQUIRE(records.size() == expected_records.size());
        auto count = result->getCountResult();
        REQUIRE(count == expected_records.size());

        auto expected_record = expected_records.begin();
        std::for_each(records.begin(), records.end(), [&expected_record](const EventsRecord &record) {
            CHECK(record.ID == expected_record->ID);
            CHECK(record.UID == expected_record->UID);
            CHECK(record.title == expected_record->title);
            CHECK(TimePointToString(record.date_from) == TimePointToString(expected_record->date_from));
            CHECK(TimePointToString(record.date_till) == TimePointToString(expected_record->date_till));
            CHECK(record.reminder == expected_record->reminder);
            CHECK(record.repeat == expected_record->repeat);
            CHECK(record.reminder_fired == expected_record->reminder_fired);
            CHECK(record.provider_type == expected_record->provider_type);
            CHECK(record.provider_id == expected_record->provider_id);
            CHECK(record.provider_iCalUid == expected_record->provider_iCalUid);
            CHECK(record.isValid());
            expected_record++;
        });
    };

    auto getAllLimited = [&](uint32_t offset,
                             uint32_t limit,
                             std::vector<EventsRecord> expected_records,
                             uint32_t expectedAllRecsNumber) {
        auto query  = std::make_shared<db::query::events::GetAllLimited>(offset, limit);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::GetAllLimitedResult *>(ret.get());
        REQUIRE(result != nullptr);
        auto records = result->getResult();
        REQUIRE(records.size() == limit);
        auto count = result->getCountResult();
        CHECK(count == expectedAllRecsNumber);

        auto expected_record = expected_records.begin();
        std::for_each(records.begin(), records.end(), [&expected_record](const EventsRecord &record) {
            CHECK(record.ID == expected_record->ID);
            CHECK(record.UID == expected_record->UID);
            CHECK(record.title == expected_record->title);
            CHECK(TimePointToString(record.date_from) == TimePointToString(expected_record->date_from));
            CHECK(TimePointToString(record.date_till) == TimePointToString(expected_record->date_till));
            CHECK(record.reminder == expected_record->reminder);
            CHECK(record.repeat == expected_record->repeat);
            CHECK(record.reminder_fired == expected_record->reminder_fired);
            CHECK(record.provider_type == expected_record->provider_type);
            CHECK(record.provider_id == expected_record->provider_id);
            CHECK(record.provider_iCalUid == expected_record->provider_iCalUid);
            CHECK(record.isValid());
            expected_record++;
        });
    };

    auto AddQuery = [&](EventsRecord record) {
        auto query  = std::make_shared<db::query::events::Add>(record);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::AddResult *>(ret.get());
        REQUIRE(result != nullptr);
        REQUIRE(result->getResult());

        auto entry = eventsRecordInterface.GetByID(record.ID);
        check_record(entry, record);
    };

    auto RemoveQueryICS = [&](std::string uid) {
        auto query  = std::make_shared<db::query::events::RemoveICS>(uid);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::RemoveICSResult *>(ret.get());
        REQUIRE(result != nullptr);
        REQUIRE(result->getResult());
        REQUIRE_NOTHROW(eventsRecordInterface.GetByUID(uid));
    };

    auto EditQuery = [&](uint32_t id, EventsRecord record) {
        auto entryToUpdate             = eventsRecordInterface.GetByID(id);
        entryToUpdate.title            = record.title;
        entryToUpdate.date_from        = record.date_from;
        entryToUpdate.date_till        = record.date_till;
        entryToUpdate.reminder         = record.reminder;
        entryToUpdate.repeat           = record.repeat;
        entryToUpdate.provider_type    = record.provider_type;
        entryToUpdate.provider_id      = record.provider_id;
        entryToUpdate.provider_iCalUid = record.provider_iCalUid;

        auto query  = std::make_shared<db::query::events::Edit>(entryToUpdate);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::EditResult *>(ret.get());
        REQUIRE(result != nullptr);

        auto entry = eventsRecordInterface.GetByID(entryToUpdate.ID);
        record.ID  = entry.ID;
        record.UID = entry.UID;
        check_record(entry, record);
    };

    auto RemoveQuery = [&](uint32_t id) {
        auto query  = std::make_shared<db::query::events::Remove>(id);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::RemoveResult *>(ret.get());
        REQUIRE(result != nullptr);
        REQUIRE(result->getResult());
        REQUIRE_NOTHROW(eventsRecordInterface.GetByID(id));
    };

    auto EditQueryICS = [&](std::string uid, EventsRecord recordUpdateData) {
        auto entryToUpdate             = eventsRecordInterface.GetByUID(uid);
        entryToUpdate.title            = recordUpdateData.title;
        entryToUpdate.date_from        = recordUpdateData.date_from;
        entryToUpdate.date_till        = recordUpdateData.date_till;
        entryToUpdate.reminder         = recordUpdateData.reminder;
        entryToUpdate.repeat           = recordUpdateData.repeat;
        entryToUpdate.provider_type    = recordUpdateData.provider_type;
        entryToUpdate.provider_id      = recordUpdateData.provider_id;
        entryToUpdate.provider_iCalUid = recordUpdateData.provider_iCalUid;

        auto query  = std::make_shared<db::query::events::EditICS>(entryToUpdate);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::EditICSResult *>(ret.get());
        REQUIRE(result != nullptr);

        auto entry           = eventsRecordInterface.GetByID(entryToUpdate.ID);
        recordUpdateData.ID  = entry.ID;
        recordUpdateData.UID = entry.UID;
        check_record(entry, recordUpdateData);
    };

    [[maybe_unused]] auto selectFirstUpcomingEvent = [&](TimePoint filter_from, TimePoint filter_till) {
        auto query  = std::make_shared<db::query::events::SelectFirstUpcoming>(filter_from, filter_till);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::SelectFirstUpcomingResult *>(ret.get());
        REQUIRE(result != nullptr);
        auto records = result->getResult();
        return records;
    };

    SECTION("Default Constructor")
    {
        EventsRecord testRec;
        REQUIRE(testRec.title == "");
        REQUIRE(testRec.reminder == 0);
        REQUIRE(testRec.repeat == 0);
    }

    SECTION("Constructor from EventsTableRow")
    {
        EventsRecord testRecord(testRow);
        check_record(testRecord, testRow);
    }

    SECTION("Get entry by ID")
    {
        auto entry = eventsRecordInterface.GetByID(testRecord3.ID);


@@ 743,16 921,6 @@ TEST_CASE("Events Record tests")
        REQUIRE(nextEventsRecord.ID == 2);
    }

    ///====TEST QUERY====
    auto getQuery = [&](uint32_t id, EventsRecord expected_record) {
        auto query  = std::make_shared<db::query::events::Get>(id);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::GetResult *>(ret.get());
        REQUIRE(result != nullptr);
        auto record = result->getResult();
        check_record(record, expected_record);
    };

    SECTION("Check Get via query")
    {
        getQuery(testRecord.ID, testRecord);


@@ 760,32 928,6 @@ TEST_CASE("Events Record tests")
        getQuery(testRecord6.ID, testRecord6);
    }

    [[maybe_unused]] auto getAll = [&](std::vector<EventsRecord> expected_records, uint32_t expectedAllRecsNumber) {
        auto query  = std::make_shared<db::query::events::GetAll>();
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::GetAllResult *>(ret.get());
        REQUIRE(result != nullptr);
        auto records = result->getResult();
        REQUIRE(records.size() == expectedAllRecsNumber);

        auto expected_record = expected_records.begin();
        std::for_each(records.begin(), records.end(), [&expected_record](const EventsRecord &record) {
            CHECK(record.ID == expected_record->ID);
            CHECK(record.UID == expected_record->UID);
            CHECK(record.title == expected_record->title);
            CHECK(TimePointToString(record.date_from) == TimePointToString(expected_record->date_from));
            CHECK(TimePointToString(record.date_till) == TimePointToString(expected_record->date_till));
            CHECK(record.reminder == expected_record->reminder);
            CHECK(record.repeat == expected_record->repeat);
            CHECK(record.reminder_fired == expected_record->reminder_fired);
            CHECK(record.provider_type == expected_record->provider_type);
            CHECK(record.provider_id == expected_record->provider_id);
            CHECK(record.provider_iCalUid == expected_record->provider_iCalUid);
            CHECK(record.isValid());
            expected_record++;
        });
    };

    SECTION("Get All via query")
    {
        std::vector<EventsRecord> expectedRecords;


@@ 798,34 940,6 @@ TEST_CASE("Events Record tests")
        getAll(expectedRecords, numberOfEvents);
    }

    auto getFiltered = [&](TimePoint filter_from, TimePoint filter_till, std::vector<EventsRecord> expected_records) {
        auto query  = std::make_shared<db::query::events::GetFiltered>(filter_from, filter_till);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::GetFilteredResult *>(ret.get());
        REQUIRE(result != nullptr);
        auto records = result->getResult();
        REQUIRE(records.size() == expected_records.size());
        auto count = result->getCountResult();
        REQUIRE(count == expected_records.size());

        auto expected_record = expected_records.begin();
        std::for_each(records.begin(), records.end(), [&expected_record](const EventsRecord &record) {
            CHECK(record.ID == expected_record->ID);
            CHECK(record.UID == expected_record->UID);
            CHECK(record.title == expected_record->title);
            CHECK(TimePointToString(record.date_from) == TimePointToString(expected_record->date_from));
            CHECK(TimePointToString(record.date_till) == TimePointToString(expected_record->date_till));
            CHECK(record.reminder == expected_record->reminder);
            CHECK(record.repeat == expected_record->repeat);
            CHECK(record.reminder_fired == expected_record->reminder_fired);
            CHECK(record.provider_type == expected_record->provider_type);
            CHECK(record.provider_id == expected_record->provider_id);
            CHECK(record.provider_iCalUid == expected_record->provider_iCalUid);
            CHECK(record.isValid());
            expected_record++;
        });
    };

    SECTION("GetFiltered via query")
    {
        auto startDate = testRecord2.date_from;


@@ 837,37 951,6 @@ TEST_CASE("Events Record tests")
        getFiltered(startDate, endDate, expectedFilteredRecords);
    }

    auto getAllLimited = [&](uint32_t offset,
                             uint32_t limit,
                             std::vector<EventsRecord> expected_records,
                             uint32_t expectedAllRecsNumber) {
        auto query  = std::make_shared<db::query::events::GetAllLimited>(offset, limit);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::GetAllLimitedResult *>(ret.get());
        REQUIRE(result != nullptr);
        auto records = result->getResult();
        REQUIRE(records.size() == limit);
        auto count = result->getCountResult();
        CHECK(count == expectedAllRecsNumber);

        auto expected_record = expected_records.begin();
        std::for_each(records.begin(), records.end(), [&expected_record](const EventsRecord &record) {
            CHECK(record.ID == expected_record->ID);
            CHECK(record.UID == expected_record->UID);
            CHECK(record.title == expected_record->title);
            CHECK(TimePointToString(record.date_from) == TimePointToString(expected_record->date_from));
            CHECK(TimePointToString(record.date_till) == TimePointToString(expected_record->date_till));
            CHECK(record.reminder == expected_record->reminder);
            CHECK(record.repeat == expected_record->repeat);
            CHECK(record.reminder_fired == expected_record->reminder_fired);
            CHECK(record.provider_type == expected_record->provider_type);
            CHECK(record.provider_id == expected_record->provider_id);
            CHECK(record.provider_iCalUid == expected_record->provider_iCalUid);
            CHECK(record.isValid());
            expected_record++;
        });
    };

    SECTION("Get All Limited via query")
    {
        std::vector<EventsRecord> expectedRecords;


@@ 879,17 962,6 @@ TEST_CASE("Events Record tests")
        getAllLimited(testRecord2.ID - 1, limit, expectedRecords, numberOfEvents);
    }

    auto AddQuery = [&](EventsRecord record) {
        auto query  = std::make_shared<db::query::events::Add>(record);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::AddResult *>(ret.get());
        REQUIRE(result != nullptr);
        REQUIRE(result->getResult());

        auto entry = eventsRecordInterface.GetByID(record.ID);
        check_record(entry, record);
    };

    SECTION("Add via query")
    {
        EventsTableRow testRow7 = {{7},


@@ 908,15 980,6 @@ TEST_CASE("Events Record tests")
        AddQuery(testRecord7);
    }

    auto RemoveQuery = [&](uint32_t id) {
        auto query  = std::make_shared<db::query::events::Remove>(id);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::RemoveResult *>(ret.get());
        REQUIRE(result != nullptr);
        REQUIRE(result->getResult());
        REQUIRE_NOTHROW(eventsRecordInterface.GetByID(id));
    };

    SECTION("Remove via query")
    {
        RemoveQuery(testRecord2.ID);


@@ 930,15 993,6 @@ TEST_CASE("Events Record tests")
        getAll(expectedRecords, numberOfEvents - 1);
    }

    auto RemoveQueryICS = [&](std::string uid) {
        auto query  = std::make_shared<db::query::events::RemoveICS>(uid);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::RemoveICSResult *>(ret.get());
        REQUIRE(result != nullptr);
        REQUIRE(result->getResult());
        REQUIRE_NOTHROW(eventsRecordInterface.GetByUID(uid));
    };

    SECTION("RemoveICS via query")
    {
        RemoveQueryICS(testRecord2.UID);


@@ 952,28 1006,6 @@ TEST_CASE("Events Record tests")
        getAll(expectedRecords, numberOfEvents - 1);
    }

    auto EditQuery = [&](uint32_t id, EventsRecord record) {
        auto entryToUpdate             = eventsRecordInterface.GetByID(id);
        entryToUpdate.title            = record.title;
        entryToUpdate.date_from        = record.date_from;
        entryToUpdate.date_till        = record.date_till;
        entryToUpdate.reminder         = record.reminder;
        entryToUpdate.repeat           = record.repeat;
        entryToUpdate.provider_type    = record.provider_type;
        entryToUpdate.provider_id      = record.provider_id;
        entryToUpdate.provider_iCalUid = record.provider_iCalUid;

        auto query  = std::make_shared<db::query::events::Edit>(entryToUpdate);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::EditResult *>(ret.get());
        REQUIRE(result != nullptr);

        auto entry = eventsRecordInterface.GetByID(entryToUpdate.ID);
        record.ID  = entry.ID;
        record.UID = entry.UID;
        check_record(entry, record);
    };

    SECTION("Update via query")
    {
        EditQuery(testRecord.ID, testRecord);


@@ 981,28 1013,6 @@ TEST_CASE("Events Record tests")
        EditQuery(testRecord6.ID, testRecord6);
    }

    auto EditQueryICS = [&](std::string uid, EventsRecord recordUpdateData) {
        auto entryToUpdate             = eventsRecordInterface.GetByUID(uid);
        entryToUpdate.title            = recordUpdateData.title;
        entryToUpdate.date_from        = recordUpdateData.date_from;
        entryToUpdate.date_till        = recordUpdateData.date_till;
        entryToUpdate.reminder         = recordUpdateData.reminder;
        entryToUpdate.repeat           = recordUpdateData.repeat;
        entryToUpdate.provider_type    = recordUpdateData.provider_type;
        entryToUpdate.provider_id      = recordUpdateData.provider_id;
        entryToUpdate.provider_iCalUid = recordUpdateData.provider_iCalUid;

        auto query  = std::make_shared<db::query::events::EditICS>(entryToUpdate);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::EditICSResult *>(ret.get());
        REQUIRE(result != nullptr);

        auto entry           = eventsRecordInterface.GetByID(entryToUpdate.ID);
        recordUpdateData.ID  = entry.ID;
        recordUpdateData.UID = entry.UID;
        check_record(entry, recordUpdateData);
    };

    SECTION("Update ICS via query")
    {
        EditQueryICS(testRecord.UID, testRecord);


@@ 1010,15 1020,6 @@ TEST_CASE("Events Record tests")
        EditQueryICS(testRecord6.UID, testRecord6);
    }

    [[maybe_unused]] auto selectFirstUpcomingEvent = [&](TimePoint filter_from, TimePoint filter_till) {
        auto query  = std::make_shared<db::query::events::SelectFirstUpcoming>(filter_from, filter_till);
        auto ret    = eventsRecordInterface.runQuery(query);
        auto result = dynamic_cast<db::query::events::SelectFirstUpcomingResult *>(ret.get());
        REQUIRE(result != nullptr);
        auto records = result->getResult();
        return records;
    };

    SECTION("Select first upcoming via query")
    {
        auto date_from = TimePointFromString("2019-10-19 14:24:00");