Skip to content

Commit

Permalink
[#2821] Implement provisional configuration for OpenKlant2 service + …
Browse files Browse the repository at this point in the history
…tests
  • Loading branch information
pi-sigma committed Oct 18, 2024
1 parent 0ee4d7d commit 76c93ec
Show file tree
Hide file tree
Showing 6 changed files with 99 additions and 31 deletions.
24 changes: 13 additions & 11 deletions src/open_inwoner/openklant/services.py
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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)
Expand Down Expand Up @@ -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(),
}
Expand Down Expand Up @@ -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(),
}
Expand Down Expand Up @@ -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,
}
)

Expand Down
35 changes: 31 additions & 4 deletions src/open_inwoner/openklant/tests/test_openklant2_service.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,14 +9,22 @@
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


@tag("openklant2")
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):
Expand Down Expand Up @@ -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={
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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(
Expand Down
6 changes: 3 additions & 3 deletions src/openklant2/client.py
Original file line number Diff line number Diff line change
Expand Up @@ -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)
Expand Down
24 changes: 24 additions & 0 deletions src/openklant2/models.py
Original file line number Diff line number Diff line change
@@ -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)
16 changes: 14 additions & 2 deletions src/openklant2/tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import pytest

from openklant2.models import OpenKlant2Config
from openklant2.tests.helpers import OpenKlantServiceManager


Expand All @@ -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
Expand All @@ -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
Expand Down
25 changes: 14 additions & 11 deletions src/openklant2/tests/helpers.py
Original file line number Diff line number Diff line change
Expand Up @@ -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()

Expand All @@ -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,
Expand Down Expand Up @@ -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):
Expand Down Expand Up @@ -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()
Expand Down

0 comments on commit 76c93ec

Please sign in to comment.