From 7abac07be8db275c12254ed7b368130631bcdfcf Mon Sep 17 00:00:00 2001 From: Tim Van Campenhout Date: Thu, 4 May 2023 16:06:24 +0200 Subject: [PATCH] #175 exception handling + update crab --- crabpy_pyramid/__init__.py | 1 + crabpy_pyramid/renderers/adressenregister.py | 7 +- crabpy_pyramid/routes/adressenregister.py | 16 +- crabpy_pyramid/tests/test_functional.py | 439 ++++++++----------- crabpy_pyramid/views/adressenregister.py | 170 ++++--- crabpy_pyramid/views/exceptions.py | 27 ++ requirements.txt | 2 +- 7 files changed, 309 insertions(+), 353 deletions(-) create mode 100644 crabpy_pyramid/views/exceptions.py diff --git a/crabpy_pyramid/__init__.py b/crabpy_pyramid/__init__.py index 6c2e05e..8ce1a46 100644 --- a/crabpy_pyramid/__init__.py +++ b/crabpy_pyramid/__init__.py @@ -334,6 +334,7 @@ def includeme(config): config.add_request_method(get_adressenregister, 'adressenregister_gateway') config.include('crabpy_pyramid.routes.adressenregister') config.scan('crabpy_pyramid.views.adressenregister') + config.scan("crabpy_pyramid.views.exceptions") def main(global_config, **settings): diff --git a/crabpy_pyramid/renderers/adressenregister.py b/crabpy_pyramid/renderers/adressenregister.py index ace6a21..5cce078 100644 --- a/crabpy_pyramid/renderers/adressenregister.py +++ b/crabpy_pyramid/renderers/adressenregister.py @@ -1,4 +1,3 @@ -import crabpy import pycountry from crabpy.gateway import adressenregister from pyramid.renderers import JSON @@ -24,7 +23,7 @@ def list_provincie_adapter(obj, request): "niscode": obj.niscode, "naam": obj.naam, "gewest": { - "id": obj.gewest, + "id": obj.gewest_niscode, }, } @@ -48,7 +47,7 @@ def list_gemeente_adapter(obj, request): """ return { "niscode": obj.niscode, - "naam": obj.naam, + "naam": obj.naam(), "provincie": {"niscode": obj.provincie_niscode} } @@ -138,7 +137,7 @@ def item_provincie_adapter(obj, request): "niscode": obj.niscode, "naam": obj.naam, "gewest": { - "id": obj.gewest, + "niscode": obj.gewest_niscode, }, } diff --git a/crabpy_pyramid/routes/adressenregister.py b/crabpy_pyramid/routes/adressenregister.py index d6c341b..b826ef9 100644 --- a/crabpy_pyramid/routes/adressenregister.py +++ b/crabpy_pyramid/routes/adressenregister.py @@ -7,24 +7,24 @@ def includeme(config): ) crabpy_pyramid.add_route( config, - "adressenregister_get_gewest_by_id", - "/adressenregister/gewesten/{gewest_id}", + "adressenregister_get_gewest_by_niscode", + "/adressenregister/gewesten/{gewest_niscode}", ) crabpy_pyramid.add_route( config, "adressenregister_list_provincies", - "/adressenregister/gewesten/{gewest_id}/provincies", + "/adressenregister/gewesten/{gewest_niscode}/provincies", ) crabpy_pyramid.add_route( config, "adressenregister_get_provincie", - "/adressenregister/provincies/{provincie_id}", + "/adressenregister/provincies/{provincie_niscode}", ) crabpy_pyramid.add_route( config, "adressenregister_list_deelgemeenten", - "/adressenregister/gewesten/{gewest_id}/deelgemeenten", + "/adressenregister/gewesten/{gewest_niscode}/deelgemeenten", ) crabpy_pyramid.add_route( config, @@ -34,18 +34,18 @@ def includeme(config): crabpy_pyramid.add_route( config, "adressenregister_get_deelgemeente_by_id", - "/adressenregister/deelgemeenten/{deelgemeente_id}", + "/adressenregister/deelgemeenten/{deelgemeente_niscode}", ) crabpy_pyramid.add_route( config, "adressenregister_list_gemeenten_by_provincie", - "/adressenregister/provincies/{provincie_id}/gemeenten", + "/adressenregister/provincies/{provincie_niscode}/gemeenten", ) crabpy_pyramid.add_route( config, "list_gemeenten_adressenregister", - "/adressenregister/gewesten/{gewest_id}/gemeenten", + "/adressenregister/gewesten/{gewest_niscode}/gemeenten", ) crabpy_pyramid.add_route( diff --git a/crabpy_pyramid/tests/test_functional.py b/crabpy_pyramid/tests/test_functional.py index d02de0b..7b9ada9 100644 --- a/crabpy_pyramid/tests/test_functional.py +++ b/crabpy_pyramid/tests/test_functional.py @@ -1,9 +1,9 @@ # -*- coding: utf-8 -*- -''' +""" Functional tests. .. versionadded:: 0.1.0 -''' +""" import os import shutil import unittest @@ -17,8 +17,6 @@ from crabpy_pyramid import main from crabpy_pyramid.tests.fixtures.adressenregister import adres from crabpy_pyramid.tests.fixtures.adressenregister import adressen -from crabpy_pyramid.tests.fixtures.adressenregister import gemeente -from crabpy_pyramid.tests.fixtures.adressenregister import gemeenten from crabpy_pyramid.tests.fixtures.adressenregister import perceel from crabpy_pyramid.tests.fixtures.adressenregister import percelen from crabpy_pyramid.tests.fixtures.adressenregister import postinfo_1000 @@ -29,18 +27,19 @@ def as_bool(value): - ''' + """ Cast a textual value from a config file to a boolean. Will convert 'true', 'True', '1', 't', 'T' or 'Yes' to `True`. All other values are considered to be `False`. - ''' - return value in ['true', 'True', '1', 't', 'T', 'Yes'] + """ + return value in ["true", "True", "1", "t", "T", "Yes"] def run_integration_tests(section): from testconfig import config + try: - return as_bool(config[section]['run_integration_tests']) + return as_bool(config[section]["run_integration_tests"]) except KeyError: # pragma NO COVER return False @@ -76,10 +75,7 @@ def run_integration_tests(section): def setUpModule(): - shutil.rmtree( - os.path.join(os.path.dirname(__file__), 'dogpile_data'), - True - ) + shutil.rmtree(os.path.join(os.path.dirname(__file__), "dogpile_data"), True) class FunctionalTests(unittest.TestCase): @@ -96,322 +92,315 @@ def tearDown(self): @unittest.skipUnless( - run_integration_tests('capakey'), - 'No CAPAKEY Integration tests required' + run_integration_tests("capakey"), "No CAPAKEY Integration tests required" ) class CapakeyFunctionalTests(FunctionalTests): def test_list_gemeenten(self): - res = self.testapp.get('/capakey/gemeenten') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/gemeenten") + self.assertEqual("200 OK", res.status) def test_get_gemeente_by_id(self): - res = self.testapp.get('/capakey/gemeenten/11001') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/gemeenten/11001") + self.assertEqual("200 OK", res.status) def test_get_gemeente_by_unexisting_id(self): - res = self.testapp.get('/capakey/gemeenten/1100', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/capakey/gemeenten/1100", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_kadastrale_afdelingen_by_gemeente(self): - res = self.testapp.get('/capakey/gemeenten/11001/afdelingen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/gemeenten/11001/afdelingen") + self.assertEqual("200 OK", res.status) def test_list_kadastrale_afdelingen(self): - res = self.testapp.get('/capakey/afdelingen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/afdelingen") + self.assertEqual("200 OK", res.status) def test_get_kadastrale_afdeling_by_id(self): - res = self.testapp.get('/capakey/afdelingen/11001') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/afdelingen/11001") + self.assertEqual("200 OK", res.status) def test_get_kadastrale_afdeling_by_unexisting_id(self): - res = self.testapp.get('/capakey/afdelingen/99999', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/capakey/afdelingen/99999", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_secties_by_afdeling(self): - res = self.testapp.get('/capakey/afdelingen/11001/secties') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/afdelingen/11001/secties") + self.assertEqual("200 OK", res.status) def test_get_sectie_by_id_and_afdeling(self): - res = self.testapp.get('/capakey/afdelingen/11001/secties/B') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/afdelingen/11001/secties/B") + self.assertEqual("200 OK", res.status) def test_get_sectie_by_unexisting_id_and_afdeling(self): - res = self.testapp.get( - '/capakey/afdelingen/11001/secties/Z', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/capakey/afdelingen/11001/secties/Z", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_percelen_by_sectie(self): - res = self.testapp.get('/capakey/afdelingen/11001/secties/B/percelen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/afdelingen/11001/secties/B/percelen") + self.assertEqual("200 OK", res.status) def test_get_perceel_by_sectie_and_id(self): res = self.testapp.get( - '/capakey/afdelingen/11001/secties/B/percelen/0001/00S000') - self.assertEqual('200 OK', res.status) + "/capakey/afdelingen/11001/secties/B/percelen/0001/00S000" + ) + self.assertEqual("200 OK", res.status) def test_get_perceel_by_unexisting_sectie_and_id(self): res = self.testapp.get( - '/capakey/afdelingen/11001/secties/B/percelen/0000/00000', status=404) - self.assertEqual('404 Not Found', res.status) + "/capakey/afdelingen/11001/secties/B/percelen/0000/00000", status=404 + ) + self.assertEqual("404 Not Found", res.status) def test_get_perceel_by_capakey(self): - res = self.testapp.get('/capakey/percelen/11001B0001/00S000') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/percelen/11001B0001/00S000") + self.assertEqual("200 OK", res.status) def test_get_perceel_by_unexisting_capakey(self): - res = self.testapp.get( - '/capakey/percelen/99009X0009/00X000', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/capakey/percelen/99009X0009/00X000", status=404) + self.assertEqual("404 Not Found", res.status) def test_get_perceel_by_percid(self): - res = self.testapp.get('/capakey/percelen/11001_B_0001_S_000_00') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/capakey/percelen/11001_B_0001_S_000_00") + self.assertEqual("200 OK", res.status) def test_get_perceel_by_unexisting_percid(self): - res = self.testapp.get( - '/capakey/percelen/99009_X_0009_X_000_00', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/capakey/percelen/99009_X_0009_X_000_00", status=404) + self.assertEqual("404 Not Found", res.status) @unittest.skipUnless( - run_integration_tests('crab'), - 'No CRAB Integration tests required' + run_integration_tests("crab"), "No CRAB Integration tests required" ) class CrabFunctionalTests(FunctionalTests): def test_list_gewesten(self): - res = self.testapp.get('/crab/gewesten') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gewesten") + self.assertEqual("200 OK", res.status) def test_get_gewest_by_id(self): - res = self.testapp.get('/crab/gewesten/2') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gewesten/2") + self.assertEqual("200 OK", res.status) def test_get_gewest_by_unexisting_id(self): - res = self.testapp.get('/crab/gewesten/0', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/gewesten/0", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_provincies(self): - res = self.testapp.get('/crab/gewesten/2/provincies') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gewesten/2/provincies") + self.assertEqual("200 OK", res.status) def test_get_provincie_by_id(self): - res = self.testapp.get('/crab/provincies/10000') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/provincies/10000") + self.assertEqual("200 OK", res.status) def test_get_provincie_by_unexisting_id(self): - res = self.testapp.get('/crab/provincies/00000', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/provincies/00000", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_gemeenten_by_provincie(self): - res = self.testapp.get('/crab/provincies/10000/gemeenten') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/provincies/10000/gemeenten") + self.assertEqual("200 OK", res.status) def test_list_gemeenten_crab(self): - res = self.testapp.get('/crab/gewesten/2/gemeenten') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gewesten/2/gemeenten") + self.assertEqual("200 OK", res.status) def test_get_gemeente_crab_niscode(self): - res = self.testapp.get('/crab/gemeenten/11001') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gemeenten/11001") + self.assertEqual("200 OK", res.status) def test_get_gemeente_crab_unexisting_niscode(self): - res = self.testapp.get('/crab/gemeenten/00000', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/gemeenten/00000", status=404) + self.assertEqual("404 Not Found", res.status) def test_get_gemeente_crab_id(self): - res = self.testapp.get('/crab/gemeenten/1') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gemeenten/1") + self.assertEqual("200 OK", res.status) def test_get_gemeente_crab_unexisting_id(self): - res = self.testapp.get('/crab/gemeenten/0', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/gemeenten/0", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_deelgemeenten(self): - res = self.testapp.get('/crab/gewesten/2/deelgemeenten') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gewesten/2/deelgemeenten") + self.assertEqual("200 OK", res.status) def test_list_deelgemeenten_wrong_gewest(self): - res = self.testapp.get('/crab/gewesten/1/deelgemeenten', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/gewesten/1/deelgemeenten", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_deelgemeenten_by_gemeente(self): - res = self.testapp.get('/crab/gemeenten/11001/deelgemeenten') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gemeenten/11001/deelgemeenten") + self.assertEqual("200 OK", res.status) def test_list_deelgemeenten_by_unexisting_gemeente(self): - res = self.testapp.get( - '/crab/gemeenten/99999/deelgemeenten', status=404) - self.assertEqual('404 Not Found', res.status) - res = self.testapp.get( - '/crab/gemeenten/9999/deelgemeenten', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/gemeenten/99999/deelgemeenten", status=404) + self.assertEqual("404 Not Found", res.status) + res = self.testapp.get("/crab/gemeenten/9999/deelgemeenten", status=404) + self.assertEqual("404 Not Found", res.status) def test_get_deelgemeente_by_id(self): - res = self.testapp.get('/crab/deelgemeenten/45062A') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/deelgemeenten/45062A") + self.assertEqual("200 OK", res.status) def test_list_straten(self): - res = self.testapp.get('/crab/gemeenten/11001/straten') - self.assertIn('naam', res.json[0]) - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gemeenten/11001/straten") + self.assertIn("naam", res.json[0]) + self.assertEqual("200 OK", res.status) def test_get_straat_by_id(self): - res = self.testapp.get('/crab/straten/1') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/straten/1") + self.assertEqual("200 OK", res.status) def test_get_straat_by_unexisting_id(self): - res = self.testapp.get('/crab/straten/0', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/straten/0", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_huisnummers(self): - res = self.testapp.get('/crab/straten/1/huisnummers') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/straten/1/huisnummers") + self.assertEqual("200 OK", res.status) def test_sort_huisnummers(self): - res = self.testapp.get('/crab/straten/1/huisnummers?sort=2') - self.assertEqual('200 OK', res.status) - nummers = [int(item['label']) for item in res.json] + res = self.testapp.get("/crab/straten/1/huisnummers?sort=2") + self.assertEqual("200 OK", res.status) + nummers = [int(item["label"]) for item in res.json] ascending = sorted(nummers) self.assertEqual(nummers, ascending) def test_get_huisnummer_by_straat_and_label(self): - res = self.testapp.get('/crab/straten/1/huisnummers/3') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/straten/1/huisnummers/3") + self.assertEqual("200 OK", res.status) def test_get_huisnummer_by_unexisting_straat_and_label(self): - res = self.testapp.get('/crab/straten/1/huisnummers/0', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/straten/1/huisnummers/0", status=404) + self.assertEqual("404 Not Found", res.status) def test_get_huisnummer_by_id(self): - res = self.testapp.get('/crab/huisnummers/1') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/huisnummers/1") + self.assertEqual("200 OK", res.status) def test_get_huisnummer_by_unexisting_id(self): - res = self.testapp.get('/crab/huisnummers/0', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/huisnummers/0", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_percelen(self): - res = self.testapp.get('/crab/huisnummers/1/percelen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/huisnummers/1/percelen") + self.assertEqual("200 OK", res.status) def test_get_perceel_by_id(self): - res = self.testapp.get('/crab/percelen/31433D0011/00T016') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/percelen/31433D0011/00T016") + self.assertEqual("200 OK", res.status) def test_get_perceel_by_unexisting_id(self): - res = self.testapp.get('/crab/percelen/31433D0011/000000', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/percelen/31433D0011/000000", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_huisnummers_by_perceel(self): - res = self.testapp.get('/crab/percelen/31433D0011/00T016/huisnummers') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/percelen/31433D0011/00T016/huisnummers") + self.assertEqual("200 OK", res.status) def test_list_huisnummers_by_unexisting_perceel(self): res = self.testapp.get( - '/crab/percelen/31433D0011/000000/huisnummers', status=404) - self.assertEqual('404 Not Found', res.status) + "/crab/percelen/31433D0011/000000/huisnummers", status=404 + ) + self.assertEqual("404 Not Found", res.status) def test_list_gebouwen(self): - res = self.testapp.get('/crab/huisnummers/1/gebouwen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/huisnummers/1/gebouwen") + self.assertEqual("200 OK", res.status) def test_get_gebouw_by_id(self): - res = self.testapp.get('/crab/gebouwen/1538575') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gebouwen/1538575") + self.assertEqual("200 OK", res.status) def test_get_gebouw_by_unexisting_id(self): - res = self.testapp.get('/crab/gebouwen/99999999', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/gebouwen/99999999", status=404) + self.assertEqual("404 Not Found", res.status) def test_get_wegobject(self): - res = self.testapp.get('/crab/wegobjecten/53694755') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/wegobjecten/53694755") + self.assertEqual("200 OK", res.status) def test_get_unexisting_wegobject(self): - res = self.testapp.get('/crab/wegobjecten/00000000', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/wegobjecten/00000000", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_subadressen(self): - res = self.testapp.get('/crab/huisnummers/129462/subadressen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/huisnummers/129462/subadressen") + self.assertEqual("200 OK", res.status) def test_get_subadressen_by_id(self): - res = self.testapp.get('/crab/subadressen/1120934') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/subadressen/1120934") + self.assertEqual("200 OK", res.status) def test_get_subadressen_by_unexisting_id(self): - res = self.testapp.get('/crab/subadressen/0000000', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/subadressen/0000000", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_postkantons_by_gemeente(self): - res = self.testapp.get('/crab/gemeenten/90/postkantons') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/gemeenten/90/postkantons") + self.assertEqual("200 OK", res.status) def test_list_adresposities_by_huisnummer(self): - res = self.testapp.get('/crab/huisnummers/145/adresposities') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/huisnummers/145/adresposities") + self.assertEqual("200 OK", res.status) def test_list_adresposities_by_subadres(self): - res = self.testapp.get('/crab/subadressen/145/adresposities') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/subadressen/145/adresposities") + self.assertEqual("200 OK", res.status) def test_get_adrespositie_by_id(self): - res = self.testapp.get('/crab/adresposities/137') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/adresposities/137") + self.assertEqual("200 OK", res.status) def test_get_adrespositie_by_unexisting_id(self): - res = self.testapp.get('/crab/adresposities/0', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/adresposities/0", status=404) + self.assertEqual("404 Not Found", res.status) def test_list_landen(self): - res = self.testapp.get('/crab/landen') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/landen") + self.assertEqual("200 OK", res.status) def test_get_land_by_id(self): - res = self.testapp.get('/crab/landen/BE') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/landen/BE") + self.assertEqual("200 OK", res.status) def test_get_land_by_unexisting_id(self): - res = self.testapp.get('/crab/landen/MORDOR', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/landen/MORDOR", status=404) + self.assertEqual("404 Not Found", res.status) def test_get_postkanton_by_huisnummer(self): - res = self.testapp.get('/crab/huisnummers/5/postkanton') - self.assertEqual('200 OK', res.status) + res = self.testapp.get("/crab/huisnummers/5/postkanton") + self.assertEqual("200 OK", res.status) def test_get_postkanton_by_huisnummer_unexisting(self): - res = self.testapp.get( - '/crab/huisnummers/99999999/postkanton', status=404) - self.assertEqual('404 Not Found', res.status) + res = self.testapp.get("/crab/huisnummers/99999999/postkanton", status=404) + self.assertEqual("404 Not Found", res.status) @unittest.skipUnless( - run_integration_tests('crab'), - 'No CRAB Integration tests required' + run_integration_tests("crab"), "No CRAB Integration tests required" ) class HttpCachingFunctionalTests(FunctionalTests): def test_list_gewesten(self): - res = self.testapp.get('/crab/gewesten') - self.assertEqual('200 OK', res.status) - self.assertIn('ETag', res.headers) + res = self.testapp.get("/crab/gewesten") + self.assertEqual("200 OK", res.status) + self.assertIn("ETag", res.headers) def test_http_304_res(self): - res = self.testapp.get('/crab/gewesten') - self.assertEqual('200 OK', res.status) - etag = res.headers['Etag'] - res2 = self.testapp.get( - '/crab/gewesten', headers={'If-None-Match': etag}) - self.assertEqual('304 Not Modified', res2.status) + res = self.testapp.get("/crab/gewesten") + self.assertEqual("200 OK", res.status) + etag = res.headers["Etag"] + res2 = self.testapp.get("/crab/gewesten", headers={"If-None-Match": etag}) + self.assertEqual("304 Not Modified", res2.status) def test_list_gewesten_not_cached(self): - crabpy_pyramid.GENERATE_ETAG_ROUTE_NAMES.remove('list_gewesten') + crabpy_pyramid.GENERATE_ETAG_ROUTE_NAMES.remove("list_gewesten") try: - res = self.testapp.get('/crab/gewesten') - self.assertEqual('200 OK', res.status) - self.assertNotIn('ETag', res.headers) + res = self.testapp.get("/crab/gewesten") + self.assertEqual("200 OK", res.status) + self.assertNotIn("ETag", res.headers) finally: - crabpy_pyramid.GENERATE_ETAG_ROUTE_NAMES.add('list_gewesten') + crabpy_pyramid.GENERATE_ETAG_ROUTE_NAMES.add("list_gewesten") class AdressenRegisterFunctionalTests(FunctionalTests): @@ -421,14 +410,14 @@ def test_list_gewesten(self): self.assertCountEqual( res.json, [ - {"id": 1, "niscode": "4000", "naam": "Brussels Hoofdstedelijk Gewest"}, + {"id": 1, "niscode": "4000", "naam": "Brussels Hoofdstedelijk Gewest"}, {"id": 2, "niscode": "2000", "naam": "Vlaams Gewest"}, {"id": 3, "niscode": "3000", "naam": "Waals Gewest"}, ], ) - def test_get_gewest_by_id(self): - res = self.testapp.get("/adressenregister/gewesten/2") + def test_get_gewest_by_niscode(self): + res = self.testapp.get("/adressenregister/gewesten/2000") self.assertEqual("200 OK", res.status) self.assertDictEqual( res.json, @@ -437,6 +426,7 @@ def test_get_gewest_by_id(self): "centroid": [138165.09, 189297.53], "id": 2, "naam": "Vlaams Gewest", + "niscode": "2000", }, ) @@ -445,7 +435,7 @@ def test_get_gewest_by_unexisting_id(self): self.assertEqual("404 Not Found", res.status) def test_list_provincies(self): - res = self.testapp.get("/adressenregister/gewesten/2/provincies") + res = self.testapp.get("/adressenregister/gewesten/2000/provincies") self.assertEqual("200 OK", res.status) self.assertEqual(5, len(res.json)) @@ -453,7 +443,8 @@ def test_get_provincie_by_id(self): res = self.testapp.get("/adressenregister/provincies/10000") self.assertEqual("200 OK", res.status) self.assertDictEqual( - {"gewest": {"id": 2}, "naam": "Antwerpen", "niscode": "10000"}, res.json + {"gewest": {'niscode': '2000'}, "naam": "Antwerpen", "niscode": "10000"}, + res.json ) def test_get_provincie_by_unexisting_id(self): @@ -461,7 +452,7 @@ def test_get_provincie_by_unexisting_id(self): self.assertEqual("404 Not Found", res.status) def test_list_deelgemeenten(self): - res = self.testapp.get("/adressenregister/gewesten/2/deelgemeenten") + res = self.testapp.get("/adressenregister/gewesten/2000/deelgemeenten") self.assertEqual("200 OK", res.status) def test_list_deelgemeenten_wrong_gewest(self): @@ -483,96 +474,47 @@ def test_list_deelgemeenten_by_unexisting_gemeente(self): self.assertEqual("404 Not Found", res.status) def test_list_gemeenten_by_provincie(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - json=gemeenten, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten?limit=500", - ) - res = self.testapp.get("/adressenregister/provincies/10000/gemeenten") + res = self.testapp.get("/adressenregister/provincies/10000/gemeenten") self.assertEqual("200 OK", res.status) - self.assertCountEqual( - res.json, - [ - { - "niscode": "11001", - "naam": "Aartselaar", - "uri": "https://data.vlaanderen.be/id/gemeente/11001", - "provincie": {"niscode": "10000"}, - } - ], + self.assertEqual(len(res.json), 69) + self.assertDictEqual( + {'naam': 'Aartselaar', 'niscode': '11001', 'provincie': {'niscode': '10000'}}, + res.json[0], ) def test_list_gemeenten_by_provincie_404(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - status=404, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten?limit=500", - ) - res = self.testapp.get( - "/adressenregister/provincies/10000/gemeenten", status=404 - ) + res = self.testapp.get( + "/adressenregister/provincies/100000/gemeenten", status=404 + ) self.assertEqual("404 Not Found", res.status) def test_list_gemeenten_adressenregister(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - json=gemeenten, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten?limit=500", - ) - res = self.testapp.get("/adressenregister/gewesten/2/gemeenten") + res = self.testapp.get("/adressenregister/gewesten/2000/gemeenten") self.assertEqual("200 OK", res.status) def test_list_gemeenten_adressenregister_404(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - status=404, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten?limit=500", - ) - res = self.testapp.get("/adressenregister/gewesten/2/gemeenten", status=404) + res = self.testapp.get("/adressenregister/gewesten/20000/gemeenten", status=404) self.assertEqual("404 Not Found", res.status) def test_get_gemeente_adresregister_niscode(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - json=gemeente, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten/11001", - ) - res = self.testapp.get("/adressenregister/gemeenten/11001") + res = self.testapp.get("/adressenregister/gemeenten/11001") self.assertEqual("200 OK", res.status) self.assertDictEqual( { + "gewest": {"niscode": "2000"}, "naam": "Aartselaar", "niscode": "11001", - "status": "inGebruik", - "taal": "nl", - "uri": "https://data.vlaanderen.be/id/gemeente/11001", + "provincie": {"niscode": "10000"}, }, res.json, ) def test_get_gemeente_crab_unexisting_niscode(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten/00000", - status=404, - ) - res = self.testapp.get("/adressenregister/gemeenten/00000", status=404) + res = self.testapp.get("/adressenregister/gemeenten/00000", status=404, ) self.assertEqual("404 Not Found", res.status) def test_list_straten(self): with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten/11001", - json=gemeente, - status=200, - ) rsps.add( method=rsps.GET, url="https://api.basisregisters.vlaanderen.be/v2/straatnamen?nisCode=11001&limit=500", @@ -600,15 +542,7 @@ def test_list_straten(self): self.assertEqual("200 OK", res.status) def test_list_straten_404(self): - with responses.RequestsMock() as rsps: - rsps.add( - method=rsps.GET, - url="https://api.basisregisters.vlaanderen.be/v2/gemeenten/11001", - status=404, - ) - res = self.testapp.get( - "/adressenregister/gemeenten/11001/straten", status=404 - ) + res = self.testapp.get("/adressenregister/gemeenten/110001/straten", status=404) self.assertEqual("404 Not Found", res.status) def test_get_straat_by_id(self): @@ -921,6 +855,7 @@ def test_adresregister_get_postinfo_by_postcode_404(self): rsps.add( method=rsps.GET, url="https://api.basisregisters.vlaanderen.be/v2/postinfo/1000", + headers={'accept': 'application/json'}, status=404, ) res = self.testapp.get("/adressenregister/postinfo/1000", status=404) diff --git a/crabpy_pyramid/views/adressenregister.py b/crabpy_pyramid/views/adressenregister.py index f39776d..2213683 100644 --- a/crabpy_pyramid/views/adressenregister.py +++ b/crabpy_pyramid/views/adressenregister.py @@ -2,7 +2,7 @@ import pycountry from crabpy.client import AdressenRegisterClientException -from crabpy.gateway.exception import GatewayResourceNotFoundException +from pyramid.httpexceptions import HTTPBadRequest from pyramid.httpexceptions import HTTPNotFound from pyramid.view import view_config @@ -12,6 +12,23 @@ log = logging.getLogger(__name__) +def handle_gateway_response(gateway_method, *args, **kwargs): + try: + result = gateway_method(*args, **kwargs) + if not result: + raise HTTPNotFound() + return result + except AdressenRegisterClientException as ae: + cause = ae.__cause__ + if hasattr(cause, "response"): + status_code = cause.response.status_code + if status_code == 404: + raise HTTPNotFound() + if status_code == 400: + detail = getattr(cause.response, "text", "") + raise HTTPBadRequest(detail=detail) + + @view_config( route_name="adressenregister_list_gewesten", renderer="adresreg_listjson", @@ -25,18 +42,15 @@ def list_gewesten(request): @view_config( - route_name="adressenregister_get_gewest_by_id", + route_name="adressenregister_get_gewest_by_niscode", renderer="adresreg_itemjson", accept="application/json", ) -def get_gewest_by_id(request): +def get_gewest_by_niscode(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() - gewest_id = int(request.matchdict.get("gewest_id")) - try: - return Gateway.get_gewest_by_id(gewest_id) - except GatewayResourceNotFoundException: - return HTTPNotFound() + gewest_niscode = request.matchdict.get("gewest_niscode") + return handle_gateway_response(Gateway.get_gewest_by_niscode, gewest_niscode) @view_config( @@ -47,8 +61,8 @@ def get_gewest_by_id(request): def list_provincies(request): request = set_http_caching(request, "adressenregister", "permanent") Gateway = request.adressenregister_gateway() - gewest_id = int(request.matchdict.get("gewest_id")) - provincies = Gateway.list_provincies(gewest_id) + gewest_niscode = request.matchdict.get("gewest_niscode") + provincies = handle_gateway_response(Gateway.list_provincies, gewest_niscode) return range_return(request, provincies) @@ -60,12 +74,9 @@ def list_provincies(request): def get_provincie(request): request = set_http_caching(request, "adressenregister", "permanent") Gateway = request.adressenregister_gateway() - provincie_id = int(request.matchdict.get("provincie_id")) - provincie = Gateway.get_provincie_by_id(provincie_id) - if provincie: - return provincie - else: - return HTTPNotFound() + provincie_niscode = request.matchdict.get("provincie_niscode") + + return handle_gateway_response(Gateway.get_provincie_by_niscode, provincie_niscode) @view_config( @@ -76,10 +87,11 @@ def get_provincie(request): def list_deelgemeenten(request): request = set_http_caching(request, "adressenregister", "permanent") Gateway = request.adressenregister_gateway() - gewest_id = int(request.matchdict.get("gewest_id")) - if gewest_id != 2: + gewest_niscode = request.matchdict.get("gewest_niscode") + if gewest_niscode != "2000": return HTTPNotFound() - deelgemeenten = Gateway.list_deelgemeenten(gewest_id) + deelgemeenten = handle_gateway_response(Gateway.list_deelgemeenten, gewest_niscode) + return range_return(request, deelgemeenten) @@ -92,11 +104,9 @@ def list_deelgemeenten_by_gemeente(request): request = set_http_caching(request, "adressenregister", "permanent") Gateway = request.adressenregister_gateway() gemeente_id = request.matchdict.get("niscode") - try: - gemeente = Gateway.get_gemeente_by_niscode(gemeente_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + gemeente = handle_gateway_response(Gateway.get_gemeente_by_niscode, gemeente_id) deelgemeenten = Gateway.list_deelgemeenten_by_gemeente(gemeente) + return range_return(request, deelgemeenten) @@ -108,11 +118,9 @@ def list_deelgemeenten_by_gemeente(request): def get_deelgemeente_by_id(request): request = set_http_caching(request, "adressenregister", "permanent") Gateway = request.adressenregister_gateway() - deelgemeente_id = request.matchdict.get("deelgemeente_id") - try: - return Gateway.get_deelgemeente_by_id(deelgemeente_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + deelgemeente_niscode = request.matchdict.get("deelgemeente_niscode") + + return handle_gateway_response(Gateway.get_deelgemeente_by_id, deelgemeente_niscode) @view_config( @@ -123,11 +131,11 @@ def get_deelgemeente_by_id(request): def list_gemeenten_by_provincie(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() - provincie_id = int(request.matchdict.get("provincie_id")) - try: - gemeenten = Gateway.list_gemeenten_by_provincie(provincie_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + provincie_id = request.matchdict.get("provincie_niscode") + gemeenten = handle_gateway_response( + Gateway.list_gemeenten_by_provincie, provincie_id + ) + return range_return(request, gemeenten) @@ -139,11 +147,9 @@ def list_gemeenten_by_provincie(request): def list_gemeenten_adressenregister(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() - gewest_id = request.matchdict.get("gewest_id") - try: - gemeenten = Gateway.list_gemeenten(gewest_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + gewest_niscode = request.matchdict.get("gewest_niscode") + gemeenten = handle_gateway_response(Gateway.list_gemeenten, gewest_niscode) + return range_return(request, gemeenten) @@ -155,11 +161,9 @@ def list_gemeenten_adressenregister(request): def get_gemeente_adressenregister(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() - gemeente_id = request.matchdict.get("niscode") - try: - return Gateway.get_gemeente_by_niscode(gemeente_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + gemeente_niscode = request.matchdict.get("niscode") + + return handle_gateway_response(Gateway.get_gemeente_by_niscode, gemeente_niscode) @view_config( @@ -170,11 +174,9 @@ def get_gemeente_adressenregister(request): def list_straten(request): request = set_http_caching(request, "adressenregister", "short") Gateway = request.adressenregister_gateway() - gemeente_id = request.matchdict.get("niscode") - try: - straten = Gateway.list_straten(gemeente_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + gemeente_niscode = request.matchdict.get("niscode") + straten = handle_gateway_response(Gateway.list_straten, gemeente_niscode) + return range_return(request, straten) @@ -187,10 +189,8 @@ def get_straat_by_id(request): request = set_http_caching(request, "adressenregister", "short") Gateway = request.adressenregister_gateway() straat_id = request.matchdict.get("straat_id") - try: - return Gateway.get_straat_by_id(straat_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + + return handle_gateway_response(Gateway.get_straat_by_id, straat_id) @view_config( @@ -202,10 +202,10 @@ def list_adressen_by_straat(request): request = set_http_caching(request, "adressenregister", "short") Gateway = request.adressenregister_gateway() straat_id = request.matchdict.get("straat_id") - try: - straten = Gateway.list_adressen_with_params(straatnaamObjectId=straat_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + straten = handle_gateway_response( + Gateway.list_adressen_with_params, straatnaamObjectId=straat_id + ) + return range_return(request, straten) @@ -219,12 +219,12 @@ def adressenregister_get_adres_by_straat_huisnummer(request): Gateway = request.adressenregister_gateway() straat_id = request.matchdict.get("straat_id") huisnummer = request.matchdict.get("huisnummer") - try: - adressen = Gateway.list_adressen_with_params( - straatnaamObjectId=straat_id, huisnummer=huisnummer - ) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + adressen = handle_gateway_response( + Gateway.list_adressen_with_params, + straatnaamObjectId=straat_id, + huisnummer=huisnummer, + ) + return range_return(request, adressen) @@ -239,12 +239,13 @@ def adressenregister_get_adres_by_straat_huisnummer_busnummer(request): straat_id = request.matchdict.get("straat_id") huisnummer = request.matchdict.get("huisnummer") busnummer = request.matchdict.get("busnummer") - try: - adressen = Gateway.list_adressen_with_params( - straatnaamObjectId=straat_id, huisnummer=huisnummer, busnummer=busnummer - ) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + adressen = handle_gateway_response( + Gateway.list_adressen_with_params, + straatnaamObjectId=straat_id, + huisnummer=huisnummer, + busnummer=busnummer, + ) + return range_return(request, adressen) @@ -257,10 +258,8 @@ def adressenregister_get_adres_by_id(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() adres_id = request.matchdict.get("adres_id") - try: - return Gateway.get_adres_by_id(adres_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + + return handle_gateway_response(Gateway.get_adres_by_id, adres_id) @view_config( @@ -272,10 +271,10 @@ def adressenregister_list_percelen_by_adres(request): request = set_http_caching(request, "adressenregister", "short") Gateway = request.adressenregister_gateway() adres_id = request.matchdict.get("adres_id") - try: - adressen = Gateway.list_percelen_with_params(adresObjectId=adres_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + adressen = handle_gateway_response( + Gateway.list_percelen_with_params, adresObjectId=adres_id + ) + return range_return(request, adressen) @@ -288,10 +287,7 @@ def adressenregister_get_perceel_by_id(request): request = set_http_caching(request, "adressenregister", "short") Gateway = request.adressenregister_gateway() perceel_id = request.matchdict.get("perceel_id") - try: - return Gateway.get_perceel_by_id(perceel_id=perceel_id) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + return handle_gateway_response(Gateway.get_perceel_by_id, perceel_id=perceel_id) @view_config( @@ -303,10 +299,10 @@ def adressenregister_list_postinfo_by_gemeente(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() gemeente_naam = request.matchdict.get("gemeente_naam") - try: - adressen = Gateway.get_postinfo_by_gemeentenaam(gemeente_naam) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + adressen = handle_gateway_response( + Gateway.get_postinfo_by_gemeentenaam, gemeente_naam + ) + return range_return(request, adressen) @@ -319,10 +315,8 @@ def adressenregister_get_postinfo_by_postcode(request): request = set_http_caching(request, "adressenregister", "long") Gateway = request.adressenregister_gateway() postcode = request.matchdict.get("postcode") - try: - return Gateway.get_postinfo_by_id(postcode) - except (GatewayResourceNotFoundException, AdressenRegisterClientException): - return HTTPNotFound() + + return handle_gateway_response(Gateway.get_postinfo_by_id, postcode) @view_config( diff --git a/crabpy_pyramid/views/exceptions.py b/crabpy_pyramid/views/exceptions.py new file mode 100644 index 0000000..d222922 --- /dev/null +++ b/crabpy_pyramid/views/exceptions.py @@ -0,0 +1,27 @@ +import logging +import sys + +from crabpy.client import AdressenRegisterClientException +from pyramid.view import view_config + +LOGGER = logging.getLogger(__name__) + +@view_config( + context=AdressenRegisterClientException, + renderer="json", + accept="application/json" +) +def internal_server_error(exception, request): + LOGGER.exception(exception) + original_exception = exception.__cause__ + request.response.status_int = 500 + errors = [str(original_exception)] + if hasattr(original_exception, "response"): + if hasattr(original_exception.response, "text"): + errors.append(original_exception.response.text) + + return { + "message": "Er ging iets fout in de vraag naar adressenregister API.", + "Errors": errors + + } diff --git a/requirements.txt b/requirements.txt index 49ba1bd..b458566 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,5 +1,5 @@ # Tested and approved with these versions pyramid==2.0.0 -crabpy==1.1.0 +crabpy==1.2.1 pycountry==18.12.8 ; python_version < '3.0' pycountry==22.3.5 ; python_version >= '3.4'