From 3c50f072ad1047559659062e14674272280e8597 Mon Sep 17 00:00:00 2001 From: Nicolas Oudard Date: Fri, 11 Aug 2023 15:24:32 +0200 Subject: [PATCH 01/12] force p2p From c3c2e5e35e6fef465033c00c6769e8e12e762fb3 Mon Sep 17 00:00:00 2001 From: Fabien Le Frapper Date: Fri, 15 Nov 2024 11:29:03 +0100 Subject: [PATCH 02/12] Add tests for REST API --- qfdmo/api.py | 6 ++++-- qfdmo/fixtures/actions.json | 30 +++++++++++++++--------------- qfdmo/models/action.py | 4 ++-- 3 files changed, 21 insertions(+), 19 deletions(-) diff --git a/qfdmo/api.py b/qfdmo/api.py index 54ef613bc..b2defdeaa 100644 --- a/qfdmo/api.py +++ b/qfdmo/api.py @@ -43,7 +43,7 @@ class Meta: class ActionSchema(ModelSchema): - services: str = Field(..., alias="primary") + couleur: str = Field(..., alias="primary") class Meta: model = Action @@ -193,7 +193,9 @@ def services(request): summary="Retrouver un acteur actif", ) def acteur(request, identifiant_unique: str): - return get_object_or_404(DisplayedActeur, pk=id, statut=ActeurStatus.ACTIF) + return get_object_or_404( + DisplayedActeur, pk=identifiant_unique, statut=ActeurStatus.ACTIF + ) @router.get("/autocomplete/configurateur") diff --git a/qfdmo/fixtures/actions.json b/qfdmo/fixtures/actions.json index 04e5d4e01..6f678fb39 100644 --- a/qfdmo/fixtures/actions.json +++ b/qfdmo/fixtures/actions.json @@ -22,7 +22,7 @@ "afficher": true, "description": null, "order": 1, - "couleur": "green-menthe-main-548", + "couleur": "#C3992A", "icon": "fr-icon-tools-fill" } }, @@ -33,7 +33,7 @@ "afficher": true, "description": null, "order": 2, - "couleur": "blue-cumulus-sun-368", + "couleur": "#C3992A", "icon": "fr-icon-hand-heart-line" } }, @@ -44,7 +44,7 @@ "afficher": true, "description": null, "order": 3, - "couleur": "orange-terre-battue-main-645", + "couleur": "#C3992A", "icon": "fr-icon-arrow-go-back-line" } }, @@ -55,7 +55,7 @@ "afficher": true, "description": null, "order": 4, - "couleur": "brown-cafe-creme-main-782", + "couleur": "#C3992A", "icon": "fr-icon-money-euro-circle-line" } }, @@ -66,7 +66,7 @@ "afficher": true, "description": null, "order": 5, - "couleur": "purple-glycine-main-494", + "couleur": "#C3992A", "icon": "fr-icon-recycle-line" } }, @@ -80,7 +80,7 @@ "description": null, "order": 5, "couleur": "green-menthe", - "icon": "fr-icon-action-reparer", + "couleur": "#C3992A", "groupe_action": ["reparer"], "directions": [["jai"]] } @@ -94,7 +94,7 @@ "afficher": true, "description": "acheter d'occasion", "order": 8, - "couleur": "brown-cafe-creme", + "couleur": "#C3992A", "icon": "fr-icon-action-acheter", "groupe_action": ["vendre_acheter"], "directions": [["jecherche"]] @@ -109,7 +109,7 @@ "afficher": true, "description": null, "order": 9, - "couleur": "brown-cafe-creme", + "couleur": "#C3992A", "icon": "fr-icon-action-vendre", "groupe_action": ["vendre_acheter"], "directions": [["jai"]] @@ -124,7 +124,7 @@ "afficher": true, "description": null, "order": 6, - "couleur": "yellow-tournesol", + "couleur": "#C3992A", "icon": "fr-icon-action-donner", "groupe_action": ["donner_echanger"], "directions": [["jai"]] @@ -139,7 +139,7 @@ "afficher": true, "description": null, "order": 3, - "couleur": "purple-glycine", + "couleur": "#C3992A", "icon": "fr-icon-action-louer", "groupe_action": ["emprunter_preter_louer"], "directions": [["jecherche"]] @@ -154,7 +154,7 @@ "afficher": true, "description": "Mettre en location", "order": 4, - "couleur": "purple-glycine", + "couleur": "#C3992A", "icon": "fr-icon-action-mettreenlocation", "groupe_action": ["emprunter_preter_louer"], "directions": [["jai"]] @@ -169,7 +169,7 @@ "afficher": true, "description": null, "order": 2, - "couleur": "orange-terre-battue", + "couleur": "#C3992A", "icon": "fr-icon-action-emprunter", "groupe_action": ["emprunter_preter_louer"], "directions": [["jecherche"]] @@ -184,7 +184,7 @@ "afficher": true, "description": null, "order": 1, - "couleur": "orange-terre-battue", + "couleur": "#C3992A", "icon": "fr-icon-action-preter", "groupe_action": ["emprunter_preter_louer"], "directions": [["jai"]] @@ -199,7 +199,7 @@ "afficher": true, "description": null, "order": 7, - "couleur": "blue-cumulus", + "couleur": "#C3992A", "icon": "fr-icon-action-echanger", "groupe_action": ["donner_echanger"], "directions": [["jai"], ["jecherche"]] @@ -214,7 +214,7 @@ "afficher": false, "description": "trier pour recycler", "order": 10, - "couleur": "yellow-tournesol", + "couleur": "#C3992A", "icon": "fr-icon-recycle-line", "groupe_action": ["trier"], "directions": [["jai"]] diff --git a/qfdmo/models/action.py b/qfdmo/models/action.py index 1710d1748..d27ce10d8 100644 --- a/qfdmo/models/action.py +++ b/qfdmo/models/action.py @@ -108,7 +108,7 @@ def primary(self): for key, value in DSFRColors.items() if value.lower() == self.couleur.lower() ), - None, + "", ) @cached_property @@ -201,7 +201,7 @@ def primary(self): for key, value in DSFRColors.items() if value.lower() == self.couleur.lower() ), - None, + "", ) @cached_property From c8dd8b5af9393db7217b06e335b574072b4b75a5 Mon Sep 17 00:00:00 2001 From: Fabien Le Frapper Date: Fri, 15 Nov 2024 11:30:02 +0100 Subject: [PATCH 03/12] Add file --- integration_tests/qfdmo/test_api.py | 95 +++++++++++++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 integration_tests/qfdmo/test_api.py diff --git a/integration_tests/qfdmo/test_api.py b/integration_tests/qfdmo/test_api.py new file mode 100644 index 000000000..947122191 --- /dev/null +++ b/integration_tests/qfdmo/test_api.py @@ -0,0 +1,95 @@ +import pytest + +from qfdmo.models.acteur import ActeurStatus +from unit_tests.qfdmo.acteur_factory import DisplayedActeurFactory + +BASE_URL = "http://localhost:8000/api/qfdmo" + + +@pytest.mark.django_db +def test_get_actions(client): + """Test the /actions endpoint""" + response = client.get(f"{BASE_URL}/actions") + assert response.status_code == 200 + assert isinstance(response.json(), list) + + +@pytest.mark.django_db +def test_get_groupe_actions(client): + """Test the /actions/groupes endpoint""" + response = client.get(f"{BASE_URL}/actions/groupes") + assert response.status_code == 200 + assert isinstance(response.json(), list) + + +@pytest.mark.django_db +def test_get_acteurs(client): + """Test the /acteurs endpoint with filters""" + params = { + "latitude": 48.86, + "longitude": 2.3, + "rayon": 5, + "types": [1, 2], + "services": [3], + "actions": [4], + } + response = client.get(f"{BASE_URL}/acteurs", params=params) + assert response.status_code == 200 + data = response.json() + assert isinstance(data["items"], list) + if items := data["items"] and data["count"] > 0: + assert "nom" in items[0] + assert "adresse" in items[0] + + +@pytest.mark.django_db +def test_get_acteurs_types(client): + """Test the /acteurs/types endpoint""" + response = client.get(f"{BASE_URL}/acteurs/types") + assert response.status_code == 200 + data = response.json() + assert isinstance(data, list) + if data: + assert "id" in data[0] + assert "libelle" in data[0] + + +@pytest.mark.django_db +def test_get_acteurs_services(client): + """Test the /acteurs/services endpoint""" + response = client.get(f"{BASE_URL}/acteurs/services") + assert response.status_code == 200 + data = response.json() + assert isinstance(data, list) + if data: + assert "id" in data[0] + assert "libelle" in data[0] + + +@pytest.mark.django_db +def test_get_acteur_by_identifiant(client): + """Test the /acteur endpoint""" + identifiant_unique = "ACT12345" + DisplayedActeurFactory(pk=identifiant_unique, statut=ActeurStatus.ACTIF) + response = client.get( + f"{BASE_URL}/acteur", query_params={"identifiant_unique": identifiant_unique} + ) + assert response.status_code == 200 + data = response.json() + assert "nom" in data + assert "adresse" in data + assert data.get("identifiant_unique") == identifiant_unique + + +@pytest.mark.django_db +def test_autocomplete_epci(client): + """Test the /autocomplete/configurateur endpoint""" + response = client.get( + f"{BASE_URL}/autocomplete/configurateur", query_params={"query": "Quiberon"} + ) + assert response.status_code == 200 + data = response.json() + assert isinstance(data, list) + assert len(data) == 5 + if data: + assert "Quiberon" in data[0] From 8bf15fcabb54b60259c39a8b26eafda5660bc7b0 Mon Sep 17 00:00:00 2001 From: Fabien Le Frapper Date: Fri, 15 Nov 2024 11:37:09 +0100 Subject: [PATCH 04/12] Update tests --- integration_tests/qfdmo/test_api.py | 31 ++++++++++++++++++----------- 1 file changed, 19 insertions(+), 12 deletions(-) diff --git a/integration_tests/qfdmo/test_api.py b/integration_tests/qfdmo/test_api.py index 947122191..76a48c3e5 100644 --- a/integration_tests/qfdmo/test_api.py +++ b/integration_tests/qfdmo/test_api.py @@ -1,4 +1,5 @@ import pytest +from django.contrib.gis.geos import Point from qfdmo.models.acteur import ActeurStatus from unit_tests.qfdmo.acteur_factory import DisplayedActeurFactory @@ -25,21 +26,24 @@ def test_get_groupe_actions(client): @pytest.mark.django_db def test_get_acteurs(client): """Test the /acteurs endpoint with filters""" + DisplayedActeurFactory( + pk="UN-ACTEUR", location=Point(2.3, 48.86), statut=ActeurStatus.ACTIF + ) params = { "latitude": 48.86, "longitude": 2.3, "rayon": 5, - "types": [1, 2], - "services": [3], - "actions": [4], } response = client.get(f"{BASE_URL}/acteurs", params=params) assert response.status_code == 200 data = response.json() assert isinstance(data["items"], list) - if items := data["items"] and data["count"] > 0: - assert "nom" in items[0] - assert "adresse" in items[0] + assert data["count"] > 0 + + returned_acteur = data["items"][0] + assert "nom" in returned_acteur + assert "adresse" in returned_acteur + assert returned_acteur["identifiant_unique"] == "UN-ACTEUR" @pytest.mark.django_db @@ -49,9 +53,10 @@ def test_get_acteurs_types(client): assert response.status_code == 200 data = response.json() assert isinstance(data, list) - if data: - assert "id" in data[0] - assert "libelle" in data[0] + assert len(data) > 0 + assert "code" in data[0] + assert "id" in data[0] + assert "libelle" in data[0] @pytest.mark.django_db @@ -61,9 +66,9 @@ def test_get_acteurs_services(client): assert response.status_code == 200 data = response.json() assert isinstance(data, list) - if data: - assert "id" in data[0] - assert "libelle" in data[0] + assert "code" in data[0] + assert "id" in data[0] + assert "libelle" in data[0] @pytest.mark.django_db @@ -77,6 +82,8 @@ def test_get_acteur_by_identifiant(client): assert response.status_code == 200 data = response.json() assert "nom" in data + assert "nom_commercial" in data + assert "siret" in data assert "adresse" in data assert data.get("identifiant_unique") == identifiant_unique From 74907f4ec1dad5cf9b7e38f5945afd9ab0fec176 Mon Sep 17 00:00:00 2001 From: Fabien Le Frapper Date: Wed, 23 Apr 2025 18:06:59 +0200 Subject: [PATCH 05/12] Add filter --- qfdmo/api.py | 24 ++++++++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/qfdmo/api.py b/qfdmo/api.py index 430290bd8..54ae8f2d2 100644 --- a/qfdmo/api.py +++ b/qfdmo/api.py @@ -18,6 +18,7 @@ DisplayedActeur, GroupeAction, Source, + SousCategorieObjet, ) router = Router() @@ -71,6 +72,12 @@ class Meta: fields = ["id", "code", "libelle", "url"] +class SousCategorieObjetSchema(ModelSchema): + class Meta: + model = SousCategorieObjet + fields = ["id", "code", "libelle"] + + class ActeurSchema(ModelSchema): latitude: float longitude: float @@ -112,6 +119,10 @@ class ActeurFilterSchema(FilterSchema): types: Optional[List[int]] = Field(None, q="acteur_type__in") services: Optional[List[int]] = Field(None, q="acteur_services__in") actions: Optional[List[int]] = Field(None, q="proposition_services__action_id__in") + sous_categories: Optional[List[int]] = Field( + None, + q="proposition_services__sous_categories__id__in", + ) @router.get("/sources", response=List[SourceSchema], summary="Liste des sources") @@ -123,6 +134,19 @@ def sources(request): return qs +@router.get( + "/sous-categories", + response=List[SousCategorieObjetSchema], + summary="Liste des catégories d'objets", +) +def sous_categories(request): + """ + Liste l'ensemble des sous-catégories d'objet possibles pour un acteur. + """ # noqa + qs = SousCategorieObjet.objects.filter(afficher=True) + return qs + + @router.get( "/actions", response=List[ActionSchema], summary="Liste des actions possibles" ) From 06b31d20b37361fef0fa2781ad6211de78e836fb Mon Sep 17 00:00:00 2001 From: Fabien Le Frapper Date: Wed, 23 Apr 2025 18:34:21 +0200 Subject: [PATCH 06/12] Add fixtures to tests --- integration_tests/qfdmo/test_api.py | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) diff --git a/integration_tests/qfdmo/test_api.py b/integration_tests/qfdmo/test_api.py index 76a48c3e5..c33799da9 100644 --- a/integration_tests/qfdmo/test_api.py +++ b/integration_tests/qfdmo/test_api.py @@ -1,12 +1,26 @@ import pytest from django.contrib.gis.geos import Point +from django.core.management import call_command -from qfdmo.models.acteur import ActeurStatus +from qfdmo.models.acteur import ActeurService, ActeurStatus +from qfdmo.models.action import GroupeAction from unit_tests.qfdmo.acteur_factory import DisplayedActeurFactory BASE_URL = "http://localhost:8000/api/qfdmo" +@pytest.fixture(scope="session") +def django_db_setup(django_db_setup, django_db_blocker): + with django_db_blocker.unblock(): + call_command( + "loaddata", + "categories", + "actions", + "acteur_services", + "acteur_types", + ) + + @pytest.mark.django_db def test_get_actions(client): """Test the /actions endpoint""" @@ -21,6 +35,7 @@ def test_get_groupe_actions(client): response = client.get(f"{BASE_URL}/actions/groupes") assert response.status_code == 200 assert isinstance(response.json(), list) + assert len(response.json()) == GroupeAction.objects.filter(afficher=True).count() @pytest.mark.django_db @@ -66,6 +81,7 @@ def test_get_acteurs_services(client): assert response.status_code == 200 data = response.json() assert isinstance(data, list) + assert len(data) == ActeurService.objects.all().count() assert "code" in data[0] assert "id" in data[0] assert "libelle" in data[0] From 5cdef65343411995f3e11e284b68bde31112b136 Mon Sep 17 00:00:00 2001 From: Fabien Le Frapper Date: Wed, 23 Apr 2025 18:37:10 +0200 Subject: [PATCH 07/12] Add inactif acteur test --- integration_tests/qfdmo/test_api.py | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/integration_tests/qfdmo/test_api.py b/integration_tests/qfdmo/test_api.py index c33799da9..24b695770 100644 --- a/integration_tests/qfdmo/test_api.py +++ b/integration_tests/qfdmo/test_api.py @@ -104,6 +104,16 @@ def test_get_acteur_by_identifiant(client): assert data.get("identifiant_unique") == identifiant_unique +@pytest.mark.django_db +def test_get_acteur_inacteur_returns_404(client): + identifiant_unique = "INACTIF_ACT12345" + DisplayedActeurFactory(pk=identifiant_unique, statut=ActeurStatus.INACTIF) + response = client.get( + f"{BASE_URL}/acteur", query_params={"identifiant_unique": identifiant_unique} + ) + assert response.status_code == 404 + + @pytest.mark.django_db def test_autocomplete_epci(client): """Test the /autocomplete/configurateur endpoint""" From 90414ea466285a3de9255b4c1682cfc7b2647dcf Mon Sep 17 00:00:00 2001 From: Fabien Le Frapper Date: Thu, 24 Apr 2025 09:40:11 +0200 Subject: [PATCH 08/12] add mock --- integration_tests/qfdmo/test_api.py | 13 ++++++++++++- pyproject.toml | 4 ++++ 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/integration_tests/qfdmo/test_api.py b/integration_tests/qfdmo/test_api.py index 24b695770..65b66b30a 100644 --- a/integration_tests/qfdmo/test_api.py +++ b/integration_tests/qfdmo/test_api.py @@ -1,3 +1,5 @@ +from unittest.mock import patch + import pytest from django.contrib.gis.geos import Point from django.core.management import call_command @@ -115,8 +117,17 @@ def test_get_acteur_inacteur_returns_404(client): @pytest.mark.django_db -def test_autocomplete_epci(client): +@patch("qfdmo.geo_api.fetch_epci_codes") +def test_autocomplete_epci(client, mock_get): """Test the /autocomplete/configurateur endpoint""" + # Mock setup + mock_response = mock_get.return_value + mock_response.status_code = 200 + mock_response.json.return_value = [ + {"code": "200043123", "nom": "CC Auray Quiberon Terre Atlantique"}, + {"code": "200043156", "nom": "CC du Pays Rethélois"}, + ] + response = client.get( f"{BASE_URL}/autocomplete/configurateur", query_params={"query": "Quiberon"} ) diff --git a/pyproject.toml b/pyproject.toml index eeadd5ff8..1a498774e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -8,6 +8,10 @@ filterwarnings = [ "ignore::django.utils.deprecation.RemovedInDjango60Warning", ] +[tool.pyright] +venvPath = "." +venv = ".venv" + [tool.ruff] # Exclude a variety of commonly ignored directories. exclude = [ From 7022a8ba413fd7a4c78a5f787ef24a61c2699034 Mon Sep 17 00:00:00 2001 From: Fabien Le Frapper Date: Thu, 24 Apr 2025 10:22:51 +0200 Subject: [PATCH 09/12] add mock --- integration_tests/qfdmo/test_api.py | 65 ++++++++++++++++++++++------- pyproject.toml | 1 + 2 files changed, 50 insertions(+), 16 deletions(-) diff --git a/integration_tests/qfdmo/test_api.py b/integration_tests/qfdmo/test_api.py index 65b66b30a..7c7298018 100644 --- a/integration_tests/qfdmo/test_api.py +++ b/integration_tests/qfdmo/test_api.py @@ -1,16 +1,33 @@ -from unittest.mock import patch - import pytest from django.contrib.gis.geos import Point from django.core.management import call_command -from qfdmo.models.acteur import ActeurService, ActeurStatus +from qfdmo.models.acteur import ActeurService, ActeurStatus, DisplayedActeur from qfdmo.models.action import GroupeAction -from unit_tests.qfdmo.acteur_factory import DisplayedActeurFactory +from unit_tests.qfdmo.acteur_factory import ( + DisplayedActeurFactory, + DisplayedPropositionServiceFactory, +) +from unit_tests.qfdmo.sscatobj_factory import SousCategorieObjetFactory BASE_URL = "http://localhost:8000/api/qfdmo" +# Fixtures +# -------- +@pytest.fixture +def sous_categorie(): + sous_categorie = SousCategorieObjetFactory() + return sous_categorie + + +@pytest.fixture +def displayed_acteur(): + DisplayedActeurFactory( + pk="UN-ACTEUR", location=Point(2.3, 48.86), statut=ActeurStatus.ACTIF + ) + + @pytest.fixture(scope="session") def django_db_setup(django_db_setup, django_db_blocker): with django_db_blocker.unblock(): @@ -23,6 +40,8 @@ def django_db_setup(django_db_setup, django_db_blocker): ) +# Tests +# ----- @pytest.mark.django_db def test_get_actions(client): """Test the /actions endpoint""" @@ -41,11 +60,8 @@ def test_get_groupe_actions(client): @pytest.mark.django_db -def test_get_acteurs(client): +def test_get_acteurs(client, displayed_acteur): """Test the /acteurs endpoint with filters""" - DisplayedActeurFactory( - pk="UN-ACTEUR", location=Point(2.3, 48.86), statut=ActeurStatus.ACTIF - ) params = { "latitude": 48.86, "longitude": 2.3, @@ -63,6 +79,22 @@ def test_get_acteurs(client): assert returned_acteur["identifiant_unique"] == "UN-ACTEUR" +@pytest.mark.django_db +def test_get_acteurs_sous_categorie_filter(client, displayed_acteur): + """Test the /acteurs endpoint with sous categorie filter""" + sous_categorie = SousCategorieObjetFactory(id=666) + proposition_service = DisplayedPropositionServiceFactory() + proposition_service.sous_categories.add(sous_categorie) + + params = {"latitude": 48.86, "longitude": 2.3, "rayon": 5, "sous_categories": 666} + response = client.get(f"{BASE_URL}/acteurs", params=params) + data = response.json() + + assert DisplayedActeur.objects.filter(statut=ActeurStatus.ACTIF).count() == 2 + print(data) + assert data["count"] == 1 + + @pytest.mark.django_db def test_get_acteurs_types(client): """Test the /acteurs/types endpoint""" @@ -117,23 +149,24 @@ def test_get_acteur_inacteur_returns_404(client): @pytest.mark.django_db -@patch("qfdmo.geo_api.fetch_epci_codes") -def test_autocomplete_epci(client, mock_get): +def test_autocomplete_epci(client, mocker): """Test the /autocomplete/configurateur endpoint""" # Mock setup - mock_response = mock_get.return_value - mock_response.status_code = 200 - mock_response.json.return_value = [ - {"code": "200043123", "nom": "CC Auray Quiberon Terre Atlantique"}, - {"code": "200043156", "nom": "CC du Pays Rethélois"}, + mock_formatted_epcis_list = mocker.patch("qfdmo.geo_api.formatted_epcis_list") + mock_formatted_epcis_list.return_value = [ + "200043123 - CC Auray Quiberon Terre Atlantique", + "200043156 - CC du Pays Rethélois", ] + # Simulate a successful response response = client.get( f"{BASE_URL}/autocomplete/configurateur", query_params={"query": "Quiberon"} ) + + # Assertions assert response.status_code == 200 data = response.json() assert isinstance(data, list) - assert len(data) == 5 + assert len(data) == 2 if data: assert "Quiberon" in data[0] diff --git a/pyproject.toml b/pyproject.toml index 1a498774e..b0cb8c3ce 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,6 +9,7 @@ filterwarnings = [ ] [tool.pyright] +include = ["unit_tests", "code", "qfdmo", "qfdmd", "integration_tests"] venvPath = "." venv = ".venv" From 6c7d5927da7d20a1f31f981928c6edb1ac886446 Mon Sep 17 00:00:00 2001 From: Fabien Le Frapper Date: Thu, 24 Apr 2025 10:37:46 +0200 Subject: [PATCH 10/12] finalize tests --- integration_tests/qfdmo/test_api.py | 21 +++++++++++++++++---- qfdmo/api.py | 1 + 2 files changed, 18 insertions(+), 4 deletions(-) diff --git a/integration_tests/qfdmo/test_api.py b/integration_tests/qfdmo/test_api.py index 7c7298018..19721cd39 100644 --- a/integration_tests/qfdmo/test_api.py +++ b/integration_tests/qfdmo/test_api.py @@ -1,9 +1,12 @@ +from urllib.parse import urlencode + import pytest from django.contrib.gis.geos import Point from django.core.management import call_command from qfdmo.models.acteur import ActeurService, ActeurStatus, DisplayedActeur from qfdmo.models.action import GroupeAction +from qfdmo.models.categorie_objet import SousCategorieObjet from unit_tests.qfdmo.acteur_factory import ( DisplayedActeurFactory, DisplayedPropositionServiceFactory, @@ -67,7 +70,7 @@ def test_get_acteurs(client, displayed_acteur): "longitude": 2.3, "rayon": 5, } - response = client.get(f"{BASE_URL}/acteurs", params=params) + response = client.get(f"{BASE_URL}/acteurs?{urlencode(params)}") assert response.status_code == 200 data = response.json() assert isinstance(data["items"], list) @@ -82,16 +85,26 @@ def test_get_acteurs(client, displayed_acteur): @pytest.mark.django_db def test_get_acteurs_sous_categorie_filter(client, displayed_acteur): """Test the /acteurs endpoint with sous categorie filter""" + acteur = DisplayedActeurFactory( + pk="UN-AUTRE-ACTEUR", location=Point(2.3, 48.86), statut=ActeurStatus.ACTIF + ) sous_categorie = SousCategorieObjetFactory(id=666) - proposition_service = DisplayedPropositionServiceFactory() + proposition_service = DisplayedPropositionServiceFactory(acteur=acteur) proposition_service.sous_categories.add(sous_categorie) params = {"latitude": 48.86, "longitude": 2.3, "rayon": 5, "sous_categories": 666} - response = client.get(f"{BASE_URL}/acteurs", params=params) + response = client.get(f"{BASE_URL}/acteurs?{urlencode(params)}") data = response.json() + assert SousCategorieObjet.objects.filter(id=666).exists() assert DisplayedActeur.objects.filter(statut=ActeurStatus.ACTIF).count() == 2 - print(data) + assert ( + DisplayedActeur.objects.filter( + statut=ActeurStatus.ACTIF, + proposition_services__sous_categories__id__in=[666], + ).count() + == 1 + ) assert data["count"] == 1 diff --git a/qfdmo/api.py b/qfdmo/api.py index 54ae8f2d2..d666f8043 100644 --- a/qfdmo/api.py +++ b/qfdmo/api.py @@ -192,6 +192,7 @@ def acteurs( qs = DisplayedActeur.objects.filter( statut=ActeurStatus.ACTIF, ).order_by("nom") + print(filters) qs = filters.filter(qs) if latitude and longitude: From 193f34ac78ddcdfcb20c928fc8ccff9a4eb0fdcb Mon Sep 17 00:00:00 2001 From: Fabien Le Frapper Date: Thu, 24 Apr 2025 12:23:41 +0200 Subject: [PATCH 11/12] Update qfdmo/api.py --- qfdmo/api.py | 1 - 1 file changed, 1 deletion(-) diff --git a/qfdmo/api.py b/qfdmo/api.py index d666f8043..54ae8f2d2 100644 --- a/qfdmo/api.py +++ b/qfdmo/api.py @@ -192,7 +192,6 @@ def acteurs( qs = DisplayedActeur.objects.filter( statut=ActeurStatus.ACTIF, ).order_by("nom") - print(filters) qs = filters.filter(qs) if latitude and longitude: From d6871b32922301aa38f9d0c78e3c1f3129c241b6 Mon Sep 17 00:00:00 2001 From: Fabien Le Frapper Date: Thu, 24 Apr 2025 22:00:17 +0200 Subject: [PATCH 12/12] Update pyproject.toml --- pyproject.toml | 1 - 1 file changed, 1 deletion(-) diff --git a/pyproject.toml b/pyproject.toml index b0cb8c3ce..1a498774e 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -9,7 +9,6 @@ filterwarnings = [ ] [tool.pyright] -include = ["unit_tests", "code", "qfdmo", "qfdmd", "integration_tests"] venvPath = "." venv = ".venv"