// SPDX-FileCopyrightText: 2023 James Graham // SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL #include #include #include #include #include #include #include #include #include #include "accountmanager.h" #include "blockcache.h" #include "chatbarcache.h" #include "neochatroom.h" #include "server.h" #include "testutils.h" using namespace Quotient; class ChatBarCacheTest : public QObject { Q_OBJECT private: Connection *connection = nullptr; NeoChatRoom *room = nullptr; Server server; QString eventId; private Q_SLOTS: void initTestCase(); void empty(); void reply(); void replyMissingUser(); void edit(); void attachment(); }; void ChatBarCacheTest::initTestCase() { Connection::setRoomType(); server.start(); KLocalizedString::setApplicationDomain(QByteArrayLiteral("neochat")); auto accountManager = new AccountManager(true, this); QSignalSpy spy(accountManager, &AccountManager::connectionAdded); connection = dynamic_cast(accountManager->accounts()->front()); const auto roomId = server.createRoom(u"@user:localhost:1234"_s); eventId = server.sendEvent(roomId, u"m.room.message"_s, QJsonObject{ {u"body"_s, u"foo"_s}, {u"msgtype"_s, u"m.text"_s}, }); QSignalSpy syncSpy(connection, &Connection::syncDone); // We need to wait for two syncs, as the next one won't have the changes yet QVERIFY(syncSpy.wait()); QVERIFY(syncSpy.wait()); room = dynamic_cast(connection->room(roomId)); QVERIFY(room); server.joinUser(room->id(), u"@foo:server.com"_s); QVERIFY(syncSpy.wait()); QVERIFY(syncSpy.wait()); } void ChatBarCacheTest::empty() { QScopedPointer chatBarCache(new ChatBarCache(room)); QCOMPARE(chatBarCache->cache().toString(), QString()); QCOMPARE(chatBarCache->isReplying(), false); QCOMPARE(chatBarCache->replyId(), QString()); QCOMPARE(chatBarCache->isEditing(), false); QCOMPARE(chatBarCache->editId(), QString()); QCOMPARE(chatBarCache->relationAuthor(), room->member(QString())); QCOMPARE(chatBarCache->relationMessage(), QString()); QCOMPARE(chatBarCache->attachmentPath(), QString()); } void ChatBarCacheTest::reply() { QScopedPointer chatBarCache(new ChatBarCache(room)); chatBarCache->cache() += Block::CacheItem{.type = MessageComponentType::Text, .content = QTextDocumentFragment::fromMarkdown(u"some text"_s)}; chatBarCache->setAttachmentPath(u"some/path"_s); chatBarCache->setReplyId(eventId); QCOMPARE(chatBarCache->cache().toString(), u"some text"_s); QCOMPARE(chatBarCache->isReplying(), true); QCOMPARE(chatBarCache->replyId(), eventId); QCOMPARE(chatBarCache->isEditing(), false); QCOMPARE(chatBarCache->editId(), QString()); QCOMPARE(chatBarCache->relationAuthor(), room->member(u"@foo:server.com"_s)); QCOMPARE(chatBarCache->relationMessage(), u"foo"_s); QCOMPARE(chatBarCache->attachmentPath(), QString()); QCOMPARE(chatBarCache->relationAuthorIsPresent(), true); } void ChatBarCacheTest::replyMissingUser() { QScopedPointer chatBarCache(new ChatBarCache(room)); chatBarCache->cache() += Block::CacheItem{.type = MessageComponentType::Text, .content = QTextDocumentFragment::fromMarkdown(u"some text"_s)}; chatBarCache->setAttachmentPath(u"some/path"_s); chatBarCache->setReplyId(eventId); QCOMPARE(chatBarCache->cache().toString(), u"some text"_s); QCOMPARE(chatBarCache->isReplying(), true); QCOMPARE(chatBarCache->replyId(), eventId); QCOMPARE(chatBarCache->isEditing(), false); QCOMPARE(chatBarCache->editId(), QString()); QCOMPARE(chatBarCache->relationAuthor(), room->member(u"@foo:server.com"_s)); QCOMPARE(chatBarCache->relationMessage(), u"foo"_s); QCOMPARE(chatBarCache->attachmentPath(), QString()); QCOMPARE(chatBarCache->relationAuthorIsPresent(), true); QSignalSpy relationAuthorIsPresentSpy(chatBarCache.get(), &ChatBarCache::relationAuthorIsPresentChanged); // sync again, which will simulate the reply user leaving the room QSignalSpy syncSpy(connection, &Connection::syncDone); server.sendStateEvent(room->id(), u"m.room.member"_s, u"@foo:server.com"_s, {{u"membership"_s, u"leave"_s}}); QVERIFY(syncSpy.wait()); QVERIFY(syncSpy.wait()); QTRY_COMPARE(relationAuthorIsPresentSpy.count(), 1); QCOMPARE(chatBarCache->relationAuthorIsPresent(), false); } void ChatBarCacheTest::edit() { QScopedPointer chatBarCache(new ChatBarCache(room)); chatBarCache->cache() += Block::CacheItem{.type = MessageComponentType::Text, .content = QTextDocumentFragment::fromMarkdown(u"some text"_s)}; chatBarCache->setAttachmentPath(u"some/path"_s); connect(chatBarCache.get(), &ChatBarCache::relationIdChanged, this, [this](const QString &oldEventId, const QString &newEventId) { QCOMPARE(oldEventId, QString()); QCOMPARE(newEventId, eventId); }); chatBarCache->setEditId(eventId); QCOMPARE(chatBarCache->cache().toString(), u"some text"_s); QCOMPARE(chatBarCache->isReplying(), false); QCOMPARE(chatBarCache->replyId(), QString()); QCOMPARE(chatBarCache->isEditing(), true); QCOMPARE(chatBarCache->editId(), eventId); QCOMPARE(chatBarCache->relationAuthor(), room->member(u"@foo:server.com"_s)); QCOMPARE(chatBarCache->relationMessage(), u"foo"_s); QCOMPARE(chatBarCache->attachmentPath(), QString()); } void ChatBarCacheTest::attachment() { QScopedPointer chatBarCache(new ChatBarCache(room)); chatBarCache->cache() += Block::CacheItem{.type = MessageComponentType::Text, .content = QTextDocumentFragment::fromMarkdown(u"some text"_s)}; chatBarCache->setEditId(eventId); chatBarCache->setAttachmentPath(u"some/path"_s); QCOMPARE(chatBarCache->cache().toString(), u"some text"_s); QCOMPARE(chatBarCache->isReplying(), false); QCOMPARE(chatBarCache->replyId(), QString()); QCOMPARE(chatBarCache->isEditing(), false); QCOMPARE(chatBarCache->editId(), QString()); QCOMPARE(chatBarCache->relationAuthor(), room->member(QString())); QCOMPARE(chatBarCache->relationMessage(), QString()); QCOMPARE(chatBarCache->attachmentPath(), u"some/path"_s); } QTEST_MAIN(ChatBarCacheTest) #include "chatbarcachetest.moc"