From d135408f5e1f07016b0d9462017b97f9e47ab972 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9A=D0=BE=D0=BA=D0=BE=D1=81=20=D0=90=D1=80=D1=82=D0=B5?= =?UTF-8?q?=D0=BC=20=D0=9D=D0=B8=D0=BA=D0=BE=D0=BB=D0=B0=D0=B5=D0=B2=D0=B8?= =?UTF-8?q?=D1=87?= Date: Fri, 17 Jul 2026 11:22:10 +0700 Subject: [PATCH] test: strengthen #58 dedup trap to assert filtering The trap mocked issue.filter to return only issue 2, so result == [2] would pass even with a wrong fix that suppresses TypeError but keeps all entries. Now the API mock returns both issues; only correct filtering of the pre-cutoff time entry keeps the result at [2]. Refs #67, #58 --- tests/test_client.py | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/tests/test_client.py b/tests/test_client.py index 6337431..8ada219 100644 --- a/tests/test_client.py +++ b/tests/test_client.py @@ -779,12 +779,21 @@ def test_dedup_normalizes_naive_created_on_to_utc(mock_redmine_class): mock_redmine.time_entry.filter.return_value = [e_old, e_new] + mock_issue1 = mock.MagicMock() + mock_issue1.id = 1 + mock_issue1.project = "P" + mock_issue1.subject = "T" + mock_issue1.status = "New" mock_issue2 = mock.MagicMock() mock_issue2.id = 2 mock_issue2.project = "P" mock_issue2.subject = "T" mock_issue2.status = "New" - mock_redmine.issue.filter.return_value = [mock_issue2] + # API возвращает обе задачи: issue 1 попадёт в результат, только если + # её time entry не отсечён дедупликацией. Корректный фикс #58 отсекает + # e_old (created_on/updated_on < cutoff) -> [2]; неправильный фикс + # "погасить TypeError и оставить всё" даст [1, 2] и тест упадёт. + mock_redmine.issue.filter.return_value = [mock_issue1, mock_issue2] result = fetch_issues_with_spent_time( "2026-07-01", "2026-07-01", dedup_before=dedup_cutoff