From 2c8b853ccef9be43088c802d015bf4502afb70c0 Mon Sep 17 00:00:00 2001 From: Peter Wilson Date: Fri, 3 Jul 2026 13:40:23 +0100 Subject: [PATCH] fix(google-tasks): couple showHidden with show_completed The Tasks API marks completed items as hidden, so hardcoding showHidden=false filtered completed tasks back out even when callers passed show_completed=true, making the parameter a no-op. Send showHidden=true whenever show_completed is true (and false otherwise) so opted-in completed tasks are returned. Fixes #147 --- src/apron_tools/providers/google/tasks/tools.py | 5 ++++- tests/providers/google/tasks/test_tools.py | 10 ++++++++-- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/apron_tools/providers/google/tasks/tools.py b/src/apron_tools/providers/google/tasks/tools.py index 9302f5b..4c794f8 100644 --- a/src/apron_tools/providers/google/tasks/tools.py +++ b/src/apron_tools/providers/google/tasks/tools.py @@ -112,8 +112,11 @@ async def google_tasks_list_tasks( "maxResults": _clamp_max_results(params.max_results), # Strings "true"/"false" because the Tasks API expects query-string # booleans rather than python's capitalised "True"/"False". + # The Tasks API marks completed items as hidden, so showHidden must be + # coupled to showCompleted; otherwise completed tasks are filtered back + # out even when the caller opts in. "showCompleted": "true" if params.show_completed else "false", - "showHidden": "false", + "showHidden": "true" if params.show_completed else "false", "showDeleted": "false", } if params.due_min: diff --git a/tests/providers/google/tasks/test_tools.py b/tests/providers/google/tasks/test_tools.py index 85163d4..3b50a92 100644 --- a/tests/providers/google/tasks/test_tools.py +++ b/tests/providers/google/tasks/test_tools.py @@ -100,7 +100,9 @@ async def test_hides_completed_by_default(self, httpx_mock: HTTPXMock) -> None: await google_tasks_list_tasks(ListTasksParams(), token=_TOKEN) request = httpx_mock.get_request() - assert "showCompleted=false" in str(request.url) + url = str(request.url) + assert "showCompleted=false" in url + assert "showHidden=false" in url async def test_show_completed_opt_in(self, httpx_mock: HTTPXMock) -> None: httpx_mock.add_response(json=_load_json("list_tasks.json")) @@ -108,7 +110,11 @@ async def test_show_completed_opt_in(self, httpx_mock: HTTPXMock) -> None: await google_tasks_list_tasks(ListTasksParams(show_completed=True), token=_TOKEN) request = httpx_mock.get_request() - assert "showCompleted=true" in str(request.url) + url = str(request.url) + assert "showCompleted=true" in url + # Completed tasks are marked hidden by the Tasks API, so surfacing them + # requires showHidden coupled to showCompleted. + assert "showHidden=true" in url async def test_clamps_max_results_upper(self, httpx_mock: HTTPXMock) -> None: httpx_mock.add_response(json=_load_json("list_tasks.json"))