aboutsummaryrefslogtreecommitdiff
path: root/tests/qxmppuserlocationmanager/tst_qxmppuserlocationmanager.cpp
blob: 485520f361c924fa4247b39922de88cb4ce923a6 (plain) (blame)
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
// SPDX-FileCopyrightText: 2021 Linus Jahn <lnj@kaidan.im>
// SPDX-FileCopyrightText: 2021 Germán Márquez Mejía <mancho@olomono.de>
//
// SPDX-License-Identifier: LGPL-2.1-or-later

#include "QXmppGeolocItem.h"
#include "QXmppPubSubManager.h"
#include "QXmppUserLocationManager.h"

#include "TestClient.h"

using PSManager = QXmppPubSubManager;

#define COMPARE_OPT(ACTUAL, EXPECTED) \
    QVERIFY(ACTUAL.has_value());      \
    QCOMPARE(ACTUAL.value(), EXPECTED);

class tst_QXmppUserLocationManager : public QObject
{
    Q_OBJECT

private:
    Q_SLOT void initTestCase();
    Q_SLOT void testRequest();
    Q_SLOT void testPublish();
    Q_SLOT void testEvents();
};

void tst_QXmppUserLocationManager::initTestCase()
{
    qRegisterMetaType<QXmppGeolocItem>();
}

void tst_QXmppUserLocationManager::testRequest()
{
    TestClient test;
    test.addNewExtension<QXmppPubSubManager>();
    auto *tuneManager = test.addNewExtension<QXmppUserLocationManager>();

    auto future = tuneManager->request("anthony@qxmpp.org");
    test.expect("<iq id=\"qxmpp1\" to=\"anthony@qxmpp.org\" type=\"get\"><pubsub xmlns=\"http://jabber.org/protocol/pubsub\"><items node=\"http://jabber.org/protocol/geoloc\"/></pubsub></iq>");
    test.inject<QString>("<iq id=\"qxmpp1\" from=\"anthony@qxmpp.org\" type=\"result\">"
                         "<pubsub xmlns=\"http://jabber.org/protocol/pubsub\">"
                         "<items node=\"http://jabber.org/protocol/geoloc\">"
                         "<item id='abc3'><geoloc xmlns='http://jabber.org/protocol/geoloc'>"
                         "<accuracy>20</accuracy>"
                         "<country>Italy</country>"
                         "<lat>45.44</lat>"
                         "<locality>Venice</locality>"
                         "<lon>12.33</lon>"
                         "</geoloc></item>"
                         "</items>"
                         "</pubsub></iq>");

    QCoreApplication::processEvents();

    auto item = expectFutureVariant<QXmppGeolocItem>(future);
    QCOMPARE(item.id(), QString("abc3"));
    COMPARE_OPT(item.accuracy(), 20.0);
    COMPARE_OPT(item.longitude(), 12.33);
    COMPARE_OPT(item.latitude(), 45.44);
    QCOMPARE(item.locality(), QStringLiteral("Venice"));
    QCOMPARE(item.country(), QStringLiteral("Italy"));
}

void tst_QXmppUserLocationManager::testPublish()
{
    TestClient test;
    test.configuration().setJid("stpeter@jabber.org");
    test.addNewExtension<QXmppPubSubManager>();
    auto *manager = test.addNewExtension<QXmppUserLocationManager>();

    QXmppGeolocItem item;
    item.setId("abc3");
    item.setAccuracy(20);
    item.setCountry("Italy");
    item.setLatitude(45.44);
    item.setLongitude(12.33);
    item.setLocality("Venice");

    auto future = manager->publish(item);
    test.expect("<iq id='qxmpp1' to='stpeter@jabber.org' type='set'>"
                "<pubsub xmlns='http://jabber.org/protocol/pubsub'>"
                "<publish node='http://jabber.org/protocol/geoloc'>"
                "<item id='abc3'><geoloc xmlns='http://jabber.org/protocol/geoloc'>"
                "<accuracy>20</accuracy>"
                "<country>Italy</country>"
                "<lat>45.44</lat>"
                "<locality>Venice</locality>"
                "<lon>12.33</lon>"
                "</geoloc></item>"
                "</publish>"
                "</pubsub></iq>");
    test.inject<QString>("<iq type='result' from='stpeter@jabber.org' id='qxmpp1'>"
                         "<pubsub xmlns='http://jabber.org/protocol/pubsub'>"
                         "<publish node='http://jabber.org/protocol/tune'>"
                         "<item id='some-id'/>"
                         "</publish></pubsub></iq>");

    QCOMPARE(expectFutureVariant<QString>(future), QString("some-id"));
}

void tst_QXmppUserLocationManager::testEvents()
{
    TestClient test;
    test.configuration().setJid("stpeter@jabber.org");
    auto *psManager = test.addNewExtension<QXmppPubSubManager>();
    auto *manager = test.addNewExtension<QXmppUserLocationManager>();

    QSignalSpy spy(manager, &QXmppUserLocationManager::itemReceived);

    const QString event = "<message from='stpeter@jabber.org' to='maineboy@jabber.org'>"
                          "<event xmlns='http://jabber.org/protocol/pubsub#event'>"
                          "<items node='http://jabber.org/protocol/geoloc'>"
                          "<item id='bffe6584-0f9c-11dc-84ba-001143d5d5db'>"
                          "<geoloc xmlns='http://jabber.org/protocol/geoloc'>"
                          "<accuracy>20</accuracy>"
                          "<country>Italy</country>"
                          "<lat>45.44</lat>"
                          "<locality>Venice</locality>"
                          "<lon>12.33</lon>"
                          "</geoloc></item></items>"
                          "</event></message>";
    psManager->handleStanza(xmlToDom(event));

    QCOMPARE(spy.count(), 1);
    QCOMPARE(spy.constFirst().at(0).toString(), QString("stpeter@jabber.org"));
    QCOMPARE(spy.constFirst().at(1).value<QXmppGeolocItem>().id(), QString("bffe6584-0f9c-11dc-84ba-001143d5d5db"));
    QCOMPARE(spy.constFirst().at(1).value<QXmppGeolocItem>().country(), QString("Italy"));
}

QTEST_MAIN(tst_QXmppUserLocationManager)
#include "tst_qxmppuserlocationmanager.moc"