summary refs log tree commit diff
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--include/events/StateEvent.h67
-rw-r--r--tests/events.cc45
2 files changed, 112 insertions, 0 deletions
diff --git a/include/events/StateEvent.h b/include/events/StateEvent.h
new file mode 100644
index 00000000..d82d53c4
--- /dev/null
+++ b/include/events/StateEvent.h
@@ -0,0 +1,67 @@
+/*
+ * nheko Copyright (C) 2017  Konstantinos Sideris <siderisk@auth.gr>
+ *
+ * This program is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program.  If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#ifndef MATRIX_STATE_EVENT_H
+#define MATRIX_STATE_EVENT_H
+
+#include <QJsonValue>
+
+#include "RoomEvent.h"
+
+template <class Content>
+class StateEvent : public RoomEvent<Content>
+{
+public:
+	inline QString stateKey() const;
+	inline Content previousContent() const;
+
+	void deserialize(const QJsonValue &data);
+
+private:
+	QString state_key_;
+	Content prev_content_;
+};
+
+template <class Content>
+inline QString StateEvent<Content>::stateKey() const
+{
+	return state_key_;
+}
+
+template <class Content>
+inline Content StateEvent<Content>::previousContent() const
+{
+	return prev_content_;
+}
+
+template <class Content>
+void StateEvent<Content>::deserialize(const QJsonValue &data)
+{
+	RoomEvent<Content>::deserialize(data);
+
+	auto object = data.toObject();
+
+	if (!object.contains("state_key"))
+		throw DeserializationException("state_key key is missing");
+
+	state_key_ = object.value("state_key").toString();
+
+	if (object.contains("prev_content"))
+		prev_content_.deserialize(object.value("prev_content"));
+}
+
+#endif  // MATRIX_STATE_EVENT_H
diff --git a/tests/events.cc b/tests/events.cc
index a6a3c30c..cb6abd88 100644
--- a/tests/events.cc
+++ b/tests/events.cc
@@ -3,6 +3,7 @@
 
 #include "Event.h"
 #include "RoomEvent.h"
+#include "StateEvent.h"
 
 #include "AliasesEventContent.h"
 #include "AvatarEventContent.h"
@@ -127,6 +128,50 @@ TEST(RoomEvent, DeserializationException)
 	}
 }
 
+TEST(StateEvent, Deserialization)
+{
+	auto data = QJsonObject{
+		{"content", QJsonObject{{"name", "Name"}}},
+		{"event_id", "$asdfafdf8af:matrix.org"},
+		{"state_key", "some_state_key"},
+		{"prev_content", QJsonObject{{"name", "Previous Name"}}},
+		{"room_id", "!aasdfaeae23r9:matrix.org"},
+		{"sender", "@alice:matrix.org"},
+		{"origin_server_ts", 1323238293289323LL},
+		{"type", "m.room.name"}};
+
+	StateEvent<NameEventContent> event;
+	event.deserialize(data);
+
+	EXPECT_EQ(event.eventId(), "$asdfafdf8af:matrix.org");
+	EXPECT_EQ(event.roomId(), "!aasdfaeae23r9:matrix.org");
+	EXPECT_EQ(event.sender(), "@alice:matrix.org");
+	EXPECT_EQ(event.timestamp(), 1323238293289323);
+	EXPECT_EQ(event.content().name(), "Name");
+	EXPECT_EQ(event.stateKey(), "some_state_key");
+	EXPECT_EQ(event.previousContent().name(), "Previous Name");
+}
+
+TEST(StateEvent, DeserializationException)
+{
+	auto data = QJsonObject{
+		{"content", QJsonObject{{"name", "Name"}}},
+		{"event_id", "$asdfafdf8af:matrix.org"},
+		{"prev_content", QJsonObject{{"name", "Previous Name"}}},
+		{"room_id", "!aasdfaeae23r9:matrix.org"},
+		{"sender", "@alice:matrix.org"},
+		{"origin_server_ts", 1323238293289323LL},
+		{"type", "m.room.name"}};
+
+	StateEvent<NameEventContent> event;
+
+	try {
+		event.deserialize(data);
+	} catch (const DeserializationException &e) {
+		ASSERT_STREQ("state_key key is missing", e.what());
+	}
+}
+
 TEST(EventType, Mapping)
 {
 	EXPECT_EQ(extractEventType(QJsonObject{{"type", "m.room.aliases"}}), EventType::RoomAliases);