diff --git a/tests/events/test_events.py b/tests/events/test_events.py
new file mode 100644
index 0000000000..11d3d09c96
--- /dev/null
+++ b/tests/events/test_events.py
@@ -0,0 +1,172 @@
+# -*- coding: utf-8 -*-
+from synapse.api.events import SynapseEvent
+
+import unittest
+
+
+class SynapseTemplateCheckTestCase(unittest.TestCase):
+
+ def setUp(self):
+ pass
+
+ def tearDown(self):
+ pass
+
+ def test_top_level_keys(self):
+ template = {
+ "person": {},
+ "friends": ["string"]
+ }
+
+ content = {
+ "person": {"name": "bob"},
+ "friends": ["jill", "mike"]
+ }
+
+ event = MockSynapseEvent(template)
+ self.assertTrue(event.check_json(content, raises=False))
+
+ content = {
+ "person": {"name": "bob"},
+ "friends": ["jill"],
+ "enemies": ["mike"]
+ }
+ event = MockSynapseEvent(template)
+ self.assertTrue(event.check_json(content, raises=False))
+
+ content = {
+ "person": {"name": "bob"},
+ # missing friends
+ "enemies": ["mike", "jill"]
+ }
+ self.assertFalse(event.check_json(content, raises=False))
+
+ def test_lists(self):
+ template = {
+ "person": {},
+ "friends": [{"name":"string"}]
+ }
+
+ content = {
+ "person": {"name": "bob"},
+ "friends": ["jill", "mike"] # should be in objects
+ }
+
+ event = MockSynapseEvent(template)
+ self.assertFalse(event.check_json(content, raises=False))
+
+ content = {
+ "person": {"name": "bob"},
+ "friends": [{"name": "jill"}, {"name": "mike"}]
+ }
+ self.assertTrue(event.check_json(content, raises=False))
+
+ def test_nested_lists(self):
+ template = {
+ "results": {
+ "families": [
+ {
+ "name": "string",
+ "members": [
+ {}
+ ]
+ }
+ ]
+ }
+ }
+
+ content = {
+ "results": {
+ "families": [
+ {
+ "name": "Smith",
+ "members": [
+ "Alice", "Bob" # wrong types
+ ]
+ }
+ ]
+ }
+ }
+
+ event = MockSynapseEvent(template)
+ self.assertFalse(event.check_json(content, raises=False))
+
+ content = {
+ "results": {
+ "families": [
+ {
+ "name": "Smith",
+ "members": [
+ {"name": "Alice"}, {"name": "Bob"}
+ ]
+ }
+ ]
+ }
+ }
+ self.assertTrue(event.check_json(content, raises=False))
+
+ def test_nested_keys(self):
+ template = {
+ "person": {
+ "attributes": {
+ "hair": "string",
+ "eye": "string"
+ },
+ "age": 0,
+ "fav_books": ["string"]
+ }
+ }
+ event = MockSynapseEvent(template)
+
+ content = {
+ "person": {
+ "attributes": {
+ "hair": "brown",
+ "eye": "green",
+ "skin": "purple"
+ },
+ "age": 33,
+ "fav_books": ["lotr", "hobbit"],
+ "fav_music": ["abba", "beatles"]
+ }
+ }
+
+ self.assertTrue(event.check_json(content, raises=False))
+
+ content = {
+ "person": {
+ "attributes": {
+ "hair": "brown"
+ # missing eye
+ },
+ "age": 33,
+ "fav_books": ["lotr", "hobbit"],
+ "fav_music": ["abba", "beatles"]
+ }
+ }
+
+ self.assertFalse(event.check_json(content, raises=False))
+
+ content = {
+ "person": {
+ "attributes": {
+ "hair": "brown",
+ "eye": "green",
+ "skin": "purple"
+ },
+ "age": 33,
+ "fav_books": "nothing", # should be a list
+ }
+ }
+
+ self.assertFalse(event.check_json(content, raises=False))
+
+
+class MockSynapseEvent(SynapseEvent):
+
+ def __init__(self, template):
+ self.template = template
+
+ def get_content_template(self):
+ return self.template
+
|