1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135
|
/**
* @file sdk_test_user_alerts.cpp
* @brief Tests that involve interactions with User alerts.
*/
#include "integration_test_utils.h"
#include "sdk_test_utils.h"
#include "SdkTest_test.h"
namespace
{
static bool ComapreResults(const std::vector<int>& alertTypes, unique_ptr<MegaUserAlertList>&& list)
{
if (alertTypes.size() != static_cast<size_t>(list->size()))
{
return false;
}
for (size_t idx = 0; idx < alertTypes.size(); ++idx)
{
if (alertTypes[idx] != list->get(static_cast<int>(idx))->getType())
{
return false;
}
}
return true;
}
/**
* @brief SdkTest.UserAlertPaymentVsReminder
*/
TEST_F(SdkTest, UserAlertPaymentVsReminder)
{
ASSERT_NO_FATAL_FAILURE(getAccountsForTest(1));
ASSERT_TRUE(WaitFor(
[this]()
{
return megaApi[0]->isLoggedIn() && megaApi[0]->getClient()->useralerts.catchupdone;
},
3000));
// there should be no existing alerts of test account
UserAlerts& userAlerts = megaApi[0]->getClient()->useralerts;
// add a Payment Reminder
auto referenceTime = time(nullptr);
userAlerts.add(
new UserAlert::PaymentReminder(referenceTime, referenceTime + 100, userAlerts.nextId()));
unique_ptr<MegaUserAlertList> megaAlerts{megaApi[0]->getUserAlerts()};
ASSERT_TRUE(ComapreResults(std::vector<int>{MegaUserAlert::TYPE_PAYMENTREMINDER},
std::move(megaAlerts)));
// add a failed Payment done after the reminder - reminder should be kept
userAlerts.add(
new UserAlert::Payment(false, 1, referenceTime, userAlerts.nextId(), name_id::psts_v2));
megaAlerts.reset(megaApi[0]->getUserAlerts());
ASSERT_TRUE(ComapreResults(
std::vector<int>{MegaUserAlert::TYPE_PAYMENTREMINDER, MegaUserAlert::TYPE_PAYMENT_FAILED},
std::move(megaAlerts)));
// add a successful Payment done after the reminder - reminder should be removed
userAlerts.add(
new UserAlert::Payment(true, 1, referenceTime, userAlerts.nextId(), name_id::psts_v2));
megaAlerts.reset(megaApi[0]->getUserAlerts());
ASSERT_TRUE(ComapreResults(
std::vector<int>{MegaUserAlert::TYPE_PAYMENT_FAILED, MegaUserAlert::TYPE_PAYMENT_SUCCEEDED},
std::move(megaAlerts)));
// prepare an empty file to upload
// this will give alerts a chance to be persisted in database
PerApi& target = mApi[0];
target.resetlastEvent();
std::unique_ptr<MegaNode> rootNode(megaApi[0]->getRootNode());
ASSERT_NE(rootNode.get(), nullptr);
const auto newNode = sdk_test::uploadFile(megaApi[0].get(),
sdk_test::LocalTempFile{"alerts", 1},
rootNode.get());
ASSERT_TRUE(newNode) << "Cannot create node in Cloud Drive";
ASSERT_TRUE(WaitFor(
[&target]()
{
return target.lastEventsContain(MegaEvent::EVENT_COMMIT_DB);
},
10000));
// store current session, for reading the same database later
std::unique_ptr<char[]> session(dumpSession(0));
// logout and use session to login, imitate app's restart
ASSERT_NO_FATAL_FAILURE(locallogout(0));
ASSERT_NO_FATAL_FAILURE(resumeSession(session.get(), 0));
// this will make sure that alerts are loaded from database
ASSERT_NO_FATAL_FAILURE(fetchnodes(0, maxTimeout));
// verify the alerts after restart
// the removed reminder won't appear anymore
megaAlerts.reset(megaApi[0]->getUserAlerts());
ASSERT_TRUE(ComapreResults(
std::vector<int>{MegaUserAlert::TYPE_PAYMENT_FAILED, MegaUserAlert::TYPE_PAYMENT_SUCCEEDED},
std::move(megaAlerts)));
// add an old payment reminder - it should be removed
userAlerts.add(new UserAlert::PaymentReminder(referenceTime - 100,
referenceTime + 100,
userAlerts.nextId()));
megaAlerts.reset(megaApi[0]->getUserAlerts());
ASSERT_TRUE(ComapreResults(
std::vector<int>{MegaUserAlert::TYPE_PAYMENT_FAILED, MegaUserAlert::TYPE_PAYMENT_SUCCEEDED},
std::move(megaAlerts)));
// add new reminder later than the successful payment - reminder should be kept
userAlerts.add(new UserAlert::PaymentReminder(referenceTime + 3,
referenceTime + 100,
userAlerts.nextId()));
megaAlerts.reset(megaApi[0]->getUserAlerts());
ASSERT_TRUE(ComapreResults(std::vector<int>{MegaUserAlert::TYPE_PAYMENT_FAILED,
MegaUserAlert::TYPE_PAYMENT_SUCCEEDED,
MegaUserAlert::TYPE_PAYMENTREMINDER},
std::move(megaAlerts)));
// add an old successful Payment done before the reminder - reminder should be kept
userAlerts.add(
new UserAlert::Payment(true, 1, referenceTime + 1, userAlerts.nextId(), name_id::psts_v2));
megaAlerts.reset(megaApi[0]->getUserAlerts());
ASSERT_TRUE(ComapreResults(std::vector<int>{MegaUserAlert::TYPE_PAYMENT_FAILED,
MegaUserAlert::TYPE_PAYMENT_SUCCEEDED,
MegaUserAlert::TYPE_PAYMENTREMINDER,
MegaUserAlert::TYPE_PAYMENT_SUCCEEDED},
std::move(megaAlerts)));
}
}
|