|
@@ -40,9 +40,23 @@ class RoomBackgroundUpdateStoreTestCase(HomeserverTestCase):
|
|
|
self.token = self.login("foo", "pass")
|
|
|
|
|
|
def _generate_room(self) -> str:
|
|
|
- room_id = self.helper.create_room_as(self.user_id, tok=self.token)
|
|
|
+ """Create a room and return the room ID."""
|
|
|
+ return self.helper.create_room_as(self.user_id, tok=self.token)
|
|
|
|
|
|
- return room_id
|
|
|
+ def run_background_updates(self, update_name: str) -> None:
|
|
|
+ """Insert and run the background update."""
|
|
|
+ self.get_success(
|
|
|
+ self.store.db_pool.simple_insert(
|
|
|
+ "background_updates",
|
|
|
+ {"update_name": update_name, "progress_json": "{}"},
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ # ... and tell the DataStore that it hasn't finished all updates yet
|
|
|
+ self.store.db_pool.updates._all_done = False
|
|
|
+
|
|
|
+ # Now let's actually drive the updates to completion
|
|
|
+ self.wait_for_background_updates()
|
|
|
|
|
|
def test_background_populate_rooms_creator_column(self) -> None:
|
|
|
"""Test that the background update to populate the rooms creator column
|
|
@@ -71,22 +85,7 @@ class RoomBackgroundUpdateStoreTestCase(HomeserverTestCase):
|
|
|
)
|
|
|
self.assertEqual(room_creator_before, None)
|
|
|
|
|
|
- # Insert and run the background update.
|
|
|
- self.get_success(
|
|
|
- self.store.db_pool.simple_insert(
|
|
|
- "background_updates",
|
|
|
- {
|
|
|
- "update_name": _BackgroundUpdates.POPULATE_ROOMS_CREATOR_COLUMN,
|
|
|
- "progress_json": "{}",
|
|
|
- },
|
|
|
- )
|
|
|
- )
|
|
|
-
|
|
|
- # ... and tell the DataStore that it hasn't finished all updates yet
|
|
|
- self.store.db_pool.updates._all_done = False
|
|
|
-
|
|
|
- # Now let's actually drive the updates to completion
|
|
|
- self.wait_for_background_updates()
|
|
|
+ self.run_background_updates(_BackgroundUpdates.POPULATE_ROOMS_CREATOR_COLUMN)
|
|
|
|
|
|
# Make sure the background update filled in the room creator
|
|
|
room_creator_after = self.get_success(
|
|
@@ -137,22 +136,7 @@ class RoomBackgroundUpdateStoreTestCase(HomeserverTestCase):
|
|
|
)
|
|
|
)
|
|
|
|
|
|
- # Insert and run the background update
|
|
|
- self.get_success(
|
|
|
- self.store.db_pool.simple_insert(
|
|
|
- "background_updates",
|
|
|
- {
|
|
|
- "update_name": _BackgroundUpdates.ADD_ROOM_TYPE_COLUMN,
|
|
|
- "progress_json": "{}",
|
|
|
- },
|
|
|
- )
|
|
|
- )
|
|
|
-
|
|
|
- # ... and tell the DataStore that it hasn't finished all updates yet
|
|
|
- self.store.db_pool.updates._all_done = False
|
|
|
-
|
|
|
- # Now let's actually drive the updates to completion
|
|
|
- self.wait_for_background_updates()
|
|
|
+ self.run_background_updates(_BackgroundUpdates.ADD_ROOM_TYPE_COLUMN)
|
|
|
|
|
|
# Make sure the background update filled in the room type
|
|
|
room_type_after = self.get_success(
|
|
@@ -164,3 +148,39 @@ class RoomBackgroundUpdateStoreTestCase(HomeserverTestCase):
|
|
|
)
|
|
|
)
|
|
|
self.assertEqual(room_type_after, RoomTypes.SPACE)
|
|
|
+
|
|
|
+ def test_populate_stats_broken_rooms(self) -> None:
|
|
|
+ """Ensure that re-populating room stats skips broken rooms."""
|
|
|
+
|
|
|
+ # Create a good room.
|
|
|
+ good_room_id = self._generate_room()
|
|
|
+
|
|
|
+ # Create a room and then break it by having no room version.
|
|
|
+ room_id = self._generate_room()
|
|
|
+ self.get_success(
|
|
|
+ self.store.db_pool.simple_update(
|
|
|
+ table="rooms",
|
|
|
+ keyvalues={"room_id": room_id},
|
|
|
+ updatevalues={"room_version": None},
|
|
|
+ desc="test",
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ # Nuke any current stats in the database.
|
|
|
+ self.get_success(
|
|
|
+ self.store.db_pool.simple_delete(
|
|
|
+ table="room_stats_state", keyvalues={"1": 1}, desc="test"
|
|
|
+ )
|
|
|
+ )
|
|
|
+
|
|
|
+ self.run_background_updates("populate_stats_process_rooms")
|
|
|
+
|
|
|
+ # Only the good room appears in the stats tables.
|
|
|
+ results = self.get_success(
|
|
|
+ self.store.db_pool.simple_select_onecol(
|
|
|
+ table="room_stats_state",
|
|
|
+ keyvalues={},
|
|
|
+ retcol="room_id",
|
|
|
+ )
|
|
|
+ )
|
|
|
+ self.assertEqual(results, [good_room_id])
|