File: sdk_test_user_alerts.cpp

package info (click to toggle)
megacmd 2.5.0-1
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 32,592 kB
  • sloc: cpp: 326,437; ansic: 34,524; python: 4,630; java: 3,965; sh: 2,869; objc: 2,459; makefile: 197; xml: 113
file content (135 lines) | stat: -rw-r--r-- 5,547 bytes parent folder | download | duplicates (2)
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)));
}

}