[PATCH b4 3/4] review: drop tests for the batch message-count updater

Christian Brauner <[email protected]> Tue, 21 Jul 2026 22:21:03 +0200
Newsgroups org.kernel.linux.tools
Message-ID <20260721-work-b4-accepted-unread-badge-v1-3-28581acc4988@kernel.org>
update_message_counts() and its private fetch helpers are about to be
removed. Drop their tests first so the removal commit leaves the suite
green at every step.

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

diff --git a/src/tests/test_review_tracking.py b/src/tests/test_review_tracking.py
index c3ddd33..2e646ba 100644
--- a/src/tests/test_review_tracking.py
+++ b/src/tests/test_review_tracking.py
@@ -1495,18 +1495,6 @@ class TestRescanBranches:
         conn.close()
 
 
-def _make_test_mbox(n: int, date: str = 'Mon, 15 Jan 2024 10:00:00 +0000') -> bytes:
-    """Build a minimal mbox with *n* unique messages (each has a distinct Message-ID)."""
-    parts = []
-    for i in range(n):
-        parts.append(
-            f'From [email protected] Mon Jan 01 00:00:00 2024\n'
-            f'Message-ID: <msg{i}@example.com>\n'
-            f'Date: {date}\n\n'.encode()
-        )
-    return b''.join(parts)
-
-
 class TestFollowupCounts:
     """Tests for message_count / seen_message_count tracking."""
 
@@ -1560,161 +1548,6 @@ class TestFollowupCounts:
         assert row[0] == review_tracking.SCHEMA_VERSION
         conn.close()
 
-    @mock.patch('b4.review.tracking._fetch_thread_mbox_bytes')
-    def test_first_fetch_initialises_seen(
-        self, mock_mbox_bytes: mock.Mock, tmp_path: pytest.TempPathFactory
-    ) -> None:
-        """First update_message_counts sets seen = count (no badge shown yet)."""
-        # 9 unique messages in the thread
-        mock_mbox_bytes.return_value = _make_test_mbox(9)
-
-        conn = review_tracking.init_db('fc-first-test')
-        review_tracking.add_series_to_db(
-            conn,
-            'fc-change',
-            1,
-            'Subject',
-            'Author',
-            '[email protected]',
-            '2024-01-15T10:00:00+00:00',
-            '[email protected]',
-            3,
-        )
-        conn.close()
-
-        series_list = [
-            {
-                'change_id': 'fc-change',
-                'revision': 1,
-                'message_id': '[email protected]',
-                'num_patches': 3,
-                'status': 'new',
-            }
-        ]
-        result = review_tracking.update_message_counts('fc-first-test', series_list)
-        assert result['updated'] == 1
-        assert result['errors'] == 0
-
-        conn = review_tracking.get_db('fc-first-test')
-        row = conn.execute(
-            'SELECT message_count, seen_message_count, last_update_check, last_activity_at'
-            ' FROM series WHERE change_id = ?',
-            ('fc-change',),
-        ).fetchone()
-        assert row['message_count'] == 9
-        # First fetch: seen initialised to same value — no badge yet
-        assert row['seen_message_count'] == 9
-        assert row['last_update_check'] is not None
-        assert row['last_activity_at'] == '2024-01-15T10:00:00+00:00'
-        conn.close()
-
-    @mock.patch('b4.review.tracking._fetch_new_since')
-    @mock.patch('b4.review.tracking._fetch_thread_mbox_bytes')
-    def test_incremental_fetch_adds_new_count(
-        self,
-        mock_fetch: mock.Mock,
-        mock_new_since: mock.Mock,
-        tmp_path: pytest.TempPathFactory,
-    ) -> None:
-        """Incremental update adds new message count and keeps seen unchanged."""
-        # 9 unique messages in the thread
-        mock_fetch.return_value = _make_test_mbox(9)
-        # incremental: 3 new messages, with a newer activity date
-        mock_new_since.return_value = (3, '2024-02-01T00:00:00+00:00')
-
-        conn = review_tracking.init_db('fc-incr-test')
-        review_tracking.add_series_to_db(
-            conn,
-            'fc-change2',
-            1,
-            'Subject',
-            'Author',
-            '[email protected]',
-            '2024-01-15T10:00:00+00:00',
-            '[email protected]',
-            3,
-        )
-        conn.close()
-
-        series_list = [
-            {
-                'change_id': 'fc-change2',
-                'revision': 1,
-                'message_id': '[email protected]',
-                'num_patches': 3,
-                'status': 'reviewing',
-            }
-        ]
-
-        # First fetch: seen = count = 9, last_update_check set
-        review_tracking.update_message_counts('fc-incr-test', series_list)
-
-        # Incremental: 3 new messages since last check
-        result = review_tracking.update_message_counts('fc-incr-test', series_list)
-        assert result['updated'] == 1
-
-        conn = review_tracking.get_db('fc-incr-test')
-        row = conn.execute(
-            'SELECT message_count, seen_message_count, last_activity_at FROM series'
-            ' WHERE change_id = ?',
-            ('fc-change2',),
-        ).fetchone()
-        assert row['message_count'] == 12  # 9 + 3
-        assert row['seen_message_count'] == 9  # badge shows +3
-        assert row['last_activity_at'] == '2024-02-01T00:00:00+00:00'
-        conn.close()
-
-    @mock.patch('b4.review.tracking._fetch_new_since')
-    @mock.patch('b4.review.tracking._fetch_thread_mbox_bytes')
-    def test_incremental_noop_makes_no_db_write(
-        self,
-        mock_fetch: mock.Mock,
-        mock_new_since: mock.Mock,
-        tmp_path: pytest.TempPathFactory,
-    ) -> None:
-        """Incremental update with zero new messages writes nothing to the DB."""
-        # 9 unique messages in the thread
-        mock_fetch.return_value = _make_test_mbox(9)
-        mock_new_since.return_value = (0, None)  # no new messages
-
-        conn = review_tracking.init_db('fc-noop-test')
-        review_tracking.add_series_to_db(
-            conn,
-            'fc-change3',
-            1,
-            'Subject',
-            'Author',
-            '[email protected]',
-            '2024-01-15T10:00:00+00:00',
-            '[email protected]',
-            3,
-        )
-        conn.close()
-
-        series_list = [
-            {
-                'change_id': 'fc-change3',
-                'revision': 1,
-                'message_id': '[email protected]',
-                'num_patches': 3,
-                'status': 'reviewing',
-            }
-        ]
-
-        # First fetch sets the baseline
-        review_tracking.update_message_counts('fc-noop-test', series_list)
-
-        import os
-
-        db_path = review_tracking.get_db_path('fc-noop-test')
-        mtime_before = os.path.getmtime(db_path)
-
-        # Incremental no-op — should not touch the DB at all
-        result = review_tracking.update_message_counts('fc-noop-test', series_list)
-        assert result['updated'] == 0
-        assert result['errors'] == 0
-        assert os.path.getmtime(db_path) == mtime_before
-
     def test_mark_all_messages_seen_clears_badge(
         self, tmp_path: pytest.TempPathFactory
     ) -> None:
@@ -1752,67 +1585,6 @@ class TestFollowupCounts:
         assert row['seen_message_count'] == 10
         conn.close()
 
-    def test_followup_fetch_skips_offline(
-        self, tmp_path: pytest.TempPathFactory
-    ) -> None:
-        """fetch_thread_message_count and _fetch_thread_mbox_bytes return None offline."""
-        # can_network is False in test fixture — no mock needed
-        assert review_tracking._fetch_thread_mbox_bytes('[email protected]') is None
-        assert review_tracking.fetch_thread_message_count('[email protected]') is None
-
-    def test_update_message_counts_skips_terminal_statuses(
-        self, tmp_path: pytest.TempPathFactory
-    ) -> None:
-        """update_message_counts skips archived/accepted/thanked series."""
-        conn = review_tracking.init_db('fc-skip-test')
-        for status in ('archived', 'accepted', 'thanked'):
-            cid = f'fc-{status}'
-            review_tracking.add_series_to_db(
-                conn,
-                cid,
-                1,
-                'Subject',
-                'Author',
-                '[email protected]',
-                '2024-01-15T10:00:00+00:00',
-                f'{cid}@example.com',
-                3,
-            )
-            review_tracking.update_series_status(conn, cid, status)
-        conn.close()
-
-        series_list = [
-            {
-                'change_id': f'fc-{s}',
-                'revision': 1,
-                'message_id': f'fc-{s}@example.com',
-                'num_patches': 3,
-                'status': s,
-            }
-            for s in ('archived', 'accepted', 'thanked')
-        ]
-        result = review_tracking.update_message_counts('fc-skip-test', series_list)
-        # None fetched — all skipped, no errors
-        assert result['updated'] == 0
-        assert result['errors'] == 0
-
-
-def _make_mbox_bytes(num_msgs: int, prefix: str = 'msg') -> bytes:
-    """Return valid mboxrd bytes containing *num_msgs* messages with unique IDs."""
-    result = b''
-    for i in range(num_msgs):
-        result += (
-            f'From [email protected] Mon Jan 15 10:00:00 2024\n'
-            f'Message-ID: <{prefix}-{i}@example.com>\n'
-            f'From: Test Author <[email protected]>\n'
-            f'Date: Mon, 15 Jan 2024 10:00:00 +0000\n'
-            f'Subject: Test message {i}\n'
-            f'\n'
-            f'Body of message {i}\n'
-            f'\n'
-        ).encode()
-    return result
-
 
 def _make_test_msg(msgid: str = '[email protected]') -> EmailMessage:
     """Return a minimal EmailMessage suitable for passing to _store_thread_blob."""
@@ -1924,114 +1696,6 @@ class TestFollowupBlob:
         result = review_tracking.get_thread_mbox(gitdir, 'deadbeef' * 5)
         assert result is None
 
-    @mock.patch('b4.review.tracking._fetch_thread_mbox_bytes')
-    def test_update_message_counts_stores_blob_on_first_fetch(
-        self, mock_mbox: mock.Mock, gitdir: str
-    ) -> None:
-        """update_message_counts writes a thread blob on the first fetch."""
-        mock_mbox.return_value = _make_mbox_bytes(9, prefix='ff')
-
-        change_id = 'blob-first-fetch'
-        _create_review_branch(
-            gitdir, change_id, _make_blob_tracking_data(change_id, 'blob-ff-proj')
-        )
-
-        conn = review_tracking.init_db('blob-ff-proj')
-        review_tracking.add_series_to_db(
-            conn,
-            change_id,
-            1,
-            'Subject',
-            'Author',
-            '[email protected]',
-            '2024-01-15T10:00:00+00:00',
-            '[email protected]',
-            3,
-        )
-        conn.close()
-
-        series_list = [
-            {
-                'change_id': change_id,
-                'revision': 1,
-                'message_id': '[email protected]',
-                'num_patches': 3,
-                'status': 'reviewing',
-            }
-        ]
-        review_tracking.update_message_counts(
-            'blob-ff-proj', series_list, topdir=gitdir
-        )
-
-        _cover, loaded = b4.review.load_tracking(gitdir, f'b4/review/{change_id}')
-        blob_sha = loaded['series'].get('thread-blob')
-        assert blob_sha is not None
-        # Blob must be readable
-        ecode, _ = b4.git_run_command(
-            gitdir, ['cat-file', 'blob', blob_sha], decode=False
-        )
-        assert ecode == 0
-
-    @mock.patch('b4.review.tracking._fetch_new_since')
-    @mock.patch('b4.review.tracking._fetch_thread_mbox_bytes')
-    def test_update_message_counts_updates_blob_on_incremental(
-        self, mock_fetch: mock.Mock, mock_new_since: mock.Mock, gitdir: str
-    ) -> None:
-        """update_message_counts replaces the blob when new replies arrive."""
-        # Different prefixes → different Message-IDs → different blobs
-        initial_mbox = _make_mbox_bytes(5, prefix='init')
-        larger_mbox = _make_mbox_bytes(8, prefix='upd')
-        mock_fetch.return_value = initial_mbox
-        mock_new_since.return_value = (3, '2024-02-01T00:00:00+00:00')
-
-        change_id = 'blob-incr-test'
-        _create_review_branch(
-            gitdir, change_id, _make_blob_tracking_data(change_id, 'blob-incr-proj')
-        )
-
-        conn = review_tracking.init_db('blob-incr-proj')
-        review_tracking.add_series_to_db(
-            conn,
-            change_id,
-            1,
-            'Subject',
-            'Author',
-            '[email protected]',
-            '2024-01-15T10:00:00+00:00',
-            '[email protected]',
-            3,
-        )
-        conn.close()
-
-        series_list = [
-            {
-                'change_id': change_id,
-                'revision': 1,
-                'message_id': '[email protected]',
-                'num_patches': 3,
-                'status': 'reviewing',
-            }
-        ]
-
-        # First fetch — stores initial blob
-        review_tracking.update_message_counts(
-            'blob-incr-proj', series_list, topdir=gitdir
-        )
-        _cover, loaded = b4.review.load_tracking(gitdir, f'b4/review/{change_id}')
-        sha_initial = loaded['series'].get('thread-blob')
-        assert sha_initial is not None
-
-        # Incremental — _fetch_thread_mbox_bytes now returns the larger mbox
-        mock_fetch.return_value = larger_mbox
-        review_tracking.update_message_counts(
-            'blob-incr-proj', series_list, topdir=gitdir
-        )
-        _cover, loaded = b4.review.load_tracking(gitdir, f'b4/review/{change_id}')
-        sha_updated = loaded['series'].get('thread-blob')
-
-        assert sha_updated is not None
-        assert sha_updated != sha_initial
-
 
 class TestPatchState:
     """Tests for _get_patch_state() and _set_patch_state()."""

-- 
2.53.0