From f5db674e22cc2962d367efcdbc8da1a7c67dd93c Mon Sep 17 00:00:00 2001 From: Colin Maudry Date: Mon, 22 Jun 2026 13:50:12 +0200 Subject: [PATCH] =?UTF-8?q?feat(api):=20renomme=20le=20param=20r=C3=A9serv?= =?UTF-8?q?=C3=A9=20count=20en=20count=5Fresults=20(#78)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Renomme RESERVED_PARAMS dans src/api/filters.py - Fait passer le paramètre de 'count' à 'count_results' dans src/api/routes.py - Met à jour la documentation swagger pour le nouveau nom Co-Authored-By: Claude Sonnet 4.6 --- src/api/filters.py | 2 +- src/api/routes.py | 10 +++++----- tests/api/test_endpoints_data.py | 4 ++-- tests/api/test_filters.py | 2 +- tests/conftest.py | 3 ++- 5 files changed, 11 insertions(+), 10 deletions(-) diff --git a/src/api/filters.py b/src/api/filters.py index 573dde8..9ca30d1 100644 --- a/src/api/filters.py +++ b/src/api/filters.py @@ -17,7 +17,7 @@ OPERATORS = { "sort", } -RESERVED_PARAMS = {"page", "page_size", "columns", "count"} +RESERVED_PARAMS = {"page", "page_size", "columns", "count_results"} class FilterError(ValueError): diff --git a/src/api/routes.py b/src/api/routes.py index 418492d..077d394 100644 --- a/src/api/routes.py +++ b/src/api/routes.py @@ -114,10 +114,10 @@ def schema(): "description": "Liste de colonnes à retourner, séparées par des virgules (ex: `id,acheteur_id,montant`). Par défaut : toutes.", }, { - "name": "count", + "name": "count_results", "in": "query", "schema": {"type": "string", "enum": ["true", "false"], "default": "true"}, - "description": "Inclure le total (`COUNT(*)`) dans la réponse. Mettre `false` pour accélérer la requête.", + "description": "Inclure le total (`COUNT(*)`) dans `meta`. Mettre `false` pour accélérer la requête. Ignoré en mode agrégation.", }, { "name": "__", @@ -142,14 +142,14 @@ def data(): strictly_less, strictly_greater, in, notin, isnull, isnotnull, sort. Paramètres réservés : page (défaut 1), page_size (défaut 50, max 1000), - columns (csv), count (true|false ; mettre false pour économiser le COUNT(*)). + columns (csv), count_results (true|false ; mettre false pour économiser le COUNT(*)). """ import polars as pl import polars.selectors as cs page, page_size = _parse_pagination() columns = _parse_columns() - count = request.args.get("count", "true").lower() != "false" + count_results = request.args.get("count_results", "true").lower() != "false" try: where_sql, params, order_sql = build_where( @@ -170,7 +170,7 @@ def data(): # JSON ne sérialise pas date/datetime nativement → cast en string ISO df_ready = df.with_columns(cs.temporal().cast(pl.String)) - total = count_marches(where_sql, params) if count else None + total = count_marches(where_sql, params) if count_results else None meta = {"page": page, "page_size": page_size} if total is not None: meta["total"] = total diff --git a/tests/api/test_endpoints_data.py b/tests/api/test_endpoints_data.py index 8911062..991c1c3 100644 --- a/tests/api/test_endpoints_data.py +++ b/tests/api/test_endpoints_data.py @@ -17,9 +17,9 @@ def test_data_default_pagination(api_client, valid_token_header): assert "total" in body["meta"] -def test_data_count_false_omits_total(api_client, valid_token_header): +def test_data_count_results_false_omits_total(api_client, valid_token_header): client, _ = api_client - resp = client.get("/api/v1/data?count=false", headers=valid_token_header) + resp = client.get("/api/v1/data?count_results=false", headers=valid_token_header) assert resp.status_code == 200 body = resp.get_json() assert "total" not in body["meta"] diff --git a/tests/api/test_filters.py b/tests/api/test_filters.py index b7706fe..8d3ecd5 100644 --- a/tests/api/test_filters.py +++ b/tests/api/test_filters.py @@ -114,7 +114,7 @@ def test_reserved_params_are_ignored(): ("page", "2"), ("page_size", "100"), ("columns", "uid"), - ("count", "false"), + ("count_results", "false"), ("uid__exact", "z"), ], SCHEMA, diff --git a/tests/conftest.py b/tests/conftest.py index 9ef9b6a..3ff37f7 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -74,7 +74,8 @@ def test_data(): _cleanup_db_artifacts() -def pytest_setup_options(): +@pytest.fixture(scope="session") +def chrome_options(): options = Options() options.add_argument("--window-size=1200,1200 ") options.add_experimental_option(