From f641de064daee36843d2232931df1a23bbfbb8cb Mon Sep 17 00:00:00 2001
From: Jonathan Weth <git@jonathanweth.de>
Date: Thu, 20 Jan 2022 17:27:45 +0100
Subject: [PATCH] Write more tests and fix child space sync

---
 aleksis/apps/matrix/models.py            |  4 +-
 aleksis/apps/matrix/tests/test_matrix.py | 77 ++++++++++++++++++++++++
 2 files changed, 79 insertions(+), 2 deletions(-)

diff --git a/aleksis/apps/matrix/models.py b/aleksis/apps/matrix/models.py
index 6b5858f..9270c61 100644
--- a/aleksis/apps/matrix/models.py
+++ b/aleksis/apps/matrix/models.py
@@ -315,11 +315,11 @@ class MatrixSpace(MatrixRoom):
     def ensure_children(self):
         """Ensure that all child rooms/spaces exist."""
         for group in self.group.child_groups.all().prefetch_related("child_groups"):
+            group.use_in_matrix(sync=True)
             if group.child_groups.all():
                 space = MatrixSpace.from_group(group)
                 space.ensure_children()
-            else:
-                group.use_in_matrix(sync=True)
+                space.sync_children()
 
     def sync(self):
         """Sync this space."""
diff --git a/aleksis/apps/matrix/tests/test_matrix.py b/aleksis/apps/matrix/tests/test_matrix.py
index 6015b79..7c10984 100644
--- a/aleksis/apps/matrix/tests/test_matrix.py
+++ b/aleksis/apps/matrix/tests/test_matrix.py
@@ -326,3 +326,80 @@ def test_space_creation(matrix_bot_user):
     assert len(rooms) == 4
 
     assert set(interesting_events) == set(rooms)
+
+
+def test_space_creation_with_child_spaces(matrix_bot_user):
+    parent_group = Group.objects.create(name="Test Group")
+    child_1 = Group.objects.create(name="Test Group 1")
+    child_1_child_1 = Group.objects.create(name="Test Group 1 1")
+    child_1_child_2 = Group.objects.create(name="Test Group 1 2")
+    child_1.child_groups.set([child_1_child_1, child_1_child_2])
+    child_2 = Group.objects.create(name="Test Group 2")
+    child_3 = Group.objects.create(name="Test Group 3")
+    parent_group.child_groups.set([child_1, child_2, child_3])
+
+    parent_group.use_in_matrix(sync=True)
+
+    get_site_preferences()["matrix__use_spaces"] = True
+
+    space = MatrixSpace.from_group(parent_group)
+
+    space.ensure_children()
+
+    rooms = MatrixRoom.get_queryset().values_list("group_id", flat=True)
+    assert child_1.pk in rooms
+    assert child_2.pk in rooms
+    assert child_3.pk in rooms
+    assert child_1_child_1.pk in rooms
+    assert child_1_child_2.pk in rooms
+
+    spaces = MatrixSpace.get_queryset().values_list("group_id", flat=True)
+    assert parent_group.pk in spaces
+    assert child_1.pk in spaces
+
+    space.sync_children()
+
+    r = do_matrix_request("GET", f"rooms/{space.room_id}/state")
+    interesting_events = [x["state_key"] for x in r if x["type"] == "m.space.child"]
+
+    assert len(interesting_events) == 4
+
+    rooms = list(
+        MatrixRoom.get_queryset()
+        .filter(group__in=[parent_group, child_2, child_3])
+        .values_list("room_id", flat=True)
+    ) + list(MatrixSpace.objects.filter(group=child_1).values_list("room_id", flat=True))
+
+    assert len(rooms) == 4
+
+    assert set(interesting_events) == set(rooms)
+
+    space = MatrixSpace.objects.get(group=child_1)
+
+    r = do_matrix_request("GET", f"rooms/{space.room_id}/state")
+    interesting_events = [x["state_key"] for x in r if x["type"] == "m.space.child"]
+
+    assert len(interesting_events) == 3
+
+    rooms = list(
+        MatrixRoom.get_queryset()
+        .filter(group__in=[child_1, child_1_child_1, child_1_child_2])
+        .values_list("room_id", flat=True)
+    )
+
+    assert len(rooms) == 3
+
+    assert set(interesting_events) == set(rooms)
+
+
+def test_alias_room_id_using_group(matrix_bot_user):
+    g = Group.objects.create(name="Test Room")
+    room = MatrixRoom.from_group(g)
+    child_1 = Group.objects.create(name="Test Group 1")
+    g.child_groups.set([child_1])
+    room.sync()
+
+    assert MatrixSpace.objects.get_queryset().count() == 1
+
+    assert g.matrix_room_id == room.room_id
+    assert g.matrix_alias == room.alias
-- 
GitLab