From f5352686241a8aa5f2ab462ee97245fe5c8cbb35 Mon Sep 17 00:00:00 2001 From: Pawel Olejniczak Date: Mon, 8 Feb 2021 14:46:06 +0100 Subject: [PATCH] [EGD-5586] Clean up messages endpoint API Introducing changes according to new messages endpoint api proposal doc. All request have been updated, and some new were added. Harness tests were updated too. These changes will be followed up with pagination implementation. --- module-db/Interface/ThreadRecord.cpp | 4 +- .../developerMode/DeveloperModeHelper.cpp | 8 +- .../endpoints/messages/MessageHelper.cpp | 800 ++++++++++-------- .../endpoints/messages/MessageHelper.hpp | 58 +- .../endpoints/messages/MessagesEndpoint.cpp | 6 +- .../endpoints/messages/MessagesEndpoint.hpp | 2 +- .../service-desktop/parser/ParserUtils.cpp | 24 +- .../service-desktop/parser/ParserUtils.hpp | 64 +- .../service-desktop/tests/unittest.cpp | 14 +- test/pytest/service-desktop/test_messages.py | 49 +- test/pytest/service-desktop/test_templates.py | 50 +- test/pytest/service-desktop/test_threads.py | 27 + test/pytest/test_search_sms.py | 3 +- test/pytest/test_send_message.py | 20 +- test/search_sms.py | 3 +- 15 files changed, 645 insertions(+), 487 deletions(-) create mode 100644 test/pytest/service-desktop/test_threads.py diff --git a/module-db/Interface/ThreadRecord.cpp b/module-db/Interface/ThreadRecord.cpp index 7d8e3bc53d1c9a5fcb721bf117779dc2dabbc243..1f304577d4aa4f7b920de05ba9fe7354ee6feee2 100644 --- a/module-db/Interface/ThreadRecord.cpp +++ b/module-db/Interface/ThreadRecord.cpp @@ -226,7 +226,9 @@ std::unique_ptr ThreadRecordInterface::markAsReadQuery(const st ret = Update(record); } - return std::make_unique(ret); + auto response = std::make_unique(ret); + response->setRequestQuery(query); + return response; } std::unique_ptr ThreadRecordInterface::threadsGetQuery(const std::shared_ptr &query) diff --git a/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp b/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp index 1c9817348f421e8373cdf12d75e546a1e1f9a944..49b0570931bc8185be99c1520d524858d57b29b6 100644 --- a/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp +++ b/module-services/service-desktop/endpoints/developerMode/DeveloperModeHelper.cpp @@ -65,7 +65,7 @@ auto DeveloperModeHelper::processPutRequest(Context &context) -> sys::ReturnCode } else if (body[json::developerMode::smsCommand].is_string()) { if (body[json::developerMode::smsCommand].string_value() == json::developerMode::smsAdd) { - SMSType smsType = static_cast(context.getBody()[json::messages::type].int_value()); + const auto smsType = static_cast(context.getBody()[json::messages::messageType].int_value()); if (smsType == SMSType::DRAFT || smsType == SMSType::QUEUED || smsType == SMSType::FAILED) { return prepareSMS(context); } @@ -212,11 +212,9 @@ auto DeveloperModeHelper::smsRecordFromJson(json11::Json msgJson) -> SMSRecord { auto record = SMSRecord(); - record.type = static_cast(msgJson[json::messages::type].int_value()); + record.type = static_cast(msgJson[json::messages::messageType].int_value()); record.date = utils::time::getCurrentTimestamp().getTime(); - utils::PhoneNumber phoneNumber(msgJson[json::messages::phoneNumber].string_value()); - record.number = phoneNumber.getView(); - record.body = UTF8(msgJson[json::messages::messageBody].string_value()); + record.body = UTF8(msgJson[json::messages::messageBody].string_value()); return record; } diff --git a/module-services/service-desktop/endpoints/messages/MessageHelper.cpp b/module-services/service-desktop/endpoints/messages/MessageHelper.cpp index e6fd18d9d6c932347532938d91e1e34ee8d41dc4..f43fb09ab915c062cd87f881b38a7826b45a5c6a 100644 --- a/module-services/service-desktop/endpoints/messages/MessageHelper.cpp +++ b/module-services/service-desktop/endpoints/messages/MessageHelper.cpp @@ -9,16 +9,13 @@ #include #include -#include #include #include #include #include #include #include -#include #include -#include #include #include #include @@ -28,160 +25,308 @@ #include #include #include +#include #include #include #include #include -#include #include -#include +#include -using namespace parserFSM; - -auto MessageHelper::to_json(SMSRecord record) -> json11::Json +namespace parserFSM { - auto recordEntry = json11::Json::object{{json::messages::contactID, static_cast(record.contactID)}, - {json::messages::date, static_cast(record.date)}, - {json::messages::dateSent, static_cast(record.dateSent)}, - {json::messages::id, static_cast(record.ID)}, - {json::messages::messageBody, record.body.c_str()}, - {json::messages::type, static_cast(record.type)}, - {json::messages::threadID, static_cast(record.threadID)}}; - return recordEntry; -} - -auto MessageHelper::to_json(SMSTemplateRecord record) -> json11::Json -{ + auto MessageHelper::toJson(const SMSRecord &record) -> json11::Json + { - auto recordEntry = json11::Json::object{{json::messages::id, static_cast(record.ID)}, - {json::messages::templateText, record.text.c_str()}}; - return recordEntry; -} + auto recordEntry = json11::Json::object{{json::messages::contactID, static_cast(record.contactID)}, + {json::messages::receivedAt, static_cast(record.date)}, + {json::messages::sentAt, static_cast(record.dateSent)}, + {json::messages::messageID, static_cast(record.ID)}, + {json::messages::messageBody, record.body.c_str()}, + {json::messages::messageType, static_cast(record.type)}, + {json::messages::threadID, static_cast(record.threadID)}}; + return recordEntry; + } -auto MessageHelper::to_json(ThreadRecord record) -> json11::Json -{ + auto MessageHelper::toJson(const SMSTemplateRecord &record) -> json11::Json + { - auto recordEntry = - json11::Json::object{{json::messages::contactID, static_cast(record.contactID)}, - {json::messages::date, static_cast(record.date)}, - {json::messages::thread::msgCount, static_cast(record.msgCount)}, - {json::messages::id, static_cast(record.ID)}, - {json::messages::thread::snippet, record.snippet.c_str()}, - {json::messages::isUnread, record.isUnread()}, - {json::messages::type, static_cast(record.type)}, - {json::messages::thread::unreadMsgCount, static_cast(record.unreadMsgCount)}}; - return recordEntry; -} - -auto MessageHelper::from_json(json11::Json msgJson) -> SMSTemplateRecord -{ - SMSTemplateRecord record; + auto recordEntry = + json11::Json::object{{json::messages::templateID, static_cast(record.ID)}, + {json::messages::templateBody, record.text.c_str()}, + {json::messages::lastUsedAt, static_cast(record.lastUsageTimestamp)}}; + return recordEntry; + } - record.text = UTF8(msgJson[json::messages::templateText].string_value()); + auto MessageHelper::toJson(const ThreadRecord &record) -> json11::Json + { - return record; -} + auto recordEntry = json11::Json::object{{json::messages::contactID, static_cast(record.contactID)}, + {json::messages::numberID, static_cast(record.numberID)}, + {json::messages::lastUpdatedAt, static_cast(record.date)}, + {json::messages::messageCount, static_cast(record.msgCount)}, + {json::messages::threadID, static_cast(record.ID)}, + {json::messages::messageSnippet, record.snippet.c_str()}, + {json::messages::isUnread, record.isUnread()}, + {json::messages::messageType, static_cast(record.type)}}; + return recordEntry; + } -auto MessageHelper::requestDataFromDB(Context &context) -> sys::ReturnCodes -{ + auto MessageHelper::fromJson(const json11::Json &msgJson) -> SMSTemplateRecord + { + SMSTemplateRecord record; - if (context.getBody()[json::messages::msgTemplate].bool_value() == true) { - return requestTemplate(context); - } - else { - return requestSMS(context); + record.text = UTF8(msgJson[json::messages::templateBody].string_value()); + + return record; } -} -auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes -{ - if (context.getBody()[json::messages::count].bool_value() == true) // get messages count + auto MessageHelper::requestDataFromDB(Context &context) -> sys::ReturnCodes { - auto query = std::make_unique(); + if (context.getBody()[json::messages::category].string_value() == json::messages::categoryMessage) { + return requestSMS(context); + } + else if (context.getBody()[json::messages::category].string_value() == json::messages::categoryTemplate) { + return requestTemplate(context); + } + else if (context.getBody()[json::messages::category].string_value() == json::messages::categoryThread) { + return requestThread(context); + } + LOG_ERROR("Category of request is missing or incorrect!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { - auto id = SMSResult->getResults(); + auto MessageHelper::createDBEntry(Context &context) -> sys::ReturnCodes + { + if (context.getBody()[json::messages::category].string_value() == json::messages::categoryMessage) { + return createSMS(context); + } + else if (context.getBody()[json::messages::category].string_value() == json::messages::categoryTemplate) { + return createTemplate(context); + } + LOG_ERROR("Category of request is missing or incorrect!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } - context.setResponseBody(json11::Json::object{{json::messages::count, static_cast(id)}}); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); + auto MessageHelper::updateDBEntry(Context &context) -> sys::ReturnCodes + { + if (context.getBody()[json::messages::category].string_value() == json::messages::categoryTemplate) { + return updateTemplate(context); + } + else if (context.getBody()[json::messages::category].string_value() == json::messages::categoryThread) { + return updateThread(context); + } + LOG_ERROR("Category of request is missing or incorrect!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + auto MessageHelper::deleteDBEntry(Context &context) -> sys::ReturnCodes + { + if (context.getBody()[json::messages::category].string_value() == json::messages::categoryMessage) { + return deleteSMS(context); + } + else if (context.getBody()[json::messages::category].string_value() == json::messages::categoryTemplate) { + return deleteTemplate(context); + } + else if (context.getBody()[json::messages::category].string_value() == json::messages::categoryThread) { + return deleteThread(context); + } + LOG_ERROR("Category of request is missing or incorrect!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; } - else if (context.getBody()[json::messages::id].int_value() != 0) { // messages search - auto query = std::make_unique(context.getBody()[json::messages::id].int_value()); + auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes + { + if (context.getBody()[json::messages::count].bool_value()) // get messages count + { + auto query = std::make_unique(); + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsResult = dynamic_cast(result)) { + auto id = smsResult->getResults(); + + context.setResponseBody(json11::Json::object{{json::messages::count, static_cast(id)}}); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + } + else if (context.getBody()[json::messages::messageID].int_value() != 0) { // get message by ID - context.setResponseBody(MessageHelper::to_json(SMSResult->getResults())); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); + auto query = + std::make_unique(context.getBody()[json::messages::messageID].int_value()); - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); - } - else if (context.getBody()[json::messages::contactID].int_value() != 0) { + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsResult = dynamic_cast(result)) { - auto query = - std::make_unique(context.getBody()[json::messages::contactID].int_value()); + context.setResponseBody(MessageHelper::toJson(smsResult->getResults())); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + } + else if (context.getBody()[json::messages::threadID].int_value() != 0) { // get messages by thread ID + + auto query = + std::make_unique(context.getBody()[json::messages::threadID].int_value(), + context.getBody()[json::messages::offset].int_value(), + context.getBody()[json::messages::limit].is_number() + ? context.getBody()[json::messages::limit].int_value() + : defaultLimit); + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsResult = dynamic_cast(result)) { + + auto paginationInfo = json11::Json::object{ + {json::messages::totalCount, 0}, + {json::messages::nextPage, + json11::Json::object{{json::messages::offset, 0}, {json::messages::limit, 0}}}}; + + json11::Json::array smsArray; + for (const auto &record : smsResult->getResults()) { + smsArray.emplace_back(MessageHelper::toJson(record)); + } + + json11::Json::array responseBody; + responseBody.emplace_back(paginationInfo); + responseBody.emplace_back(json11::Json::array{{json::messages::entries, smsArray}}); + + context.setResponseBody(responseBody); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); + + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + } + else if (!context.getBody()[json::messages::messageBody].string_value().empty()) // get by message body + { + // not adding pagination for this request, since it is just for development and testing purposes, and it's + // not going to be used by Mudita Center + auto query = std::make_unique( + context.getBody()[json::messages::messageBody].string_value()); + if (const auto filterByNumber = !context.getBody()[json::messages::phoneNumber].string_value().empty(); + filterByNumber) { + utils::PhoneNumber number{context.getBody()[json::messages::phoneNumber].string_value()}; + query->filterByPhoneNumber(number.getView()); + } + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsResult = dynamic_cast(result)) { - json11::Json::array SMSarray; - for (auto record : SMSResult->getResults()) { - SMSarray.emplace_back(MessageHelper::to_json(record)); + json11::Json::array smsArray; + for (const auto &record : smsResult->getResults()) { + smsArray.emplace_back(MessageHelper::toJson(record)); + } + + context.setResponseBody(smsArray); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; } + }, + context); - context.setResponseBody(SMSarray); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + } + else // get messages + { + auto query = std::make_unique(context.getBody()[json::messages::limit].is_number() + ? context.getBody()[json::messages::limit].int_value() + : defaultLimit, + context.getBody()[json::messages::offset].int_value()); + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsResult = dynamic_cast(result)) { + + auto paginationInfo = json11::Json::object{ + {json::messages::totalCount, 0}, + {json::messages::nextPage, + json11::Json::object{{json::messages::offset, 0}, {json::messages::limit, 0}}}}; + + json11::Json::array smsArray; + for (const auto &record : smsResult->getRecords()) { + smsArray.emplace_back(MessageHelper::toJson(record)); + LOG_DEBUG("Record found!: %" PRIu32 "\n", record.ID); + } + + json11::Json::array responseBody; + responseBody.emplace_back(paginationInfo); + responseBody.emplace_back(json11::Json::array{{json::messages::entries, smsArray}}); + context.setResponseBody(responseBody); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + } + return sys::ReturnCodes::Success; } - else if (context.getBody()[json::messages::threadID].int_value() != 0) { - auto query = - std::make_unique(context.getBody()[json::messages::threadID].int_value()); + auto MessageHelper::createSMS(Context &context) -> sys::ReturnCodes + { + context.setResponseStatus(http::Code::InternalServerError); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Success; + } + auto MessageHelper::deleteSMS(Context &context) -> sys::ReturnCodes + { + if (!context.getBody()[json::messages::messageID].is_number()) { + LOG_ERROR("Bad request! messageID is incorrect or missing!"); + return sys::ReturnCodes::Unresolved; + } + auto id = context.getBody()[json::messages::messageID].int_value(); + auto query = std::make_unique(id); auto listener = std::make_unique( [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { - - json11::Json::array SMSarray; - for (auto record : SMSResult->getResults()) { - SMSarray.emplace_back(MessageHelper::to_json(record)); - } + if (auto smsTemplateResult = dynamic_cast(result)) { - context.setResponseBody(SMSarray); + context.setResponseStatus(smsTemplateResult->getResults() ? http::Code::OK + : http::Code::InternalServerError); MessageHandler::putToSendQueue(context.createSimpleResponse()); return true; } @@ -193,53 +338,123 @@ auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes query->setQueryListener(std::move(listener)); DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + + return sys::ReturnCodes::Success; } - else if (context.getBody()[json::messages::messageBody].string_value().empty() == false) { - auto query = - std::make_unique(context.getBody()[json::messages::messageBody].string_value()); - if (const auto filterByNumber = !context.getBody()[json::messages::phoneNumber].string_value().empty(); - filterByNumber) { - utils::PhoneNumber number{context.getBody()[json::messages::phoneNumber].string_value()}; - query->filterByPhoneNumber(number.getView()); + + auto MessageHelper::requestTemplate(Context &context) -> sys::ReturnCodes + { + if (context.getBody()[json::messages::count].bool_value()) // get templates count + { + auto query = std::make_unique(); + + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsResult = dynamic_cast(result)) { + auto id = smsResult->getResults(); + + context.setResponseBody(json11::Json::object{{json::messages::count, static_cast(id)}}); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); + + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); } + else if (context.getBody()[json::messages::templateID].int_value() != 0) { // get template by ID + auto query = std::make_unique( + context.getBody()[json::messages::templateID].int_value()); - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsTemplateResult = dynamic_cast(result)) { - json11::Json::array SMSarray; - for (auto record : SMSResult->getResults()) { - SMSarray.emplace_back(MessageHelper::to_json(record)); + context.setResponseBody(MessageHelper::toJson(smsTemplateResult->getResults())); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; } + else { + return false; + } + }, + context); - context.setResponseBody(SMSarray); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); + } + else // get messages templates + { + auto query = + std::make_unique(context.getBody()[json::messages::offset].int_value(), + context.getBody()[json::messages::limit].is_number() + ? context.getBody()[json::messages::limit].int_value() + : defaultLimit); + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto smsTemplateResult = dynamic_cast(result)) { + + auto paginationInfo = json11::Json::object{ + {json::messages::totalCount, 0}, + {json::messages::nextPage, + json11::Json::object{{json::messages::offset, 0}, {json::messages::limit, 0}}}}; + + json11::Json::array smsTemplateArray; + for (const auto &record : smsTemplateResult->getResults()) { + smsTemplateArray.emplace_back(toJson(record)); + } + + json11::Json::array responseBody; + responseBody.emplace_back(paginationInfo); + responseBody.emplace_back(json11::Json::array{{json::messages::entries, smsTemplateArray}}); + + context.setResponseBody(responseBody); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); + query->setQueryListener(std::move(listener)); + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); + } + + return sys::ReturnCodes::Success; } - else // get messages + auto MessageHelper::updateTemplate(Context &context) -> sys::ReturnCodes { - auto query = std::make_unique(context.getBody()[json::messages::count].int_value(), - context.getBody()[json::messages::offset].int_value()); + if (!context.getBody()[json::messages::templateID].is_number()) { + LOG_ERROR("Bad request! templateID is incorrect or missing!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } + + if (!context.getBody()[json::messages::templateBody].is_string()) { + LOG_ERROR("Bad request! templateBody is incorrect or missing!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } + + SMSTemplateRecord record; + record.ID = context.getBody()[json::messages::templateID].int_value(); + record.text = context.getBody()[json::messages::templateBody].string_value(); + auto query = std::make_unique(record); auto listener = std::make_unique( [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { - - json11::Json::array SMSarray; - for (auto record : SMSResult->getRecords()) { - SMSarray.emplace_back(MessageHelper::to_json(record)); - } + if (auto smsTemplateResult = dynamic_cast(result)) { - context.setResponseBody(SMSarray); + context.setResponseStatus(smsTemplateResult->getResult() ? http::Code::OK + : http::Code::InternalServerError); MessageHandler::putToSendQueue(context.createSimpleResponse()); return true; } @@ -250,24 +465,29 @@ auto MessageHelper::requestSMS(Context &context) -> sys::ReturnCodes context); query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); - } + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); - return sys::ReturnCodes::Success; -} + return sys::ReturnCodes::Success; + } -auto MessageHelper::requestTemplate(Context &context) -> sys::ReturnCodes -{ - if (context.getBody()[json::messages::count].bool_value() == true) // get templates count + auto MessageHelper::createTemplate(Context &context) -> sys::ReturnCodes { - auto query = std::make_unique(); + if (!context.getBody()[json::messages::templateBody].is_string()) { + LOG_ERROR("Bad request! templateBody is incorrect or missing!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } + SMSTemplateRecord record = fromJson(context.getBody()); + + auto query = std::make_unique(record); auto listener = std::make_unique( [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { - auto id = SMSResult->getResults(); + if (auto smsTemplateResult = dynamic_cast(result)) { - context.setResponseBody(json11::Json::object{{json::messages::count, static_cast(id)}}); + context.setResponseStatus(smsTemplateResult->getResult() ? http::Code::OK + : http::Code::InternalServerError); MessageHandler::putToSendQueue(context.createSimpleResponse()); return true; } @@ -279,15 +499,27 @@ auto MessageHelper::requestTemplate(Context &context) -> sys::ReturnCodes query->setQueryListener(std::move(listener)); DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); + + return sys::ReturnCodes::Success; } - else if (context.getBody()[json::messages::id].int_value() != 0) { // templates search - auto query = std::make_unique(context.getBody()[json::messages::id].int_value()); + auto MessageHelper::deleteTemplate(Context &context) -> sys::ReturnCodes + { + if (!context.getBody()[json::messages::templateID].is_number()) { + LOG_ERROR("Bad request! templateID is incorrect or missing!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } + + auto query = + std::make_unique(context.getBody()[json::messages::templateID].int_value()); auto listener = std::make_unique( [=](db::QueryResult *result, Context context) { - if (auto SMSTemplateResult = dynamic_cast(result)) { + if (auto smsTemplateResult = dynamic_cast(result)) { - context.setResponseBody(MessageHelper::to_json(SMSTemplateResult->getResults())); + context.setResponseStatus(smsTemplateResult->getResults() ? http::Code::OK + : http::Code::InternalServerError); MessageHandler::putToSendQueue(context.createSimpleResponse()); return true; } @@ -299,21 +531,35 @@ auto MessageHelper::requestTemplate(Context &context) -> sys::ReturnCodes query->setQueryListener(std::move(listener)); DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); + return sys::ReturnCodes::Success; } - else // get messages templates + + auto MessageHelper::requestThread(Context &context) -> sys::ReturnCodes { - auto query = std::make_unique(context.getBody()[json::messages::offset].int_value(), - context.getBody()[json::messages::count].int_value()); + auto query = std::make_unique(context.getBody()[json::messages::offset].int_value(), + context.getBody()[json::messages::limit].is_number() + ? context.getBody()[json::messages::limit].int_value() + : defaultLimit); + auto listener = std::make_unique( [=](db::QueryResult *result, Context context) { - if (auto SMSTemplateResult = dynamic_cast(result)) { + if (auto threadsResults = dynamic_cast(result)) { + + auto paginationInfo = json11::Json::object{ + {json::messages::totalCount, 0}, + {json::messages::nextPage, + json11::Json::object{{json::messages::offset, 0}, {json::messages::limit, 0}}}}; - json11::Json::array SMSTemplateArray; - for (auto record : SMSTemplateResult->getResults()) { - SMSTemplateArray.emplace_back(to_json(record)); + json11::Json::array threadsArray; + for (const auto &record : threadsResults->getResults()) { + threadsArray.emplace_back(MessageHelper::toJson(record)); } - context.setResponseBody(SMSTemplateArray); + json11::Json::array responseBody; + responseBody.emplace_back(paginationInfo); + responseBody.emplace_back(json11::Json::array{{json::messages::entries, threadsArray}}); + + context.setResponseBody(responseBody); MessageHandler::putToSendQueue(context.createSimpleResponse()); return true; } @@ -324,178 +570,58 @@ auto MessageHelper::requestTemplate(Context &context) -> sys::ReturnCodes context); query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); - } + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSThread, std::move(query)); - return sys::ReturnCodes::Success; -} - -auto MessageHelper::createDBEntry(Context &context) -> sys::ReturnCodes -{ - - if (context.getBody()[json::messages::msgTemplate].bool_value() == true) { - return createTemplate(context); + return sys::ReturnCodes::Success; } - else { - return createSMS(context); - } -} -auto MessageHelper::createTemplate(Context &context) -> sys::ReturnCodes -{ - SMSTemplateRecord record = from_json(context.getBody()); + auto MessageHelper::updateThread(Context &context) -> sys::ReturnCodes // Set thread as read/unread + { + if (!context.getBody()[json::messages::threadID].is_number()) { + LOG_ERROR("Bad request! threadID is incorrect or missing!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } - auto query = std::make_unique(record); - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSTemplateResult = dynamic_cast(result)) { + if (!context.getBody()[json::messages::isUnread].is_bool()) { + LOG_ERROR("Bad request! isUnread is incorrect or missing!"); + context.setResponseStatus(http::Code::BadRequest); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Unresolved; + } - context.setResponseStatus(SMSTemplateResult->getResult() ? http::Code::OK - : http::Code::InternalServerError); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); + auto query = std::make_unique(context.getBody()[json::messages::threadID].int_value(), + (context.getBody()[json::messages::isUnread].bool_value() + ? db::query::MarkAsRead::Read::False + : db::query::MarkAsRead::Read::True)); - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); + auto listener = std::make_unique( + [=](db::QueryResult *result, Context context) { + if (auto threadResult = dynamic_cast(result)) { - return sys::ReturnCodes::Success; -} + context.setResponseStatus(threadResult->getResult() ? http::Code::OK + : http::Code::InternalServerError); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return true; + } + else { + return false; + } + }, + context); -auto MessageHelper::createSMS(Context &context) -> sys::ReturnCodes -{ - return sys::ReturnCodes::Success; -} + query->setQueryListener(std::move(listener)); -auto MessageHelper::deleteDBEntry(Context &context) -> sys::ReturnCodes -{ + DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSThread, std::move(query)); - if (context.getBody()[json::messages::msgTemplate].bool_value() == true) { - return deleteTemplate(context); - } - else { - return deleteSMS(context); + return sys::ReturnCodes::Success; } -} - -auto MessageHelper::deleteSMS(Context &context) -> sys::ReturnCodes -{ - auto id = context.getBody()[json::messages::id].int_value(); - auto query = std::make_unique(id); - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSTemplateResult = dynamic_cast(result)) { - - context.setResponseStatus(SMSTemplateResult->getResults() ? http::Code::OK - : http::Code::InternalServerError); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMS, std::move(query)); - - return sys::ReturnCodes::Success; -} - -auto MessageHelper::deleteTemplate(Context &context) -> sys::ReturnCodes -{ - auto id = context.getBody()[json::messages::id].int_value(); - auto query = std::make_unique(id); - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSTemplateResult = dynamic_cast(result)) { - - context.setResponseStatus(SMSTemplateResult->getResults() ? http::Code::OK - : http::Code::InternalServerError); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); - - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); - return sys::ReturnCodes::Success; -} - -auto MessageHelper::updateDBEntry(Context &context) -> sys::ReturnCodes -{ - - if (context.getBody()[json::messages::msgTemplate].bool_value() == true) { - return updateTemplate(context); - } - else { - return updateSMS(context); + auto MessageHelper::deleteThread(Context &context) -> sys::ReturnCodes + { + context.setResponseStatus(http::Code::InternalServerError); + MessageHandler::putToSendQueue(context.createSimpleResponse()); + return sys::ReturnCodes::Success; } -} - -auto MessageHelper::updateSMS(Context &context) -> sys::ReturnCodes -{ - using namespace db::query; - - auto query = std::make_unique( - context.getBody()[json::messages::threadID].int_value(), - (context.getBody()[json::messages::isUnread].bool_value() ? MarkAsRead::Read::False : MarkAsRead::Read::True)); - - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSResult = dynamic_cast(result)) { - - context.setResponseStatus(SMSResult->getResult() ? http::Code::OK : http::Code::InternalServerError); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - - return true; - } - else { - return false; - } - }, - context); - - query->setQueryListener(std::move(listener)); - - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSThread, std::move(query)); - return sys::ReturnCodes::Success; -} - -auto MessageHelper::updateTemplate(Context &context) -> sys::ReturnCodes -{ - SMSTemplateRecord record; - record.ID = context.getBody()[json::messages::id].int_value(); - record.text = context.getBody()[json::messages::templateText].string_value(); - - auto query = std::make_unique(record); - auto listener = std::make_unique( - [=](db::QueryResult *result, Context context) { - if (auto SMSTemplateResult = dynamic_cast(result)) { - - context.setResponseStatus(SMSTemplateResult->getResult() ? http::Code::OK - : http::Code::InternalServerError); - MessageHandler::putToSendQueue(context.createSimpleResponse()); - return true; - } - else { - return false; - } - }, - context); - - query->setQueryListener(std::move(listener)); - DBServiceAPI::GetQuery(ownerServicePtr, db::Interface::Name::SMSTemplate, std::move(query)); - - return sys::ReturnCodes::Success; -} +} // namespace parserFSM diff --git a/module-services/service-desktop/endpoints/messages/MessageHelper.hpp b/module-services/service-desktop/endpoints/messages/MessageHelper.hpp index e02a21655647d8b0585d07403e6d7f2c1b53f4be..a012293c81b26dbffafb664aa0216e996253e583 100644 --- a/module-services/service-desktop/endpoints/messages/MessageHelper.hpp +++ b/module-services/service-desktop/endpoints/messages/MessageHelper.hpp @@ -14,9 +14,6 @@ #include #include -#include -#include - namespace sys { class Service; @@ -29,55 +26,34 @@ namespace parserFSM class MessageHelper final : public DBHelper { public: - MessageHelper(sys::Service *_ownerServicePtr) : DBHelper(_ownerServicePtr){}; + explicit MessageHelper(sys::Service *_ownerServicePtr) : DBHelper(_ownerServicePtr){}; auto createDBEntry(Context &context) -> sys::ReturnCodes override; auto requestDataFromDB(Context &context) -> sys::ReturnCodes override; auto updateDBEntry(Context &context) -> sys::ReturnCodes override; auto deleteDBEntry(Context &context) -> sys::ReturnCodes override; - auto createTemplate(Context &context) -> sys::ReturnCodes; - auto requestTemplate(Context &context) -> sys::ReturnCodes; - auto updateTemplate(Context &context) -> sys::ReturnCodes; - auto deleteTemplate(Context &context) -> sys::ReturnCodes; + static auto toJson(const SMSRecord &record) -> json11::Json; + static auto toJson(const ThreadRecord &record) -> json11::Json; + static auto toJson(const SMSTemplateRecord &record) -> json11::Json; + static auto fromJson(const json11::Json &msgJson) -> SMSTemplateRecord; + + private: + auto requestThread(Context &context) -> sys::ReturnCodes; + auto updateThread(Context &context) -> sys::ReturnCodes; + auto deleteThread(Context &context) -> sys::ReturnCodes; - auto createSMS(Context &context) -> sys::ReturnCodes; auto requestSMS(Context &context) -> sys::ReturnCodes; - auto updateSMS(Context &context) -> sys::ReturnCodes; + auto createSMS(Context &context) -> sys::ReturnCodes; auto deleteSMS(Context &context) -> sys::ReturnCodes; - // auto createSimpleResponse(Context &context) -> std::string override; - - static auto to_json(SMSRecord record) -> json11::Json; - static auto to_json(ThreadRecord record) -> json11::Json; - static auto to_json(SMSTemplateRecord record) -> json11::Json; - static auto from_json(json11::Json msgJson) -> SMSTemplateRecord; + auto requestTemplate(Context &context) -> sys::ReturnCodes; + auto createTemplate(Context &context) -> sys::ReturnCodes; + auto updateTemplate(Context &context) -> sys::ReturnCodes; + auto deleteTemplate(Context &context) -> sys::ReturnCodes; - private: json11::Json receivedJson; - }; - - namespace messages - { - inline constexpr auto id = "id"; - inline constexpr auto count = "count"; - inline constexpr auto offset = "offset"; - inline constexpr auto phoneNumber = "phoneNumber"; - inline constexpr auto isUnread = "unread"; - inline constexpr auto contactID = "contactID"; - inline constexpr auto date = "date"; - inline constexpr auto dateSent = "dateSent"; - inline constexpr auto type = "type"; - inline constexpr auto threadID = "threadID"; - inline constexpr auto msgTemplate = "template"; - inline constexpr auto templateText = "text"; - namespace thread - { - inline constexpr auto msgCount = "msgCount"; - inline constexpr auto snippet = "snippet"; - inline constexpr auto unreadMsgCount = "unreadMsgCount"; - } // namespace thread - - } // namespace messages + const int defaultLimit = 100; // will be removed after introducing pagination + }; } // namespace parserFSM diff --git a/module-services/service-desktop/endpoints/messages/MessagesEndpoint.cpp b/module-services/service-desktop/endpoints/messages/MessagesEndpoint.cpp index 59721b3293bc2dbee398c1c873dc82d9d194dc6a..1d77085abc40706670915792ae47c470f8a41bae 100644 --- a/module-services/service-desktop/endpoints/messages/MessagesEndpoint.cpp +++ b/module-services/service-desktop/endpoints/messages/MessagesEndpoint.cpp @@ -14,11 +14,11 @@ auto MessagesEndpoint::handle(Context &context) -> void case http::Method::get: helper->requestDataFromDB(context); break; - case http::Method::post: // update entry - helper->updateDBEntry(context); + case http::Method::post: + helper->createDBEntry(context); break; case http::Method::put: - helper->createDBEntry(context); + helper->updateDBEntry(context); break; case http::Method::del: helper->deleteDBEntry(context); diff --git a/module-services/service-desktop/endpoints/messages/MessagesEndpoint.hpp b/module-services/service-desktop/endpoints/messages/MessagesEndpoint.hpp index bb2a220d1495c82ce9656649445fbec8ee09b558..6314bb34b70cd09653d018ec8b678dc28b1a02d3 100644 --- a/module-services/service-desktop/endpoints/messages/MessagesEndpoint.hpp +++ b/module-services/service-desktop/endpoints/messages/MessagesEndpoint.hpp @@ -27,7 +27,7 @@ class MessagesEndpoint : public parserFSM::Endpoint std::shared_ptr helper; public: - MessagesEndpoint(sys::Service *_ownerServicePtr) : Endpoint(_ownerServicePtr) + explicit MessagesEndpoint(sys::Service *_ownerServicePtr) : Endpoint(_ownerServicePtr) { debugName = "MessagesEndpoint"; helper = std::make_shared(ownerServicePtr); diff --git a/module-services/service-desktop/parser/ParserUtils.cpp b/module-services/service-desktop/parser/ParserUtils.cpp index 7a6302f5677d2bd22eb8c6e88df20dc4d36008e3..df59901fb3a0d72751f87ca6b2a48bce26bdb944 100644 --- a/module-services/service-desktop/parser/ParserUtils.cpp +++ b/module-services/service-desktop/parser/ParserUtils.cpp @@ -5,16 +5,18 @@ #include -using namespace parserFSM; - -bool http::isMethodValid(uint8_t method) +namespace parserFSM { - if (method == static_cast(http::Method::get) || method == static_cast(http::Method::post) || - method == static_cast(http::Method::put) || method == static_cast(http::Method::del)) { - return true; - } - else { - LOG_ERROR("Invalid method!"); - return false; + + bool http::isMethodValid(uint8_t method) + { + if (method == static_cast(http::Method::get) || method == static_cast(http::Method::post) || + method == static_cast(http::Method::put) || method == static_cast(http::Method::del)) { + return true; + } + else { + LOG_ERROR("Invalid method!"); + return false; + } } -} +} // namespace parserFSM diff --git a/module-services/service-desktop/parser/ParserUtils.hpp b/module-services/service-desktop/parser/ParserUtils.hpp index dd88784e99d9a96416f46c444a4d59755af452bc..fc580a362daff531abdadb1cec1763d247856d16 100644 --- a/module-services/service-desktop/parser/ParserUtils.hpp +++ b/module-services/service-desktop/parser/ParserUtils.hpp @@ -45,7 +45,7 @@ namespace parserFSM msg.erase(msg.begin(), msg.begin() + size_header); } - inline unsigned long calcPayloadLength(const std::string header) + inline unsigned long calcPayloadLength(const std::string &header) { try { return std::stol(header.substr(1, std::string::npos)); @@ -67,10 +67,12 @@ namespace parserFSM } inline std::string extractPayload(std::string &msg, size_t payloadLength) { - if (msg.size() > payloadLength) + if (msg.size() > payloadLength) { return msg.substr(0, payloadLength); - else + } + else { return msg; + } } } // namespace message @@ -140,9 +142,9 @@ namespace parserFSM inline constexpr auto command = "command"; namespace commands { - inline constexpr auto upload = "upload"; - inline constexpr auto rm = "rm"; - inline constexpr auto download = "download"; + inline constexpr auto upload = "upload"; + inline constexpr auto rm = "rm"; + inline constexpr auto download = "download"; inline constexpr auto checkFile = "checkFile"; } // namespace commands } // namespace filesystem @@ -159,27 +161,35 @@ namespace parserFSM namespace messages { - inline constexpr auto id = "id"; - inline constexpr auto count = "count"; - inline constexpr auto offset = "offset"; - inline constexpr auto phoneNumber = "phoneNumber"; - inline constexpr auto messageBody = "messageBody"; - inline constexpr auto isUnread = "unread"; - inline constexpr auto contactID = "contactID"; - inline constexpr auto date = "date"; - inline constexpr auto dateSent = "dateSent"; - inline constexpr auto type = "type"; - inline constexpr auto threadID = "threadID"; - inline constexpr auto msgTemplate = "template"; - inline constexpr auto templateText = "text"; - namespace thread - { - inline constexpr auto msgCount = "msgCount"; - inline constexpr auto snippet = "snippet"; - inline constexpr auto unreadMsgCount = "unreadMsgCount"; - - } // namespace thread - + inline constexpr auto count = "count"; + inline constexpr auto category = "category"; + inline constexpr auto categoryMessage = "message"; + inline constexpr auto categoryThread = "thread"; + inline constexpr auto categoryTemplate = "template"; + + inline constexpr auto limit = "limit"; + inline constexpr auto offset = "offset"; + inline constexpr auto totalCount = "totalCount"; + inline constexpr auto nextPage = "nextPage"; + inline constexpr auto entries = "entries"; + inline constexpr auto messageBody = "messageBody"; + inline constexpr auto messageCount = "messageCount"; + inline constexpr auto messageID = "messageID"; + inline constexpr auto messageType = "messageType"; + inline constexpr auto phoneNumber = "phoneNumber"; + inline constexpr auto receivedAt = "receivedAt"; + inline constexpr auto sentAt = "sentAt"; + inline constexpr auto lastUsedAt = "lastUsedAt"; + inline constexpr auto lastUpdatedAt = "lastUpdatedAt"; + inline constexpr auto isUnread = "isUnread"; + inline constexpr auto contactID = "contactID"; + inline constexpr auto numberID = "numberID"; + inline constexpr auto threadID = "threadID"; + inline constexpr auto messageSnippet = "messageSnippet"; + inline constexpr auto unreadMessageCount = "unreadMessageCount"; + inline constexpr auto messageTemplate = "messageTemplate"; + inline constexpr auto templateBody = "templateBody"; + inline constexpr auto templateID = "templateID"; } // namespace messages } // namespace json diff --git a/module-services/service-desktop/tests/unittest.cpp b/module-services/service-desktop/tests/unittest.cpp index b4419a511147cdc75f74abc232d53b448d787c21..5c4b24fea0d196c168c1dcdee46efbb75ac132b0 100644 --- a/module-services/service-desktop/tests/unittest.cpp +++ b/module-services/service-desktop/tests/unittest.cpp @@ -221,24 +221,24 @@ TEST_CASE("DB Helpers test - json encoding (messages)") message->ID = 10; message->type = SMSType::DRAFT; - auto messageJson = helper->to_json(*message); + auto messageJson = helper->toJson(*message); REQUIRE(messageJson[json::messages::messageBody] == "test message"); REQUIRE(messageJson[json::messages::contactID] == 1); - REQUIRE(messageJson[json::messages::date] == 12345); - REQUIRE(messageJson[json::messages::dateSent] == 54321); + REQUIRE(messageJson[json::messages::receivedAt] == 12345); + REQUIRE(messageJson[json::messages::sentAt] == 54321); REQUIRE(messageJson[json::messages::threadID] == 1); - REQUIRE(messageJson[json::messages::id] == 10); + REQUIRE(messageJson[json::messages::messageID] == 10); auto messageTemplate = std::make_unique(); messageTemplate->text = "test template"; messageTemplate->ID = 1; - auto messageTemplateJson = helper->to_json(*messageTemplate); + auto messageTemplateJson = helper->toJson(*messageTemplate); - REQUIRE(messageTemplateJson[json::messages::templateText] == "test template"); - REQUIRE(messageTemplateJson[json::messages::id] == 1); + REQUIRE(messageTemplateJson[json::messages::templateBody] == "test template"); + REQUIRE(messageTemplateJson[json::messages::templateID] == 1); } TEST_CASE("Context class test") diff --git a/test/pytest/service-desktop/test_messages.py b/test/pytest/service-desktop/test_messages.py index 781451c802041fae305cbdf864d567a4af856a2d..c7f93c9ee3928c8a709dd32bd334e55c6527ae01 100644 --- a/test/pytest/service-desktop/test_messages.py +++ b/test/pytest/service-desktop/test_messages.py @@ -1,4 +1,4 @@ -# Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +# Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. # For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md import pytest @@ -8,50 +8,51 @@ from harness.interface.defs import status @pytest.mark.service_desktop_test def test_messages(harness): # getting the messages count - body = {"count": True} + body = {"category": "message", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] count = ret["body"]["count"] if count == 0: - pytest.skip("No contacts entries, skipping") + pytest.skip("No messages entries, skipping") # getting all the messages - body = {"count": count} + body = {"category": "message", "limit": count, "offset": 0} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] - messages = ret["body"] + messages = ret["body"][1][1] # getting entries messages_count = len(messages) assert messages_count == count - # remove message - sms_to_remove = messages[0] - body = {"id": sms_to_remove["id"]} - ret = harness.endpoint_request("messages", "del", body) - assert ret["status"] == status["OK"] - - # getting the messages count again - body = {"count": True} + # getting a number of messages + number_of_requested_messages = 3 + body = {"category": "message", "limit": number_of_requested_messages, "offset": 0} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] - assert ret["body"]["count"] == count - 1 + messages = ret["body"][1][1] # getting entries + messages_count = len(messages) + assert messages_count == number_of_requested_messages - # getting messages binded to contactID - contact_id = 2 # in test dataset this one has some messages - body = {"contactID": contact_id} + # getting messages binded to threadID + thread_id = 1 + body = {"category": "message", "threadID": thread_id, "limit": 10, "offset": 0} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] - for message in ret["body"]: - assert message["contactID"] == contact_id + for message in ret["body"][1][1]: + assert message["threadID"] == thread_id - # getting messages binded to threadID - thread_id = 1 - body = {"threadID": thread_id, "count": 10} + # remove message + sms_to_remove = messages[0] + body = {"category": "message", "messageID": sms_to_remove["messageID"]} + ret = harness.endpoint_request("messages", "del", body) + assert ret["status"] == status["OK"] + + # getting the messages count again + body = {"category": "message", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] - for message in ret["body"]: - assert message["threadID"] == thread_id + assert ret["body"]["count"] == count - 1 diff --git a/test/pytest/service-desktop/test_templates.py b/test/pytest/service-desktop/test_templates.py index ef29883a41c5e656a98a4a573a3a872f643164bb..a388bc3c45bf01c2162eba54ce051df1f368f0f5 100644 --- a/test/pytest/service-desktop/test_templates.py +++ b/test/pytest/service-desktop/test_templates.py @@ -1,62 +1,78 @@ -# Copyright (c) 2017-2020, Mudita Sp. z.o.o. All rights reserved. +# Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. # For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md import pytest from harness.interface.defs import status @pytest.mark.service_desktop_test -def test_messages(harness): +def test_templates(harness): # getting the templates count - body = {"template": True, "count": True} + body = {"category": "template", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] count = ret["body"]["count"] if count == 0: - body = {"template": True, "text": "first template"} - ret = harness.endpoint_request("messages", "put", body) + body = {"category": "template", "templateBody": "first template"} + ret = harness.endpoint_request("messages", "post", body) assert ret["status"] == status["OK"] - body = {"template": True, "count": True} + body = {"category": "template", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] count = ret["body"]["count"] assert count # getting all templates - body = {"template": True, "count": count} + body = {"category": "template", "limit": count} + ret = harness.endpoint_request("messages", "get", body) + assert ret["status"] == status["OK"] + assert len(ret["body"][1][1]) == count + + # getting a number of templates + number_of_requested_templates = 3 + body = {"category": "template", "limit": number_of_requested_templates, "offset": 0} + ret = harness.endpoint_request("messages", "get", body) + assert ret["status"] == status["OK"] + + templates = ret["body"][1][1] # getting entries + templates_count = len(templates) + assert templates_count == number_of_requested_templates + + # getting template by ID + body = {"category": "template", "templateID": 1} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] - assert len(ret["body"]) == count # adding new template - body = {"template": True, "text": "test template"} - ret = harness.endpoint_request("messages", "put", body) + body = {"category": "template", "templateBody": "test template"} + ret = harness.endpoint_request("messages", "post", body) assert ret["status"] == status["OK"] # getting the templates count again - body = {"template": True, "count": True} + body = {"category": "template", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] assert ret["body"]["count"] == count + 1 # getting template to remove - body = {"template": True, "count": count + 1} + body = {"category": "template", "limit": count + 1} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] - for template in ret["body"]: - if template["text"] == "test template": - id = template["id"] + templateid = 0 + for template in ret["body"][1][1]: + if template["templateBody"] == "test template": + templateid = template["templateID"] break # removing template - body = {"template": True, "id": id} + body = {"category": "template", "templateID": templateid} ret = harness.endpoint_request("messages", "del", body) assert ret["status"] == status["OK"] # getting the templates count again - body = {"template": True, "count": True} + body = {"category": "template", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] assert ret["body"]["count"] == count diff --git a/test/pytest/service-desktop/test_threads.py b/test/pytest/service-desktop/test_threads.py new file mode 100644 index 0000000000000000000000000000000000000000..ebe44364ee8adfed08c58f87e5b8ebd2f8cac1e4 --- /dev/null +++ b/test/pytest/service-desktop/test_threads.py @@ -0,0 +1,27 @@ +# Copyright (c) 2017-2021, Mudita Sp. z.o.o. All rights reserved. +# For licensing, see https://github.com/mudita/MuditaOS/LICENSE.md +import pytest +from harness.interface.defs import status + + +@pytest.mark.service_desktop_test +def test_threads(harness): + # getting all threads + body = {"category": "thread"} + ret = harness.endpoint_request("messages", "get", body) + assert ret["status"] == status["OK"] + + # getting a number of threads + number_of_requested_threads = 3 + body = {"category": "thread", "limit": number_of_requested_threads, "offset": 0} + ret = harness.endpoint_request("messages", "get", body) + assert ret["status"] == status["OK"] + + threads = ret["body"][1][1] # getting entries + threads_count = len(threads) + assert threads_count == number_of_requested_threads + + # set thread as read + body = {"category": "thread", "threadID": 1, "isUnread": False} + ret = harness.endpoint_request("messages", "put", body) + assert ret["status"] == status["OK"] diff --git a/test/pytest/test_search_sms.py b/test/pytest/test_search_sms.py index f21a05536ecbfa481fbe9539150860b832ac37f1..c3c4256a47423515033172c76aa824c3b429700d 100644 --- a/test/pytest/test_search_sms.py +++ b/test/pytest/test_search_sms.py @@ -5,9 +5,10 @@ import pytest from harness.interface.defs import key_codes + @pytest.mark.rt1051 @pytest.mark.usefixtures("phone_unlocked") def test_search_sms(harness, sms_text, phone_number): - body = {"messageBody": sms_text, "phoneNumber": str(phone_number)} + body = {"category": "message", "messageBody": sms_text, "phoneNumber": str(phone_number)} messages = harness.endpoint_request("messages", "get", body)["body"] assert len(messages) != 0 diff --git a/test/pytest/test_send_message.py b/test/pytest/test_send_message.py index 117b3c1e2e212123363f2bb6ef8e5e77c23a1b87..a9073407083a6c41aa0ac5963393e13cacceca52 100644 --- a/test/pytest/test_send_message.py +++ b/test/pytest/test_send_message.py @@ -9,27 +9,27 @@ from harness.interface.CDCSerial import Keytype def erase_all_templates(harness): # getting the templates count - body = {"template": True, "count": True} + body = {"category": "template", "count": True} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] count = ret["body"]["count"] # getting all templates - body = {"template": True, "count": count} + body = {"category": "template", "limit": count} ret = harness.endpoint_request("messages", "get", body) assert ret["status"] == status["OK"] - assert len(ret["body"]) == count + assert len(ret["body"][1][1]) == count - for template in ret["body"]: - body = {"template": True, "id": template["id"]} + for template in ret["body"][1][1]: + body = {"category": "template", "templateID": template["templateID"]} del_res = harness.endpoint_request("messages", "del", body) assert del_res["status"] == status["OK"] def add_new_template(harness, template_text: str): # adding new template - body = {"template": True, "text": template_text} - ret = harness.endpoint_request("messages", "put", body) + body = {"category": "template", "templateBody": template_text} + ret = harness.endpoint_request("messages", "post", body) assert ret["status"] == status["OK"] @@ -72,19 +72,19 @@ def erase_contacts_by_name(harness, name): def get_message_by_text(harness, message: str, phone_number: str): - body = {"messageBody": message, "phoneNumber": phone_number} + body = {"category": "message", "messageBody": message, "phoneNumber": phone_number} return harness.endpoint_request("messages", "get", body)["body"] # default sms type is draft def prepare_sms(harness, message: str, phone_number: str, sms_type: int = 1): body = {"smsCommand": "smsAdd", "messageBody": message, "phoneNumber": phone_number, "type": sms_type} - return harness.endpoint_request("developerMode", "put", body) + return harness.endpoint_request("developerMode", "post", body) def prepare_sms_template(harness, message: str, phone_number: str): body = {"template": True, "messageBody": message, "phoneNumber": phone_number} - return harness.endpoint_request("developerMode", "put", body) + return harness.endpoint_request("developerMode", "post", body) def compare_messages(old_messages, new_messages, sms_type: SMSType = SMSType.OUTBOX): diff --git a/test/search_sms.py b/test/search_sms.py index bdad6f11f682b2f10d24718096412f5342ef13f5..22784462da1d307195d00a69092ce61fcc743f89 100644 --- a/test/search_sms.py +++ b/test/search_sms.py @@ -14,7 +14,7 @@ from harness.interface.error import TestError, Error def search_sms(harness, message: str, phone_number: str): @harness.with_phone_unlocked def do_it(connection): - body = {"messageBody": message, "phoneNumber": phone_number} + body = {"category": "message", "messageBody": message, "phoneNumber": phone_number} messages = harness.endpoint_request("messages", "get", body)["body"] print(f'Found {len(messages)} messages') @@ -49,4 +49,3 @@ if __name__ == "__main__": except TestError as err: log.error(err) exit(err.get_error_code()) -