Skip to content
This repository was archived by the owner on Mar 20, 2025. It is now read-only.

Commit 556e8ce

Browse files
committed
Add test for pubsub item
1 parent 3e99aba commit 556e8ce

File tree

5 files changed

+86
-8
lines changed

5 files changed

+86
-8
lines changed

src/base/QXmppMessage.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -257,9 +257,9 @@ class QXMPP_EXPORT QXmppMessage : public QXmppStanza
257257
const QVector<QXmppFileShare> &sharedFiles() const;
258258
void setSharedFiles(const QVector<QXmppFileShare> &sharedFiles);
259259

260-
// XEP-0449: Stickers
261-
const std::optional<QString> &stickerPackId() const;
262-
void setStickerPackId(const std::optional<QString> &stickerPackId);
260+
// XEP-0449: Stickers
261+
const std::optional<QString> &stickerPackId() const;
262+
void setStickerPackId(const std::optional<QString> &stickerPackId);
263263

264264
/// \cond
265265
#ifdef BUILD_OMEMO

src/base/QXmppStickerPackItem.cpp

Lines changed: 31 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
#include "QXmppConstants_p.h"
88
#include "QXmppEncryptedFileSource.h"
99
#include "QXmppFileMetadata.h"
10+
#include "qdebug.h"
1011

1112
#include <QXmlStreamWriter>
1213

@@ -16,13 +17,16 @@ class QXmppStickerItemPrivate : public QSharedData
1617
QXmppFileMetadata metadata;
1718
QVector<QXmppHttpFileSource> httpSources;
1819
QVector<QXmppEncryptedFileSource> encryptedSources;
20+
std::optional<QString> suggest;
1921
};
2022

2123
QXmppStickerItem::QXmppStickerItem()
2224
: d(new QXmppStickerItemPrivate())
2325
{
2426
}
2527

28+
QXMPP_PRIVATE_DEFINE_RULE_OF_SIX(QXmppStickerItem)
29+
2630
///
2731
/// \class QXmppStickerItem
2832
///
@@ -77,20 +81,34 @@ void QXmppStickerItem::setEncryptedSources(const QVector<QXmppEncryptedFileSourc
7781
d->encryptedSources = encryptedSources;
7882
}
7983

80-
QXMPP_PRIVATE_DEFINE_RULE_OF_SIX(QXmppStickerItem)
84+
const std::optional<QString> &QXmppStickerItem::suggest() const
85+
{
86+
return d->suggest;
87+
}
88+
89+
void QXmppStickerItem::setSuggest(const std::optional<QString> &suggest)
90+
{
91+
d->suggest = suggest;
92+
}
8193

8294
/// \cond
8395
void QXmppStickerItem::toXml(QXmlStreamWriter *writer) const
8496
{
8597
writer->writeStartElement("item");
8698
d->metadata.toXml(writer);
99+
writer->writeStartElement("sources");
100+
writer->writeDefaultNamespace(ns_sfs);
87101
for (const auto &httpSource : d->httpSources) {
88102
httpSource.toXml(writer);
89103
}
90104
for (const auto &encryptedSource : d->encryptedSources) {
91105
encryptedSource.toXml(writer);
92106
}
93107
writer->writeEndElement();
108+
if (d->suggest) {
109+
writer->writeTextElement("suggest", *d->suggest);
110+
}
111+
writer->writeEndElement();
94112
}
95113

96114
bool QXmppStickerItem::parse(const QDomElement &element)
@@ -115,6 +133,10 @@ bool QXmppStickerItem::parse(const QDomElement &element)
115133
}
116134
}
117135

136+
if (auto el = element.firstChildElement("suggest"); !el.isNull()) {
137+
d->suggest = el.text();
138+
}
139+
118140
return true;
119141
}
120142
/// \endcond
@@ -125,13 +147,16 @@ class QXmppStickerPackItemPrivate : public QSharedData
125147
QString name;
126148
QString summary;
127149
QVector<QXmppStickerItem> items;
150+
QXmppHash hash;
128151
};
129152

130153
QXmppStickerPackItem::QXmppStickerPackItem()
131154
: d(new QXmppStickerPackItemPrivate())
132155
{
133156
}
134157

158+
QXMPP_PRIVATE_DEFINE_RULE_OF_SIX(QXmppStickerPackItem)
159+
135160
///
136161
/// \class QXmppStickerPackitem
137162
///
@@ -186,21 +211,21 @@ void QXmppStickerPackItem::setItems(const QVector<QXmppStickerItem> &items)
186211
d->items = items;
187212
}
188213

189-
QXMPP_PRIVATE_DEFINE_RULE_OF_SIX(QXmppStickerPackItem)
190-
191214
void QXmppStickerPackItem::parsePayload(const QDomElement &payloadElement)
192215
{
193216
d->name = payloadElement.firstChildElement("name").text();
194217
d->summary = payloadElement.firstChildElement("summary").text();
195218

196219
for (auto firstChild = payloadElement.firstChildElement("item");
197220
!firstChild.isNull();
198-
firstChild.nextSibling()) {
221+
firstChild = firstChild.nextSiblingElement("item")) {
199222
QXmppStickerItem stickerItem;
200-
stickerItem.parse(payloadElement);
223+
stickerItem.parse(firstChild);
201224

202225
d->items.push_back(std::move(stickerItem));
203226
}
227+
228+
d->hash.parse(payloadElement.firstChildElement("hash"));
204229
}
205230

206231
void QXmppStickerPackItem::serializePayload(QXmlStreamWriter *writer) const
@@ -215,5 +240,6 @@ void QXmppStickerPackItem::serializePayload(QXmlStreamWriter *writer) const
215240
item.toXml(writer);
216241
}
217242

243+
d->hash.toXml(writer);
218244
writer->writeEndElement();
219245
}

src/base/QXmppStickerPackItem.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@
99

1010
#include <QVector>
1111

12+
#include <optional>
13+
1214
class QXmppFileMetadata;
1315
class QXmppHttpFileSource;
1416
class QXmppEncryptedFileSource;
@@ -31,6 +33,9 @@ class QXMPP_EXPORT QXmppStickerItem
3133
const QVector<QXmppEncryptedFileSource> &encryptedSources() const;
3234
void setEncryptedSources(const QVector<QXmppEncryptedFileSource> &encryptedSources);
3335

36+
const std::optional<QString> &suggest() const;
37+
void setSuggest(const std::optional<QString> &suggest);
38+
3439
/// \cond
3540
bool parse(const QDomElement &element);
3641
void toXml(QXmlStreamWriter *writer) const;

tests/qxmppmessage/tst_qxmppmessage.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1283,6 +1283,7 @@ void tst_QXmppMessage::testStickers()
12831283
parsePacket(message1, xml);
12841284
QVERIFY(!message1.sharedFiles().empty());
12851285
QVERIFY(message1.stickerPackId().has_value());
1286+
Q_ASSERT(message1.stickerPackId().value() == QStringLiteral("EpRv28DHHzFrE4zd"));
12861287
serializePacket(message1, xml);
12871288
}
12881289

tests/qxmpppubsub/tst_qxmpppubsub.cpp

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

55
#include "QXmppPubSubAffiliation.h"
66
#include "QXmppPubSubSubscription.h"
7+
#include "QXmppStickerPackItem.h"
78

89
#include "pubsubutil.h"
910
#include "util.h"
@@ -55,6 +56,7 @@ class tst_QXmppPubSub : public QObject
5556
Q_SLOT void testIsItem_data();
5657
Q_SLOT void testIsItem();
5758
Q_SLOT void testTestItem();
59+
Q_SLOT void testStickerPackItem();
5860
};
5961

6062
void tst_QXmppPubSub::testAffiliation_data()
@@ -280,5 +282,49 @@ void tst_QXmppPubSub::testTestItem()
280282
QVERIFY(!TestItem::isItem(xmlToDom(invalidXml)));
281283
}
282284

285+
void tst_QXmppPubSub::testStickerPackItem()
286+
{
287+
QByteArray xml(
288+
"<item id='EpRv28DHHzFrE4zd+xaNpVb4'>"
289+
"<pack xmlns='urn:xmpp:stickers:0'>"
290+
"<name>Marsey the Cat</name>"
291+
"<summary>Be cute or be cynical, this little kitten works both ways.</summary>"
292+
"<item>"
293+
"<file xmlns='urn:xmpp:file:metadata:0'>"
294+
"<desc>👍</desc>"
295+
"<hash xmlns='urn:xmpp:hashes:2' algo='sha-256'>0AdP8lJOWJrugSKOIAqfEKqFatIpG5JBCjjxY253ojQ=</hash>"
296+
"<height>512</height>"
297+
"<media-type>image/png</media-type>"
298+
"<size>71045</size>"
299+
"<width>512</width>"
300+
"</file>"
301+
"<sources xmlns='urn:xmpp:sfs:0'>"
302+
"<url-data xmlns='http://jabber.org/protocol/url-data' target='https://download.montague.lit/51078299-d071-46e1-b6d3-3de4a8ab67d6/sticker_marsey_thumbs_up.png'/>"
303+
"</sources>"
304+
"<suggest>+1</suggest>"
305+
"</item>"
306+
"<item>"
307+
"<file xmlns='urn:xmpp:file:metadata:0'>"
308+
"<desc>😘</desc>"
309+
"<hash xmlns='urn:xmpp:hashes:2' algo='sha-256'>gw+6xdCgOcvCYSKuQNrXH33lV9NMzuDf/s0huByCDsY=</hash>"
310+
"<height>512</height>"
311+
"<media-type>image/png</media-type>"
312+
"<size>67016</size>"
313+
"<width>512</width>"
314+
"</file>"
315+
"<sources xmlns='urn:xmpp:sfs:0'>"
316+
"<url-data xmlns='http://jabber.org/protocol/url-data' target='https://download.montague.lit/51078299-d071-46e1-b6d3-3de4a8ab67d6/sticker_marsey_kiss.png'/>"
317+
"</sources>"
318+
"</item>"
319+
"<hash xmlns='urn:xmpp:hashes:2' algo='sha-256'>EpRv28DHHzFrE4zd+xaNpVb4jbu4s74XtioExNjQzZ0=</hash>"
320+
"</pack>"
321+
"</item>");
322+
323+
QXmppStickerPackItem item;
324+
parsePacket(item, xml);
325+
QCOMPARE(item.items().size(), 2);
326+
serializePacket(item, xml);
327+
}
328+
283329
QTEST_MAIN(tst_QXmppPubSub)
284330
#include "tst_qxmpppubsub.moc"

0 commit comments

Comments
 (0)