[PATCH b4 2/4] review: test the applied-series message-count refresh

Christian Brauner <[email protected]> Tue, 21 Jul 2026 22:21:02 +0200
Newsgroups org.kernel.linux.tools
Message-ID <20260721-work-b4-accepted-unread-badge-v1-2-28581acc4988@kernel.org>
An accepted series run through update_series_tracking() gets
message_count refreshed from the fetched thread while seen_message_count
stays put, so the unread badge appears for follow-up mail on applied
series.

Signed-off-by: Christian Brauner (Amutable) <[email protected]>
---
 src/tests/test_review_tracking.py | 81 +++++++++++++++++++++++++++++++++++++++
 1 file changed, 81 insertions(+)

diff --git a/src/tests/test_review_tracking.py b/src/tests/test_review_tracking.py
index bcf8745..c3ddd33 100644
--- a/src/tests/test_review_tracking.py
+++ b/src/tests/test_review_tracking.py
@@ -2908,6 +2908,87 @@ class TestUpdateSeriesTrackingCancellation:
                 )
 
 
+# ---------------------------------------------------------------------------
+# Message counts: update_series_tracking
+# ---------------------------------------------------------------------------
+
+
+class TestUpdateSeriesTrackingCounts:
+    """The message count is refreshed regardless of series status."""
+
+    def test_accepted_series_still_updates_counts(self) -> None:
+        """An accepted (applied) series still gets its message count refreshed.
+
+        Regression: the count update used to be skipped for
+        accepted/thanked/snoozed series, so once a series was applied the
+        unread badge never appeared again — new follow-up mail was fetched
+        on update but message_count stayed frozen.
+        """
+        identifier = 'count-accepted-test'
+        change_id = 'count-accepted-1'
+        conn = review_tracking.init_db(identifier)
+        review_tracking.add_series_to_db(
+            conn,
+            change_id,
+            1,
+            'Subject',
+            'Author',
+            '[email protected]',
+            '2024-01-15T10:00:00+00:00',
+            '[email protected]',
+            3,
+        )
+        review_tracking.update_series_status(conn, change_id, 'accepted')
+        # Baseline from the reviewing days: 5 messages, all seen
+        conn.execute(
+            'UPDATE series SET message_count = 5, seen_message_count = 5'
+            ' WHERE change_id = ?',
+            (change_id,),
+        )
+        conn.commit()
+        conn.close()
+
+        # The refetched thread has grown to 7 messages
+        msgs = [_make_test_msg(f'reply-{i}@example.com') for i in range(7)]
+
+        v1_patch = mock.Mock()
+        v1_patch.msgid = '[email protected]'
+        v1_patch.full_subject = '[PATCH 0/3] test'
+        v1_mock = mock.Mock()
+        v1_mock.revision = 1
+        v1_mock.patches = [v1_patch, None, None, None]
+        mock_lmbx = mock.Mock()
+        mock_lmbx.series = {1: v1_mock}
+        mock_lmbx.get_series.return_value = None
+
+        series_dict: Dict[str, Any] = {
+            'change_id': change_id,
+            'revision': 1,
+            'status': 'accepted',
+            'message_id': '[email protected]',
+        }
+        with (
+            mock.patch('b4.review._review.retrieve_series_messages', return_value=msgs),
+            mock.patch('b4.LoreMailbox', return_value=mock_lmbx),
+        ):
+            result = b4.review.update_series_tracking(
+                series_dict, identifier, 'https://example.com/%s'
+            )
+
+        assert result.get('error') is None
+        assert result.get('counts_updated') is True
+
+        conn = review_tracking.get_db(identifier)
+        row = conn.execute(
+            'SELECT message_count, seen_message_count FROM series WHERE change_id = ?',
+            (change_id,),
+        ).fetchone()
+        conn.close()
+        # Count refreshed, seen untouched — the badge shows (2)
+        assert row['message_count'] == 7
+        assert row['seen_message_count'] == 5
+
+
 # ---------------------------------------------------------------------------
 # Cancellation: cmd_track
 # ---------------------------------------------------------------------------

-- 
2.53.0