From 6587cc6e0605bba0205b104bbebbb58b43ec6c48 Mon Sep 17 00:00:00 2001 From: JunsongDu Date: Tue, 14 Jan 2025 10:28:55 +0100 Subject: [PATCH 1/5] feat: add test for validate url composition --- tests/clients/test_ngsi_ld_cb.py | 24 ++++++++++++++++++++++++ tests/clients/test_ngsi_v2_cb.py | 23 ++++++++++++++++++++++- 2 files changed, 46 insertions(+), 1 deletion(-) diff --git a/tests/clients/test_ngsi_ld_cb.py b/tests/clients/test_ngsi_ld_cb.py index f6bc3341..099eb777 100644 --- a/tests/clients/test_ngsi_ld_cb.py +++ b/tests/clients/test_ngsi_ld_cb.py @@ -4,10 +4,15 @@ import unittest import logging +from urllib.parse import urljoin + import pyld +from pydantic import AnyHttpUrl from requests import RequestException, Session from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry + +from filip.clients.base_http_client import NgsiURLVersion from filip.clients.ngsi_ld.cb import ContextBrokerLDClient from filip.models.base import FiwareLDHeader, core_context from filip.models.ngsi_ld.context import ( @@ -95,6 +100,25 @@ def test_not_existing_tenant(self): entities = client.get_entity_list() self.assertEqual(len(entities), 0) + def test_url_composition_ld(self): + """ + Test URL composition for ngsi-ld context broker client + """ + user_input_urls = { + "http://example.org/orion/": "http://example.org/orion/ngsi-ld/v1/entities", + "http://example.org/orion": "http://example.org/orion/ngsi-ld/v1/entities", + "http://123.0.0.0:1026": "http://123.0.0.0:1026/ngsi-ld/v1/entities", + "http://123.0.0.0:1026/": "http://123.0.0.0:1026/ngsi-ld/v1/entities", + "http://123.0.0.0/orion": "http://123.0.0.0/orion/ngsi-ld/v1/entities", + "http://123.0.0.0/orion/": "http://123.0.0.0/orion/ngsi-ld/v1/entities", + } + for url in user_input_urls: + url_correct = AnyHttpUrl(user_input_urls[url]) + url_filip = AnyHttpUrl( + urljoin(url, f"{NgsiURLVersion.ld_url.value}/entities") + ) + self.assertEqual(url_correct, url_filip) + def test_get_entities_pagination(self): """ Test pagination of get entities diff --git a/tests/clients/test_ngsi_v2_cb.py b/tests/clients/test_ngsi_v2_cb.py index d967ae85..7aa6ea97 100644 --- a/tests/clients/test_ngsi_v2_cb.py +++ b/tests/clients/test_ngsi_v2_cb.py @@ -12,9 +12,11 @@ import paho.mqtt.client as mqtt from datetime import datetime, timedelta -from urllib.parse import urlparse +from urllib.parse import urlparse, urljoin import requests from requests import RequestException +from pydantic import AnyHttpUrl +from filip.clients.base_http_client import NgsiURLVersion from filip.models.base import FiwareHeader from filip.utils.simple_ql import QueryString from filip.clients.ngsi_v2 import ContextBrokerClient, IoTAClient @@ -104,6 +106,25 @@ def setUp(self) -> None: } ) + def test_url_composition(self): + """ + Test URL composition for context broker client + """ + user_input_urls = { + "http://example.org/orion/": "http://example.org/orion/v2/entities", + "http://example.org/orion": "http://example.org/orion/v2/entities", + "http://123.0.0.0:1026": "http://123.0.0.0:1026/v2/entities", + "http://123.0.0.0:1026/": "http://123.0.0.0:1026/v2/entities", + "http://123.0.0.0/orion": "http://123.0.0.0/orion/v2/entities", + "http://123.0.0.0/orion/": "http://123.0.0.0/orion/v2/entities", + } + for url in user_input_urls: + url_correct = AnyHttpUrl(user_input_urls[url]) + url_filip = AnyHttpUrl( + urljoin(url, f"{NgsiURLVersion.v2_url.value}/entities") + ) + self.assertEqual(url_correct, url_filip) + def test_management_endpoints(self): """ Test management functions of context broker client From 4e8dcb0a160630f6fe6a8d452b34d82f07105832 Mon Sep 17 00:00:00 2001 From: JunsongDu Date: Tue, 14 Jan 2025 10:55:08 +0100 Subject: [PATCH 2/5] fix: remove trailing slash in URL path of NGSI version --- filip/clients/base_http_client.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/filip/clients/base_http_client.py b/filip/clients/base_http_client.py index f83acee0..44c229ea 100644 --- a/filip/clients/base_http_client.py +++ b/filip/clients/base_http_client.py @@ -16,8 +16,8 @@ class NgsiURLVersion(str, Enum): URL part that defines the NGSI version for the API. """ - v2_url = "/v2" - ld_url = "/ngsi-ld/v1" + v2_url = "v2" + ld_url = "ngsi-ld/v1" class BaseHttpClient: From 44eec69356b0cfcf10c2427a28dc7513f85a3870 Mon Sep 17 00:00:00 2001 From: JunsongDu Date: Tue, 14 Jan 2025 11:37:49 +0100 Subject: [PATCH 3/5] feat: add trailing slash in validation --- filip/utils/validators.py | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/filip/utils/validators.py b/filip/utils/validators.py index c17c5e7c..f3ba6de3 100644 --- a/filip/utils/validators.py +++ b/filip/utils/validators.py @@ -50,7 +50,11 @@ def validate_http_url(url: AnyHttpUrl) -> str: Returns: validated url """ - return str(url) if url else url + url = str(url) if url else url + if url[-1] != "/": + # add trailing slash + url = f"{url}/" + return url @validate_call From 621d2e9da717495e88d9e4574029fa8a37f158f8 Mon Sep 17 00:00:00 2001 From: JunsongDu Date: Tue, 14 Jan 2025 11:38:19 +0100 Subject: [PATCH 4/5] chore: adapt test for url composition --- tests/clients/test_ngsi_ld_cb.py | 5 +++-- tests/clients/test_ngsi_v2_cb.py | 5 +++-- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/tests/clients/test_ngsi_ld_cb.py b/tests/clients/test_ngsi_ld_cb.py index 099eb777..f5dee28a 100644 --- a/tests/clients/test_ngsi_ld_cb.py +++ b/tests/clients/test_ngsi_ld_cb.py @@ -12,7 +12,7 @@ from requests.adapters import HTTPAdapter from urllib3.util.retry import Retry -from filip.clients.base_http_client import NgsiURLVersion +from filip.clients.base_http_client import NgsiURLVersion, BaseHttpClient from filip.clients.ngsi_ld.cb import ContextBrokerLDClient from filip.models.base import FiwareLDHeader, core_context from filip.models.ngsi_ld.context import ( @@ -114,8 +114,9 @@ def test_url_composition_ld(self): } for url in user_input_urls: url_correct = AnyHttpUrl(user_input_urls[url]) + bhc = BaseHttpClient(url=url) url_filip = AnyHttpUrl( - urljoin(url, f"{NgsiURLVersion.ld_url.value}/entities") + urljoin(bhc.base_url, f"{NgsiURLVersion.ld_url.value}/entities") ) self.assertEqual(url_correct, url_filip) diff --git a/tests/clients/test_ngsi_v2_cb.py b/tests/clients/test_ngsi_v2_cb.py index 7aa6ea97..dad2cfdb 100644 --- a/tests/clients/test_ngsi_v2_cb.py +++ b/tests/clients/test_ngsi_v2_cb.py @@ -16,7 +16,7 @@ import requests from requests import RequestException from pydantic import AnyHttpUrl -from filip.clients.base_http_client import NgsiURLVersion +from filip.clients.base_http_client import NgsiURLVersion, BaseHttpClient from filip.models.base import FiwareHeader from filip.utils.simple_ql import QueryString from filip.clients.ngsi_v2 import ContextBrokerClient, IoTAClient @@ -120,8 +120,9 @@ def test_url_composition(self): } for url in user_input_urls: url_correct = AnyHttpUrl(user_input_urls[url]) + bhc = BaseHttpClient(url=url) url_filip = AnyHttpUrl( - urljoin(url, f"{NgsiURLVersion.v2_url.value}/entities") + urljoin(bhc.base_url, f"{NgsiURLVersion.v2_url.value}/entities") ) self.assertEqual(url_correct, url_filip) From 8cb401fc5e1257d09af195ba1d3bf91de121515e Mon Sep 17 00:00:00 2001 From: Saira Bano Date: Mon, 20 Jan 2025 09:49:15 +0100 Subject: [PATCH 5/5] doc: update changelog --- CHANGELOG.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index a715581c..f8dda93f 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -1,7 +1,7 @@ ### v0.6.x - add: Tutorial for saving live timeseries data (e.g., forecast) in context broker and timeseries database ([#336](https://github.com/RWTH-EBC/FiLiP/pull/363)) - add: Tutorial for using session object ([#370](https://github.com/RWTH-EBC/FiLiP/pull/370)) - +- fix: Addition of trailing slash if missing from base url ([#371](https://github.com/RWTH-EBC/FiLiP/pull/371)) ### v0.6.0 - add: Tutorial for connecting with secured endpoints ([#319](https://github.com/RWTH-EBC/FiLiP/pull/319))