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"