From 76c93ec035dd1a0f8d32de028f2d303f52e9cda8 Mon Sep 17 00:00:00 2001 From: Paul Schilling Date: Fri, 18 Oct 2024 13:00:42 +0200 Subject: [PATCH] [#2821] Implement provisional configuration for OpenKlant2 service + tests --- src/open_inwoner/openklant/services.py | 24 +++++++------ .../tests/test_openklant2_service.py | 35 ++++++++++++++++--- src/openklant2/client.py | 6 ++-- src/openklant2/models.py | 24 +++++++++++++ src/openklant2/tests/conftest.py | 16 +++++++-- src/openklant2/tests/helpers.py | 25 +++++++------ 6 files changed, 99 insertions(+), 31 deletions(-) create mode 100644 src/openklant2/models.py diff --git a/src/open_inwoner/openklant/services.py b/src/open_inwoner/openklant/services.py index c182e3eaa3..d30511d64b 100644 --- a/src/open_inwoner/openklant/services.py +++ b/src/open_inwoner/openklant/services.py @@ -15,6 +15,7 @@ from open_inwoner.openklant.clients import build_klanten_client from open_inwoner.utils.logentry import system_action from openklant2.client import OpenKlant2Client +from openklant2.models import OpenKlant2Config from openklant2.types.resources.digitaal_adres import DigitaalAdres from openklant2.types.resources.klant_contact import KlantContact from openklant2.types.resources.partij import Partij, PartijListParams @@ -144,19 +145,20 @@ def from_klantcontact_and_answer( class OpenKlant2Service: - + config: OpenKlant2Config client: OpenKlant2Client mijn_vragen_actor: uuid.UUID | None - MIJN_VRAGEN_KANAAL: str = "oip_mijn_vragen" def __init__( - self, client: OpenKlant2Client, mijn_vragen_actor: str | uuid.UUID | None = None + self, + config: OpenKlant2Config | None = None, + mijn_vragen_actor: str | uuid.UUID | None = None, ): - if not isinstance(client, OpenKlant2Client): - raise ValueError( - f"`client` must be an instance of {type(OpenKlant2Client)}" - ) - self.client = client + self.config = config or OpenKlant2Config.from_django_settings() + self.client = OpenKlant2Client( + api_url=self.config.api_url, + api_token=self.config.api_token, + ) if mijn_vragen_actor: self.mijn_vragen_actor = ( uuid.UUID(mijn_vragen_actor) @@ -466,7 +468,7 @@ def create_question( "inhoud": question, "onderwerp": subject, "taal": "nld", - "kanaal": self.MIJN_VRAGEN_KANAAL, + "kanaal": self.config.mijn_vragen_kanaal, "vertrouwelijk": False, "plaatsgevondenOp": timezone.now().isoformat(), } @@ -513,7 +515,7 @@ def create_answer( "inhoud": answer, "onderwerp": question_klantcontact["onderwerp"], "taal": "nld", - "kanaal": self.MIJN_VRAGEN_KANAAL, + "kanaal": self.config.mijn_vragen_kanaal, "vertrouwelijk": False, "plaatsgevondenOp": timezone.now().isoformat(), } @@ -555,7 +557,7 @@ def klantcontacten_for_partij(self, partij: Partij) -> Iterable[KlantContact]: "hadBetrokkenen", "hadBetrokkenen.wasPartij", ], - "kanaal": self.MIJN_VRAGEN_KANAAL, + "kanaal": self.config.mijn_vragen_kanaal, } ) diff --git a/src/open_inwoner/openklant/tests/test_openklant2_service.py b/src/open_inwoner/openklant/tests/test_openklant2_service.py index 3600787852..c254ef481a 100644 --- a/src/open_inwoner/openklant/tests/test_openklant2_service.py +++ b/src/open_inwoner/openklant/tests/test_openklant2_service.py @@ -9,6 +9,7 @@ from open_inwoner.openklant.services import OpenKlant2Question, OpenKlant2Service from open_inwoner.openklant.tests.helpers import Openklant2ServiceTestCase from openklant2.factories.partij import CreatePartijPersoonDataFactory +from openklant2.models import OpenKlant2Config from openklant2.types.resources.partij import PartijValidator @@ -16,7 +17,14 @@ class PartijGetOrCreateTestCase(Openklant2ServiceTestCase): def setUp(self): super().setUp() - self.service = OpenKlant2Service(self.openklant_client) + self.openklant2_config = OpenKlant2Config( + api_root="http://localhost:8338", + api_path="/klantinteracties/api/v1", + api_token="b2eb1da9861da88743d72a3fb4344288fe2cba44", + mijn_vragen_kanaal="oip_mijn_vragen", + mijn_vragen_organisatie_naam="Open Inwoner Platform", + ) + self.service = OpenKlant2Service(config=self.openklant2_config) self.user = UserFactory(first_name="John", last_name="Doe") def test_get_or_create_persoon(self): @@ -185,7 +193,14 @@ def test_get_or_create_organisatie_with_vestiging(self): class Openklant2ServiceTest(Openklant2ServiceTestCase): def setUp(self): super().setUp() - self.service = OpenKlant2Service(self.openklant_client) + self.openklant2_config = OpenKlant2Config( + api_root="http://localhost:8338", + api_path="/klantinteracties/api/v1", + api_token="b2eb1da9861da88743d72a3fb4344288fe2cba44", + mijn_vragen_kanaal="oip_mijn_vragen", + mijn_vragen_organisatie_naam="Open Inwoner Platform", + ) + self.service = OpenKlant2Service(config=self.openklant2_config) self.persoon = self.openklant_client.partij.create_persoon( data={ @@ -314,8 +329,18 @@ def setUp(self): "soortActor": "organisatorische_eenheid", } ) + + self.openklant2_config = OpenKlant2Config( + api_root="http://localhost:8338", + api_path="/klantinteracties/api/v1", + api_token="b2eb1da9861da88743d72a3fb4344288fe2cba44", + mijn_vragen_kanaal="oip_mijn_vragen", + mijn_vragen_organisatie_naam="Open Inwoner Platform", + ) + # self.service = OpenKlant2Service(config=self.openklant2_config) self.service = OpenKlant2Service( - self.openklant_client, mijn_vragen_actor=self.designated_actor["uuid"] + config=self.openklant2_config, + mijn_vragen_actor=self.designated_actor["uuid"], ) def test_designated_actor_is_required_to_create_question(self): @@ -350,7 +375,9 @@ def test_create_question(self): (betrokkene,) = self.service.client.betrokkene.list_iter() (taak,) = self.service.client.interne_taak.list_iter() - self.assertEqual(klantcontact["kanaal"], self.service.MIJN_VRAGEN_KANAAL) + self.assertEqual( + klantcontact["kanaal"], self.openklant2_config.mijn_vragen_kanaal + ) self.assertEqual(betrokkene["hadKlantcontact"]["uuid"], klantcontact["uuid"]) self.assertEqual(betrokkene["wasPartij"]["uuid"], self.een_persoon["uuid"]) self.assertEqual( diff --git a/src/openklant2/client.py b/src/openklant2/client.py index 5bf7e71092..efa6b5d183 100644 --- a/src/openklant2/client.py +++ b/src/openklant2/client.py @@ -14,10 +14,10 @@ class OpenKlant2Client: http_client: APIClient partij: PartijResource - def __init__(self, token: str, api_root: str): + def __init__(self, api_url: str, api_token: str): self.http_client = APIClient( - request_kwargs={"headers": {"Authorization": f"Token {token}"}}, - base_url=api_root, + request_kwargs={"headers": {"Authorization": f"Token {api_token}"}}, + base_url=api_url, ) self.partij = PartijResource(self.http_client) diff --git a/src/openklant2/models.py b/src/openklant2/models.py new file mode 100644 index 0000000000..5fa55f8d10 --- /dev/null +++ b/src/openklant2/models.py @@ -0,0 +1,24 @@ +from dataclasses import dataclass +from urllib.parse import urljoin + + +@dataclass +class OpenKlant2Config: + api_root: str + api_path: str + api_token: str + + # Question/Answer settings + mijn_vragen_kanaal: str # e.g. "oip_mijn_vragen" + mijn_vragen_organisatie_naam: str # e.g. "Open Inwoner Platform", + + @property + def api_url(self): + return urljoin(self.api_root, self.api_path) + + @classmethod + def from_django_settings(cls): + from django.conf import settings + + if config := getattr(settings, "OPENKLANT2_CONFIG", None): + return cls(**config) diff --git a/src/openklant2/tests/conftest.py b/src/openklant2/tests/conftest.py index 70ebb444cc..301841e629 100644 --- a/src/openklant2/tests/conftest.py +++ b/src/openklant2/tests/conftest.py @@ -1,5 +1,6 @@ import pytest +from openklant2.models import OpenKlant2Config from openklant2.tests.helpers import OpenKlantServiceManager @@ -12,8 +13,19 @@ def pytest_addoption(parser): ) +@pytest.fixture(scope="session") +def openklant2_config(): + return OpenKlant2Config( + api_root="http://localhost:8338", + api_path="/klantinteracties/api/v1", + api_token="b2eb1da9861da88743d72a3fb4344288fe2cba44", + mijn_vragen_kanaal="oip_mijn_vragen", + mijn_vragen_organisatie_naam="Open Inwoner Platform", + ) + + @pytest.fixture(scope="session", autouse=True) -def openklant_service_singleton(request): +def openklant_service_singleton(request, openklant2_config): # Depending on whether we're working with a live service or not, we either # spawn the service and yield the running service, or simply return a # regular instance for the purposes of using the client factory in the @@ -22,7 +34,7 @@ def openklant_service_singleton(request): # and tearing it down at completion of the run. # # The client fixture below, by cotrast, should reset the database state for each test. - service = OpenKlantServiceManager() + service = OpenKlantServiceManager(config=openklant2_config) if request.config.getoption("--with-openklant-service"): with service.live_service() as running_service: yield running_service diff --git a/src/openklant2/tests/helpers.py b/src/openklant2/tests/helpers.py index e0022cd500..1741278a06 100644 --- a/src/openklant2/tests/helpers.py +++ b/src/openklant2/tests/helpers.py @@ -4,11 +4,11 @@ import time from contextlib import contextmanager from pathlib import Path -from urllib.parse import urljoin import requests from openklant2.client import OpenKlant2Client +from openklant2.models import OpenKlant2Config BASE_DIR = Path(__file__).parent.parent.resolve() @@ -24,6 +24,9 @@ class OpenKlantServiceManager: _docker_compose_project_name: str = "openklant2-api-test" _docker_compose_path: Path = BASE_DIR / "docker-compose.yaml" + def __init__(self, config: OpenKlant2Config | None = None): + self.config = config or OpenKlant2Config.from_django_settings() + def _docker_compose( self, *args: str, @@ -142,17 +145,10 @@ def tearDown(self): self._service_teardown() self._in_server_context = False - @property - def api_root(self): - return urljoin( - self._api_root, - self._api_path, - ) - def client_factory(self): return OpenKlant2Client( - api_root=self.api_root, - token=self._api_token, + api_url=self.config.api_url, + api_token=self.config.api_token, ) def clean_state(self): @@ -226,7 +222,14 @@ def reset_db(self): @classmethod def setUpClass(cls): - cls._service = OpenKlantServiceManager() + openklant2_config = OpenKlant2Config( + api_root="http://localhost:8338", + api_path="/klantinteracties/api/v1", + api_token="b2eb1da9861da88743d72a3fb4344288fe2cba44", + mijn_vragen_kanaal="oip_mijn_vragen", + mijn_vragen_organisatie_naam="Open Inwoner Platform", + ) + cls._service = OpenKlantServiceManager(config=openklant2_config) if not cls.should_bypass_live_server(): cls._service.setUp()