From f3bacad460b0cc74bdfbf478e147ce267db3f843 Mon Sep 17 00:00:00 2001 From: James Graham Date: Sun, 3 Dec 2023 17:04:21 +0000 Subject: [PATCH] Add more tests to MessageEventModelTest --- .../data/test-messageventmodel-sync.json | 105 ++++++++++++++++++ autotests/messageeventmodeltest.cpp | 79 ++++++++++--- 2 files changed, 167 insertions(+), 17 deletions(-) create mode 100644 autotests/data/test-messageventmodel-sync.json diff --git a/autotests/data/test-messageventmodel-sync.json b/autotests/data/test-messageventmodel-sync.json new file mode 100644 index 000000000..150fe063a --- /dev/null +++ b/autotests/data/test-messageventmodel-sync.json @@ -0,0 +1,105 @@ +{ + "account_data": { + "events": [ + { + "content": { + "tags": { + "u.work": { + "order": 0.9 + } + } + }, + "type": "m.tag" + }, + { + "content": { + "custom_config_key": "custom_config_value" + }, + "type": "org.example.custom.room.config" + } + ] + }, + "ephemeral": { + "events": [ + { + "content": { + "user_ids": [ + "@alice:matrix.org", + "@bob:example.com" + ] + }, + "room_id": "!jEsUZKDJdhlrceRyVU:example.org", + "type": "m.typing" + } + ] + }, + "state": { + "events": [ + { + "content": { + "displayname": "Example", + "membership": "join" + }, + "event_id": "$exampleMember:example.org", + "origin_server_ts": 1432735824653, + "room_id": "!jEsUZKDJdhlrceRyVU:example.org", + "sender": "@example:example.org", + "state_key": "@example:example.org", + "type": "m.room.member", + "unsigned": { + "age": 1234 + } + } + ] + }, + "summary": { + "m.heroes": [ + "@example:example.org" + ], + "m.invited_member_count": 0, + "m.joined_member_count": 2 + }, + "timeline": { + "events": [ + { + "content": { + "body": "This is an example\ntext message", + "format": "org.matrix.custom.html", + "formatted_body": "This is an example
text message
", + "msgtype": "m.text" + }, + "event_id": "$153456789:example.org", + "origin_server_ts": 1, + "room_id": "!jEsUZKDJdhlrceRyVU:example.org", + "sender": "@example:example.org", + "type": "m.room.message", + "unsigned": { + "age": 1232 + } + }, + { + "content": { + "displayname": "Example Changed", + "membership": "join" + }, + "event_id": "$exampleMemberChnage:example.org", + "origin_server_ts": 2, + "room_id": "!jEsUZKDJdhlrceRyVU:example.org", + "sender": "@example:example.org", + "state_key": "@example:example.org", + "type": "m.room.member", + "unsigned": { + "replaces_state": "$exampleMember:example.org", + "prev_content": { + "displayname": "Example", + "membership": "join" + }, + "prev_sender": "@example:example.org", + "age": 1234 + } + } + ], + "limited": true, + "prev_batch": "t34-23535_0_0" + } +} diff --git a/autotests/messageeventmodeltest.cpp b/autotests/messageeventmodeltest.cpp index 80cd2bab1..c2ece6e22 100644 --- a/autotests/messageeventmodeltest.cpp +++ b/autotests/messageeventmodeltest.cpp @@ -34,14 +34,17 @@ private: Connection *connection = nullptr; MessageEventModel *model = nullptr; - TestRoom *setupTestRoom(const QString &syncFileName); + TestRoom *setupTestRoom(const QString &roomName, const QString &syncFileName = {}); + void syncNewEvents(TestRoom *room, const QString &syncFileName); private Q_SLOTS: void initTestCase(); void init(); - void switchRoom(); + void switchEmptyRoom(); + void switchSyncedRoom(); void simpleTimeline(); + void syncNewEvents(); void idToRow(); void cleanup(); @@ -58,8 +61,8 @@ void MessageEventModelTest::init() model = new MessageEventModel; } -// Make sure that basic rooms can be switched without crashing. -void MessageEventModelTest::switchRoom() +// Make sure that basic empty rooms can be switched without crashing. +void MessageEventModelTest::switchEmptyRoom() { TestRoom *firstRoom = new TestRoom(connection, QStringLiteral("#firstRoom:kde.org"), JoinState::Join); TestRoom *secondRoom = new TestRoom(connection, QStringLiteral("#secondRoom:kde.org"), JoinState::Join); @@ -78,26 +81,65 @@ void MessageEventModelTest::switchRoom() QCOMPARE(model->room(), nullptr); } +// Make sure that rooms with some events can be switched without crashing +void MessageEventModelTest::switchSyncedRoom() +{ + auto firstRoom = setupTestRoom(QStringLiteral("#firstRoom:kde.org"), QLatin1String("test-messageventmodel-sync.json")); + auto secondRoom = setupTestRoom(QStringLiteral("#secondRoom:kde.org"), QLatin1String("test-messageventmodel-sync.json")); + + QSignalSpy spy(model, SIGNAL(roomChanged())); + + QCOMPARE(model->room(), nullptr); + model->setRoom(firstRoom); + QCOMPARE(spy.count(), 1); + QCOMPARE(model->room()->id(), QStringLiteral("#firstRoom:kde.org")); + model->setRoom(secondRoom); + QCOMPARE(spy.count(), 2); + QCOMPARE(model->room()->id(), QStringLiteral("#secondRoom:kde.org")); + model->setRoom(nullptr); + QCOMPARE(spy.count(), 3); + QCOMPARE(model->room(), nullptr); +} + void MessageEventModelTest::simpleTimeline() { - auto room = setupTestRoom(QLatin1String("test-min-sync.json")); + auto room = setupTestRoom(QStringLiteral("#myroom:kde.org"), QLatin1String("test-messageventmodel-sync.json")); model->setRoom(room); - QCOMPARE(model->rowCount(), 1); - QCOMPARE(model->data(model->index(0)), QStringLiteral("This is an example
text message
")); - QCOMPARE(model->data(model->index(0), MessageEventModel::DelegateTypeRole), DelegateType::Message); - QCOMPARE(model->data(model->index(0), MessageEventModel::PlainText), QStringLiteral("This is an example\ntext message")); - QCOMPARE(model->data(model->index(0), MessageEventModel::EventIdRole), QStringLiteral("$153456789:example.org")); + QCOMPARE(model->rowCount(), 2); + + QCOMPARE(model->data(model->index(0), MessageEventModel::DelegateTypeRole), DelegateType::State); + QCOMPARE(model->data(model->index(0)), QStringLiteral("changed their display name to Example Changed")); + + QCOMPARE(model->data(model->index(1)), QStringLiteral("This is an example
text message
")); + QCOMPARE(model->data(model->index(1), MessageEventModel::DelegateTypeRole), DelegateType::Message); + QCOMPARE(model->data(model->index(1), MessageEventModel::PlainText), QStringLiteral("This is an example\ntext message")); + QCOMPARE(model->data(model->index(1), MessageEventModel::EventIdRole), QStringLiteral("$153456789:example.org")); QTest::ignoreMessage(QtWarningMsg, "Index QModelIndex(-1,-1,0x0,QObject(0x0)) is not valid (expected valid)"); QCOMPARE(model->data(model->index(-1)), QVariant()); QTest::ignoreMessage(QtWarningMsg, "Index QModelIndex(-1,-1,0x0,QObject(0x0)) is not valid (expected valid)"); - QCOMPARE(model->data(model->index(1)), QVariant()); + QCOMPARE(model->data(model->index(model->rowCount())), QVariant()); +} + +// Sync some events into the MessageEventModel's current room and don't crash. +void MessageEventModelTest::syncNewEvents() +{ + auto room = setupTestRoom(QStringLiteral("#myroom:kde.org")); + QSignalSpy spy(room, SIGNAL(aboutToAddNewMessages(Quotient::RoomEventsRange))); + + model->setRoom(room); + QCOMPARE(model->rowCount(), 0); + + syncNewEvents(room, QLatin1String("test-messageventmodel-sync.json")); + + QCOMPARE(model->rowCount(), 2); + QCOMPARE(spy.count(), 1); } void MessageEventModelTest::idToRow() { - auto room = setupTestRoom(QLatin1String("test-min-sync.json")); + auto room = setupTestRoom(QStringLiteral("#myroom:kde.org"), QLatin1String("test-min-sync.json")); model->setRoom(room); QCOMPARE(model->eventIdToRow(QStringLiteral("$153456789:example.org")), 0); @@ -110,10 +152,15 @@ void MessageEventModelTest::cleanup() QCOMPARE(model, nullptr); } -TestRoom *MessageEventModelTest::setupTestRoom(const QString &syncFileName) +TestRoom *MessageEventModelTest::setupTestRoom(const QString &roomName, const QString &syncFileName) { - auto room = new TestRoom(connection, QStringLiteral("#myroom:kde.org"), JoinState::Join); + auto room = new TestRoom(connection, roomName, JoinState::Join); + syncNewEvents(room, syncFileName); + return room; +} +void MessageEventModelTest::syncNewEvents(TestRoom *room, const QString &syncFileName) +{ if (!syncFileName.isEmpty()) { QFile testSyncFile; testSyncFile.setFileName(QLatin1String(DATA_DIR) + u'/' + syncFileName); @@ -122,9 +169,7 @@ TestRoom *MessageEventModelTest::setupTestRoom(const QString &syncFileName) SyncRoomData roomData(QStringLiteral("@bob:kde.org"), JoinState::Join, testSyncJson.object()); room->update(std::move(roomData)); } - - return room; } -QTEST_GUILESS_MAIN(MessageEventModelTest) +QTEST_MAIN(MessageEventModelTest) #include "messageeventmodeltest.moc"