diff --git a/module-db/CMakeLists.txt b/module-db/CMakeLists.txt index adb80d2a1..f8cb10f82 100644 --- a/module-db/CMakeLists.txt +++ b/module-db/CMakeLists.txt @@ -41,9 +41,9 @@ set(SOURCES ${CMAKE_CURRENT_SOURCE_DIR}/Tables/ContactsAddressTable.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Interface/Record.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Interface/SMSRecord.cpp + #${CMAKE_CURRENT_SOURCE_DIR}/Interface/SMSRecord.cpp ${CMAKE_CURRENT_SOURCE_DIR}/Interface/ContactRecord.cpp - ${CMAKE_CURRENT_SOURCE_DIR}/Interface/ThreadRecord.cpp + #${CMAKE_CURRENT_SOURCE_DIR}/Interface/ThreadRecord.cpp ) diff --git a/module-db/Database/Database.cpp b/module-db/Database/Database.cpp index c46bbe438..f20cc26b9 100644 --- a/module-db/Database/Database.cpp +++ b/module-db/Database/Database.cpp @@ -150,3 +150,7 @@ int Database::queryCallback(void *usrPtr, int count, char **data, char **columns return 0; } + +uint32_t Database::GetLastInsertRowID() { + return sqlite3_last_insert_rowid(dbConnection); +} \ No newline at end of file diff --git a/module-db/Database/Database.hpp b/module-db/Database/Database.hpp index 024f54a4e..4d7c62ffc 100644 --- a/module-db/Database/Database.hpp +++ b/module-db/Database/Database.hpp @@ -36,6 +36,8 @@ public: bool IsInitialized(){return isInitialized;} + uint32_t GetLastInsertRowID(); + private: const uint32_t maxQueryLen = (8 * 1024); diff --git a/module-db/Interface/ContactRecord.cpp b/module-db/Interface/ContactRecord.cpp index ee76e656d..39fde940e 100644 --- a/module-db/Interface/ContactRecord.cpp +++ b/module-db/Interface/ContactRecord.cpp @@ -10,3 +10,228 @@ #include "ContactRecord.hpp" + +#include "../Databases/ContactsDB.hpp" + + +bool ContactRecordInterface::Add(const ContactRecord& rec) { + auto contactDB = std::make_unique(); + + + bool ret = contactDB->contacts.Add(ContactsTableRow{.type=rec.contactType, + .isOnWhitelist=rec.isOnBlacklist, + .isOnBlacklist=rec.isOnBlacklist, + .isOnFavourites=rec.isOnFavourites, + .speedDial=rec.speeddial}); + + if (!ret) { + return ret; + } + + uint32_t contactID = contactDB->GetLastInsertRowID(); + + + ret = contactDB->name.Add(ContactsNameTableRow{ + .contactID =contactID, + .namePrimary=rec.primaryName, + .nameAlternative=rec.alternativeName}); + + if (!ret) { + return ret; + } + + auto contactNameID = contactDB->GetLastInsertRowID(); + + + // TODO: add missing feature: multiple numbers per contact + ret = contactDB->number.Add(ContactsNumberTableRow{ + .contactID = contactID, + .numberUser = rec.numberUser.c_str(), + .numbere164 = rec.numberE164.c_str(), + .type = rec.numberType}); + + if (!ret) { + return ret; + } + + auto contactNumberID = contactDB->GetLastInsertRowID(); + + ret = contactDB->ringtones.Add(ContactsRingtonesTableRow{ + .contactID = contactID, + .assetPath = rec.assetPath + }); + + if (!ret) { + return ret; + } + + auto contactRingID = contactDB->GetLastInsertRowID(); + + // TODO: add missing feature: multiple addresses per contact + ret = contactDB->address.Add(ContactsAddressTableRow{ + .contactID = contactID, + .country = rec.country, + .city = rec.city, + .street = rec.street, + .number = rec.number, + .type = rec.addressType, + .note = rec.note, + .mail = rec.mail + }); + + if (!ret) { + return ret; + } + + auto contactAddressID = contactDB->GetLastInsertRowID(); + + ret = contactDB->contacts.Update(ContactsTableRow{ + .ID=contactID, + .nameID=contactNameID, + .numbersID=std::to_string(contactNumberID), + .ringID=contactRingID, + .addressIDs=std::to_string(contactAddressID), + + .type=rec.contactType, + .isOnWhitelist=rec.isOnBlacklist, + .isOnBlacklist=rec.isOnBlacklist, + .isOnFavourites=rec.isOnFavourites, + .speedDial=rec.speeddial}); + + return ret; +} + +bool ContactRecordInterface::RemoveByID(uint32_t id) { + auto contactDB = std::make_unique(); + + auto contact = contactDB->contacts.GetByID(id); + if(contact.ID == 0){ + return false; + } + + if(contactDB->name.RemoveByID(contact.nameID) == false){ + return false; + } + + if(contactDB->address.RemoveByID(std::stoul(contact.addressIDs)) == false){ + return false; + } + + if(contactDB->number.RemoveByID(std::stoul(contact.numbersID)) == false){ + return false; + } + + if(contactDB->ringtones.RemoveByID(contact.ringID) == false){ + return false; + } + + if(contactDB->contacts.RemoveByID(id) == false){ + return false; + } + + return true; +} + +bool ContactRecordInterface::RemoveByName(const char* str) { + auto contactDB = std::make_unique(); + +/* auto contact = contactDB->contacts.GetByID(dbID); + if(contact.ID == 0){ + return false; + } + + if(contactDB->name.RemoveByID(contact.nameID) == false){ + return false; + } + + if(contactDB->address.RemoveByID(std::stoul(contact.addressIDs)) == false){ + return false; + } + + if(contactDB->number.RemoveByID(std::stoul(contact.numbersID)) == false){ + return false; + } + + if(contactDB->ringtones.RemoveByID(contact.ringID) == false){ + return false; + } + + if(contactDB->contacts.RemoveByID(dbID) == false){ + return false; + }*/ + + return true; +} + +bool ContactRecordInterface::Update(const ContactRecord &rec) { + return true; +} + +ContactRecord ContactRecordInterface::GetByID(uint32_t id) { + + auto contactDB = std::make_unique(); + ContactRecord rec; + + auto contact = contactDB->contacts.GetByID(id); + if(contact.ID == 0){ + return rec; + } + + auto nr = contactDB->number.GetByID(std::stoul(contact.numbersID)); + if(nr.ID == 0){ + return rec; + } + + auto ring = contactDB->ringtones.GetByID(contact.ringID); + if(ring.ID == 0){ + return rec; + } + + auto address = contactDB->address.GetByID(std::stoul(contact.addressIDs)); + if(address.ID == 0){ + return rec; + } + + auto name = contactDB->name.GetByID(contact.nameID); + if(name.ID == 0){ + return rec; + } + + rec.dbID = contact.ID; + rec.primaryName = name.namePrimary; + rec.alternativeName=name.nameAlternative; + rec.numberUser=nr.numberUser; + rec.numberE164=nr.numbere164; + rec.contactType=contact.type; + rec.numberType=nr.type; + rec.country=address.country; + rec.city=address.city; + rec.street=address.street; + rec.number=address.number; + rec.note=address.note; + rec.mail=address.mail; + rec.addressType=address.type; + rec.assetPath=ring.assetPath; + rec.isOnWhitelist=contact.isOnWhitelist; + rec.isOnBlacklist=contact.isOnBlacklist; + rec.isOnFavourites=contact.isOnFavourites; + rec.speeddial=contact.speedDial; + + + return rec; + +} + +ContactRecord ContactRecordInterface::GetByName(const char* str) { + return ContactRecord{}; +} + +uint32_t ContactRecordInterface::GetCount() { + auto contactDB = std::make_unique(); + + return contactDB->contacts.GetCount(); +} + +std::unique_ptr> ContactRecordInterface::GetLimitOffset(uint32_t offset, uint32_t limit) { + return std::make_unique>(); +} \ No newline at end of file diff --git a/module-db/Interface/ContactRecord.hpp b/module-db/Interface/ContactRecord.hpp index 49a31d744..75dae738b 100644 --- a/module-db/Interface/ContactRecord.hpp +++ b/module-db/Interface/ContactRecord.hpp @@ -13,9 +13,50 @@ #define PUREPHONE_CONTACTRECORD_HPP #include "Record.hpp" +#include "utf8/UTF8.hpp" +#include "../Common/Common.hpp" + +struct ContactRecord{ + uint32_t dbID; + UTF8 primaryName; + UTF8 alternativeName; + UTF8 numberUser; + UTF8 numberE164; + ContactType contactType; + + ContactNumberType numberType; + + UTF8 country; + UTF8 city; + UTF8 street; + UTF8 number; + UTF8 note; + UTF8 mail; + ContactAddressType addressType; + + UTF8 assetPath; + + bool isOnWhitelist; + bool isOnBlacklist; + bool isOnFavourites; + uint8_t speeddial; +}; -class ContactRecord : public Record{ +class ContactRecordInterface : public RecordInterface{ + +public: + + bool Add(const ContactRecord& rec) override final; + bool RemoveByID(uint32_t id) override final; + bool RemoveByName(const char* str) override final; + bool Update(const ContactRecord& rec) override final; + ContactRecord GetByID(uint32_t id) override final; + ContactRecord GetByName(const char* str) override final; + + uint32_t GetCount() override final; + + std::unique_ptr> GetLimitOffset(uint32_t offset,uint32_t limit) override final; }; diff --git a/module-db/Interface/Record.cpp b/module-db/Interface/Record.cpp index bf76d7e48..efdffc692 100644 --- a/module-db/Interface/Record.cpp +++ b/module-db/Interface/Record.cpp @@ -10,12 +10,3 @@ #include "Record.hpp" - - -Record::Record(){ - -} - -Record::~Record() { - -} \ No newline at end of file diff --git a/module-db/Interface/Record.hpp b/module-db/Interface/Record.hpp index e91a8e00c..fab36fd44 100644 --- a/module-db/Interface/Record.hpp +++ b/module-db/Interface/Record.hpp @@ -15,18 +15,29 @@ #include #include "../Database/Database.hpp" -class Record { +template +class RecordInterface { public: - Record(); + RecordInterface(){}; - virtual ~Record(); + virtual ~RecordInterface(){}; - virtual bool Add(); + virtual bool Add(const T&){}; - virtual bool Remove(); + virtual bool RemoveByID(uint32_t id){}; - virtual bool Update(); + virtual bool RemoveByName(const char* str){}; + + virtual bool Update(const T&){}; + + virtual T GetByID(uint32_t id){}; + + virtual T GetByName(const char* str){}; + + virtual uint32_t GetCount(){} + + virtual std::unique_ptr> GetLimitOffset(uint32_t offset,uint32_t limit){} diff --git a/module-db/Interface/SMSRecord.cpp b/module-db/Interface/SMSRecord.cpp index 9f12d8019..1e42be9aa 100644 --- a/module-db/Interface/SMSRecord.cpp +++ b/module-db/Interface/SMSRecord.cpp @@ -22,7 +22,17 @@ SMSRecord::~SMSRecord() { bool SMSRecord::Add() { - auto db = std::make_unique(); + auto smsdb = std::make_unique(); + auto contactdb = std::make_unique(); + + + // Check if contact exists + auto contact = contactdb->number.GetByName(number.c_str()); + if(contact.ID == 0){ + + + } + //db->threads.Add() } diff --git a/module-db/Interface/SMSRecord.hpp b/module-db/Interface/SMSRecord.hpp index aead2be99..edf711c2c 100644 --- a/module-db/Interface/SMSRecord.hpp +++ b/module-db/Interface/SMSRecord.hpp @@ -17,8 +17,9 @@ #include "utf8/UTF8.hpp" #include "../Common/Common.hpp" #include "../Databases/SmsDB.hpp" +#include "../Databases/ContactsDB.hpp" -class SMSRecord : public Record { +class SMSRecord : public Record { public: SMSRecord(); diff --git a/module-db/Interface/ThreadRecord.hpp b/module-db/Interface/ThreadRecord.hpp index b3edbead3..540f5901c 100644 --- a/module-db/Interface/ThreadRecord.hpp +++ b/module-db/Interface/ThreadRecord.hpp @@ -17,7 +17,7 @@ #include "utf8/UTF8.hpp" #include "../Common/Common.hpp" -class ThreadRecord : public Record{ +class ThreadRecord : public Record{ public: uint32_t dbID; diff --git a/module-db/Tables/ContactsAddressTable.cpp b/module-db/Tables/ContactsAddressTable.cpp index 323c97c06..126ce5a85 100644 --- a/module-db/Tables/ContactsAddressTable.cpp +++ b/module-db/Tables/ContactsAddressTable.cpp @@ -12,7 +12,7 @@ #include "ContactsAddressTable.hpp" -ContactsAddressTable::ContactsAddressTable(Database *db):db(db) { +ContactsAddressTable::ContactsAddressTable(Database *db): Table(db) { } diff --git a/module-db/Tables/ContactsAddressTable.hpp b/module-db/Tables/ContactsAddressTable.hpp index 31d48d4ca..0add39d74 100644 --- a/module-db/Tables/ContactsAddressTable.hpp +++ b/module-db/Tables/ContactsAddressTable.hpp @@ -71,8 +71,6 @@ private: "mail TEXT NOT NULL," "FOREIGN KEY(contact_id) REFERENCES contacts(_id)" ");"; - - Database* db; }; diff --git a/module-db/Tables/ContactsNameTable.cpp b/module-db/Tables/ContactsNameTable.cpp index 40a60f920..252c6f52e 100644 --- a/module-db/Tables/ContactsNameTable.cpp +++ b/module-db/Tables/ContactsNameTable.cpp @@ -12,7 +12,7 @@ #include "ContactsNameTable.hpp" -ContactsNameTable::ContactsNameTable(Database *db):db(db) { +ContactsNameTable::ContactsNameTable(Database *db): Table(db) { } diff --git a/module-db/Tables/ContactsNameTable.hpp b/module-db/Tables/ContactsNameTable.hpp index 65086d5e0..ed062b83c 100644 --- a/module-db/Tables/ContactsNameTable.hpp +++ b/module-db/Tables/ContactsNameTable.hpp @@ -61,8 +61,6 @@ private: "name_alternative TEXT NOT NULL," "FOREIGN KEY(contact_id) REFERENCES contacts(_id)" ");"; - - Database* db; }; diff --git a/module-db/Tables/ContactsNumberTable.cpp b/module-db/Tables/ContactsNumberTable.cpp index a5ea1ae4c..07faa9b6f 100644 --- a/module-db/Tables/ContactsNumberTable.cpp +++ b/module-db/Tables/ContactsNumberTable.cpp @@ -11,7 +11,7 @@ #include "ContactsNumberTable.hpp" -ContactsNumberTable::ContactsNumberTable(Database *db):db(db) { +ContactsNumberTable::ContactsNumberTable(Database *db): Table(db) { } @@ -63,6 +63,23 @@ ContactsNumberTableRow ContactsNumberTable::GetByID(uint32_t id) { }; } +ContactsNumberTableRow ContactsNumberTable::GetByName(const char *name) { + + auto retQuery = db->Query("SELECT * FROM contact_number WHERE number_e164= '%s';", name); + + if ( (retQuery == nullptr) || (retQuery->GetRowCount() == 0)) { + return ContactsNumberTableRow(); + } + + return ContactsNumberTableRow{(*retQuery)[0].GetUInt32(), // ID + (*retQuery)[1].GetUInt32(), // contactID + (*retQuery)[2].GetString(), // numberUser + (*retQuery)[3].GetString(), // numbere164 + static_cast((*retQuery)[4].GetUInt32()), // type + }; + +} + std::vector ContactsNumberTable::GetLimitOffset(uint32_t offset, uint32_t limit) { auto retQuery = db->Query("SELECT * from contact_number ORDER BY number_user LIMIT %lu OFFSET %lu;", limit, diff --git a/module-db/Tables/ContactsNumberTable.hpp b/module-db/Tables/ContactsNumberTable.hpp index 0ce7fbf3d..fb53f11ea 100644 --- a/module-db/Tables/ContactsNumberTable.hpp +++ b/module-db/Tables/ContactsNumberTable.hpp @@ -43,6 +43,8 @@ public: ContactsNumberTableRow GetByID(uint32_t id) override final; + ContactsNumberTableRow GetByName(const char* name) override final; + std::vector GetLimitOffset(uint32_t offset, uint32_t limit) override final; std::vector @@ -63,8 +65,6 @@ private: "type INTEGER," "FOREIGN KEY(contact_id) REFERENCES contacts(_id)" ");"; - - Database* db; }; diff --git a/module-db/Tables/ContactsRingtonesTable.cpp b/module-db/Tables/ContactsRingtonesTable.cpp index 4a0d94e9d..d037a9a38 100644 --- a/module-db/Tables/ContactsRingtonesTable.cpp +++ b/module-db/Tables/ContactsRingtonesTable.cpp @@ -11,7 +11,7 @@ #include "ContactsRingtonesTable.hpp" -ContactsRingtonesTable::ContactsRingtonesTable(Database *db):db(db) { +ContactsRingtonesTable::ContactsRingtonesTable(Database *db): Table(db) { } diff --git a/module-db/Tables/ContactsRingtonesTable.hpp b/module-db/Tables/ContactsRingtonesTable.hpp index cb518548f..bc4425970 100644 --- a/module-db/Tables/ContactsRingtonesTable.hpp +++ b/module-db/Tables/ContactsRingtonesTable.hpp @@ -59,8 +59,6 @@ private: "asset_path TEXT NOT NULL," "FOREIGN KEY(contact_id) REFERENCES contacts(_id)" ");"; - - Database* db; }; diff --git a/module-db/Tables/ContactsTable.cpp b/module-db/Tables/ContactsTable.cpp index 8ff2c82ca..09f3b45ff 100644 --- a/module-db/Tables/ContactsTable.cpp +++ b/module-db/Tables/ContactsTable.cpp @@ -12,7 +12,7 @@ #include "ContactsTable.hpp" -ContactsTable::ContactsTable(Database* db):db(db){ +ContactsTable::ContactsTable(Database* db): Table(db){ } ContactsTable::~ContactsTable() { diff --git a/module-db/Tables/ContactsTable.hpp b/module-db/Tables/ContactsTable.hpp index a16592161..b55cb5e00 100644 --- a/module-db/Tables/ContactsTable.hpp +++ b/module-db/Tables/ContactsTable.hpp @@ -76,8 +76,6 @@ private: "FOREIGN KEY(name_id) REFERENCES contact_name(_id) FOREIGN KEY(ring_id) REFERENCES contact_ringtones(_id)" ");"; - Database* db; - }; diff --git a/module-db/Tables/SMSTable.cpp b/module-db/Tables/SMSTable.cpp index 0bb9f4be3..b9225aaf0 100644 --- a/module-db/Tables/SMSTable.cpp +++ b/module-db/Tables/SMSTable.cpp @@ -12,7 +12,7 @@ #include "SMSTable.hpp" -SMSTable::SMSTable(Database* db): db(db){ +SMSTable::SMSTable(Database* db): Table(db){ } SMSTable::~SMSTable() { diff --git a/module-db/Tables/SMSTable.hpp b/module-db/Tables/SMSTable.hpp index e710d9df2..4c1d76072 100644 --- a/module-db/Tables/SMSTable.hpp +++ b/module-db/Tables/SMSTable.hpp @@ -62,8 +62,6 @@ private: "type INTEGER," "FOREIGN KEY(thread_id) REFERENCES threads(_id) ON DELETE CASCADE );"; - Database* db; - }; diff --git a/module-db/Tables/Table.hpp b/module-db/Tables/Table.hpp index 78b0f8ad0..eabdd573a 100644 --- a/module-db/Tables/Table.hpp +++ b/module-db/Tables/Table.hpp @@ -21,7 +21,7 @@ class Table { protected: - Table(){} + Table(Database* db):db(db){} ~Table(){} @@ -30,11 +30,16 @@ protected: virtual bool RemoveByID(uint32_t id) = 0; virtual bool Update(T entry) = 0; virtual T GetByID(uint32_t id) = 0; + virtual T GetByName(const char* name){return T{};}; virtual std::vector GetLimitOffset(uint32_t offset,uint32_t limit) = 0; virtual std::vector GetLimitOffsetByFieldID(uint32_t offset,uint32_t limit,const char* field,uint32_t id) = 0; virtual uint32_t GetCount() = 0; virtual uint32_t GetCountByFieldID(const char* field,uint32_t id) = 0; + uint32_t GetLastInsertRowID(){return db->GetLastInsertRowID();} + + Database* db; + }; diff --git a/module-db/Tables/ThreadsTable.cpp b/module-db/Tables/ThreadsTable.cpp index c7eacfa2e..5f3ae8948 100644 --- a/module-db/Tables/ThreadsTable.cpp +++ b/module-db/Tables/ThreadsTable.cpp @@ -12,7 +12,7 @@ #include "ThreadsTable.hpp" -ThreadsTable::ThreadsTable(Database* db):db(db){ +ThreadsTable::ThreadsTable(Database* db): Table(db){ } ThreadsTable::~ThreadsTable() { diff --git a/module-db/Tables/ThreadsTable.hpp b/module-db/Tables/ThreadsTable.hpp index c34e9fca8..2eb597996 100644 --- a/module-db/Tables/ThreadsTable.hpp +++ b/module-db/Tables/ThreadsTable.hpp @@ -66,8 +66,6 @@ private: const char* threadInsertTriggerQuery = "CREATE TRIGGER IF NOT EXISTS on_thread_insert AFTER INSERT ON threads BEGIN UPDATE threads_count SET count=count+1 WHERE _id=1; END"; const char* threadRemoveTriggerQuery = "CREATE TRIGGER IF NOT EXISTS on_thread_remove AFTER DELETE ON threads BEGIN UPDATE threads_count SET count=count-1 WHERE _id=1; END"; - Database* db; - }; diff --git a/module-db/tests/CMakeLists.txt b/module-db/tests/CMakeLists.txt index d4fe453fb..ef7df4078 100644 --- a/module-db/tests/CMakeLists.txt +++ b/module-db/tests/CMakeLists.txt @@ -17,6 +17,8 @@ add_executable( ${PROJECT_NAME} "${CMAKE_CURRENT_SOURCE_DIR}/ContactsNumberTable_tests.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/ContactsRingtonesTable_tests.cpp" "${CMAKE_CURRENT_SOURCE_DIR}/ContactsAddressTable_tests.cpp" + + "${CMAKE_CURRENT_SOURCE_DIR}/ContactsRecord_tests.cpp" ) target_link_libraries( ${PROJECT_NAME} PRIVATE module-db ) diff --git a/module-db/tests/ContactsRecord_tests.cpp b/module-db/tests/ContactsRecord_tests.cpp new file mode 100644 index 000000000..c56477e68 --- /dev/null +++ b/module-db/tests/ContactsRecord_tests.cpp @@ -0,0 +1,106 @@ + +/* + * @file ContactsRecord_tests.cpp + * @author Mateusz Piesta (mateusz.piesta@mudita.com) + * @date 03.06.19 + * @brief + * @copyright Copyright (C) 2019 mudita.com + * @details + */ + + +#include "vfs.hpp" + +#include "catch.hpp" + +#include +#include +#include +#include + +#include + +#include "../Database/Database.hpp" +#include "../Interface/ContactRecord.hpp" +#include "../Databases/ContactsDB.hpp" + + +TEST_CASE("Contact Record tests") +{ + Database::Initialize(); + + vfs.remove(ContactsDB::GetDBName()); + + const char* primaryNameTest = "PrimaryNameTest"; + const char* alternativeNameTest = "AlternativeNameTest"; + const char* numberUserTest = "111222333"; + const char* numberE164Test = "333222111"; + const char* countryTest = "Poland"; + const char* cityTest = "Warsaw"; + const char* streetTest = "Czeczota"; + const char* numberTest = "7/9"; + const char* noteTest = "TestNote"; + const char* mailTest = "TestMail"; + const char* assetPath = "/Test/Path/To/Asset"; + const uint8_t speeddialTest = 100; + const ContactAddressType addressTypeTest = ContactAddressType ::WORK; + const ContactType contactTypeTest = ContactType ::USER; + const ContactNumberType contactNumberTypeTest = ContactNumberType ::PAGER; + + + ContactRecordInterface contRecInterface; + + ContactRecord recordIN; + + recordIN.primaryName=primaryNameTest; + recordIN.alternativeName= alternativeNameTest; + recordIN.numberUser=numberUserTest; + recordIN.numberE164=numberE164Test; + recordIN.numberType = contactNumberTypeTest; + recordIN.contactType=contactTypeTest; + recordIN.country=countryTest; + recordIN.city=cityTest; + recordIN.street=streetTest; + recordIN.number=numberTest; + recordIN.note=noteTest; + recordIN.mail=mailTest; + recordIN.addressType=addressTypeTest; + recordIN.assetPath=assetPath; + recordIN.speeddial=speeddialTest; + + + + REQUIRE(contRecInterface.Add(recordIN) == true); + + { + auto recordOUT = contRecInterface.GetByID(1); + + REQUIRE(recordOUT.dbID == 1); + + REQUIRE(recordOUT.primaryName == primaryNameTest); + REQUIRE(recordOUT.alternativeName == alternativeNameTest); + REQUIRE(recordOUT.numberUser == numberUserTest); + REQUIRE(recordOUT.numberE164 == numberE164Test); + REQUIRE(recordOUT.numberType == contactNumberTypeTest); + REQUIRE(recordOUT.contactType == contactTypeTest); + REQUIRE(recordOUT.country == countryTest); + REQUIRE(recordOUT.city == cityTest); + REQUIRE(recordOUT.street == streetTest); + REQUIRE(recordOUT.number == numberTest); + REQUIRE(recordOUT.note == noteTest); + REQUIRE(recordOUT.mail == mailTest); + REQUIRE(recordOUT.addressType == addressTypeTest); + REQUIRE(recordOUT.assetPath == assetPath); + REQUIRE(recordOUT.speeddial == speeddialTest); + + } + + + + + + + + + Database::Deinitialize(); +} \ No newline at end of file