From 2c775d3c1f71c1729c85f5359957bf9dd1f5935a Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Sat, 20 Jun 2026 12:46:09 +0100 Subject: [PATCH 1/5] test(#40): asserting error type by printed error --- tests/test_exchangerate_client.py | 38 +++++++++++++++++++++++++------ 1 file changed, 31 insertions(+), 7 deletions(-) diff --git a/tests/test_exchangerate_client.py b/tests/test_exchangerate_client.py index faf0864..0b74d7b 100644 --- a/tests/test_exchangerate_client.py +++ b/tests/test_exchangerate_client.py @@ -3,7 +3,7 @@ from argus.clients.exchangerate_client import get_rates, check_error -def test_check_currency_timeout(monkeypatch): +def test_check_currency_timeout(monkeypatch,capsys): def test_get_resp(url, timeout): raise req.exceptions.Timeout() @@ -12,8 +12,10 @@ def test_get_resp(url, timeout): data = get_rates("EUR", "USD") assert data is None + captured=capsys.readouterr() + assert "API hat zu lange gebraucht." in captured.out -def test_check_currency_connection_error(monkeypatch): +def test_check_currency_connection_error(monkeypatch,capsys): def test_get_resp(url, timeout): raise req.exceptions.ConnectionError() @@ -22,8 +24,11 @@ def test_get_resp(url, timeout): data = get_rates("EUR", "USD") assert data is None + captured=capsys.readouterr() + assert "Keine Verbindung zur API." in captured.out -def test_check_currency_request_exception(monkeypatch): + +def test_check_currency_request_exception(monkeypatch,capsys): def test_get_resp(url, timeout): raise req.exceptions.RequestException("Testfehler") @@ -32,8 +37,11 @@ def test_get_resp(url, timeout): data = get_rates("EUR", "USD") assert data is None + captured=capsys.readouterr() + assert "Request fehlgeschlagen:" in captured.out + -def test_check_currency_value_error(monkeypatch): +def test_check_currency_value_error(monkeypatch,capsys): test_resp = Mock() test_resp.raise_for_status.return_value = None test_resp.json.side_effect = ValueError("Ungültige JSON-Antwort") @@ -46,12 +54,15 @@ def test_get_resp(url, timeout): data = get_rates("EUR", "USD") assert data is None + captured=capsys.readouterr() + assert "Fehler beim Verarbeiten der API-Antwort." in captured.out + -def test_check_currency_key_error(monkeypatch): +def test_check_currency_key_error(monkeypatch,capsys): test_resp = Mock() test_resp.raise_for_status.return_value = None test_resp.json.return_value = { - "result": "", + "result": "success",#not passing "success" bypases the "conversion_rate" checking "error_type": "", # "conversion_rate" fehlt absichtlich } @@ -64,6 +75,9 @@ def test_get_resp(url, timeout): data = get_rates("EUR", "USD") assert data is None + captured=capsys.readouterr() + assert "Unerwartete API-Antwortstruktur." in captured.out + def test_check_currency_valid(monkeypatch): test_resp = Mock() @@ -83,7 +97,7 @@ def test_get_resp(url, timeout): assert data == {"result": "success", "error_type": "", "conversion_rate": 1.2} -def test_check_currency_invalid(monkeypatch): +def test_check_currency_invalid(monkeypatch,capsys): test_resp = Mock() test_resp.raise_for_status.return_value = None test_resp.json.return_value = { @@ -100,6 +114,9 @@ def test_get_resp(url, timeout): data = get_rates("EUR", "USD") assert data is None + captured=capsys.readouterr() + assert "Invalid request! Please try again later." in captured.out + def test_check_error(capsys): check_error("unsupported-code") @@ -123,3 +140,10 @@ def test_check_error(capsys): captured.out == "Request limit reached! Please try again later or upgrade to exchangerate-api.com.\n" ) + + check_error("Some unknown Error") + captured = capsys.readouterr() + assert ( + captured.out + == "" + ) From 8181a29a4ace7e0ddca7724a5812fbf8e121059a Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Sat, 20 Jun 2026 12:59:37 +0100 Subject: [PATCH 2/5] fix(#40): Fixing the error where ValueErros never thrown --- src/argus/clients/exchangerate_client.py | 20 +++++++++++--------- 1 file changed, 11 insertions(+), 9 deletions(-) diff --git a/src/argus/clients/exchangerate_client.py b/src/argus/clients/exchangerate_client.py index 8ea5e89..15d32fa 100644 --- a/src/argus/clients/exchangerate_client.py +++ b/src/argus/clients/exchangerate_client.py @@ -24,6 +24,17 @@ def get_rates(curr1: str, curr2: str): resp.raise_for_status() payload = resp.json() + + if payload["result"] == "success": + data["result"] = "success" + data["conversion_rate"] = payload["conversion_rate"] + return data + else: + data["result"] = "error" + data["error_type"] = payload.get("error_type") + check_error(data["error_type"]) + return None + except req.exceptions.Timeout: print("API hat zu lange gebraucht.") return None @@ -41,15 +52,6 @@ def get_rates(curr1: str, curr2: str): print("Unerwartete API-Antwortstruktur.") return None - if payload.get("result") == "success": - data["result"] = "success" - data["conversion_rate"] = payload.get("conversion_rate") - return data - else: - data["result"] = "error" - data["error_type"] = payload.get("error_type") - check_error(data["error_type"]) - return None def check_error(err_type: str) -> None: From 62ec4c8bd416d80559347cac1d5f3b0fe18a0d76 Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Sat, 20 Jun 2026 15:49:24 +0100 Subject: [PATCH 3/5] test(#40): chenged return False to a valid assert --- tests/test_timeseries_service.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/tests/test_timeseries_service.py b/tests/test_timeseries_service.py index 7dd3c9f..b0c8b79 100644 --- a/tests/test_timeseries_service.py +++ b/tests/test_timeseries_service.py @@ -23,8 +23,9 @@ def test_get_a_full_timeseries(): "max_rate": [1.1055831909179688], } result = prepare_trend_analysis(test_curr, test_start, test_end, test_interval) - if result is None: - return False + + assert not ( result is None) + result_df, result_dict = result result_df["date"] = result_df["date"].astype("str") result_dict["min_date"] = [str(result_dict["min_date"][0])] From 2599718ec442477f76d6d8d5eaff38a21594f2e8 Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Sat, 20 Jun 2026 16:06:08 +0100 Subject: [PATCH 4/5] test(#40): covered all operators testing --- tests/test_validation_domain.py | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/tests/test_validation_domain.py b/tests/test_validation_domain.py index a5bd41f..0166741 100644 --- a/tests/test_validation_domain.py +++ b/tests/test_validation_domain.py @@ -7,9 +7,13 @@ def test_op_is_valid(): - data = is_valid_op("+") - assert data is True + assert is_valid_op("+") is True + assert is_valid_op("-") is True + assert is_valid_op("*") is True + assert is_valid_op("/") is True + assert is_valid_op("%") is True + assert is_valid_op("**") is True def test_op_is_not_valid(): From 2d6196b30061c5eead0a782c1e5a67556becabd8 Mon Sep 17 00:00:00 2001 From: Med-Yassine-B Date: Sat, 20 Jun 2026 16:34:57 +0100 Subject: [PATCH 5/5] test(#40): fixed test_error_raise to raise the error instead of returning it --- src/argus/clients/exchangerate_client.py | 2 -- tests/test_exchangerate_client.py | 32 +++++++++++------------- tests/test_timeseries_service.py | 2 +- tests/test_yfinance_client.py | 2 +- 4 files changed, 17 insertions(+), 21 deletions(-) diff --git a/src/argus/clients/exchangerate_client.py b/src/argus/clients/exchangerate_client.py index 15d32fa..d899718 100644 --- a/src/argus/clients/exchangerate_client.py +++ b/src/argus/clients/exchangerate_client.py @@ -24,7 +24,6 @@ def get_rates(curr1: str, curr2: str): resp.raise_for_status() payload = resp.json() - if payload["result"] == "success": data["result"] = "success" data["conversion_rate"] = payload["conversion_rate"] @@ -53,7 +52,6 @@ def get_rates(curr1: str, curr2: str): return None - def check_error(err_type: str) -> None: """ Check the error type returned by the API and print an appropriate message. diff --git a/tests/test_exchangerate_client.py b/tests/test_exchangerate_client.py index 0b74d7b..1f15512 100644 --- a/tests/test_exchangerate_client.py +++ b/tests/test_exchangerate_client.py @@ -3,7 +3,7 @@ from argus.clients.exchangerate_client import get_rates, check_error -def test_check_currency_timeout(monkeypatch,capsys): +def test_check_currency_timeout(monkeypatch, capsys): def test_get_resp(url, timeout): raise req.exceptions.Timeout() @@ -12,10 +12,11 @@ def test_get_resp(url, timeout): data = get_rates("EUR", "USD") assert data is None - captured=capsys.readouterr() + captured = capsys.readouterr() assert "API hat zu lange gebraucht." in captured.out -def test_check_currency_connection_error(monkeypatch,capsys): + +def test_check_currency_connection_error(monkeypatch, capsys): def test_get_resp(url, timeout): raise req.exceptions.ConnectionError() @@ -24,11 +25,11 @@ def test_get_resp(url, timeout): data = get_rates("EUR", "USD") assert data is None - captured=capsys.readouterr() + captured = capsys.readouterr() assert "Keine Verbindung zur API." in captured.out -def test_check_currency_request_exception(monkeypatch,capsys): +def test_check_currency_request_exception(monkeypatch, capsys): def test_get_resp(url, timeout): raise req.exceptions.RequestException("Testfehler") @@ -37,11 +38,11 @@ def test_get_resp(url, timeout): data = get_rates("EUR", "USD") assert data is None - captured=capsys.readouterr() + captured = capsys.readouterr() assert "Request fehlgeschlagen:" in captured.out -def test_check_currency_value_error(monkeypatch,capsys): +def test_check_currency_value_error(monkeypatch, capsys): test_resp = Mock() test_resp.raise_for_status.return_value = None test_resp.json.side_effect = ValueError("Ungültige JSON-Antwort") @@ -54,15 +55,15 @@ def test_get_resp(url, timeout): data = get_rates("EUR", "USD") assert data is None - captured=capsys.readouterr() + captured = capsys.readouterr() assert "Fehler beim Verarbeiten der API-Antwort." in captured.out -def test_check_currency_key_error(monkeypatch,capsys): +def test_check_currency_key_error(monkeypatch, capsys): test_resp = Mock() test_resp.raise_for_status.return_value = None test_resp.json.return_value = { - "result": "success",#not passing "success" bypases the "conversion_rate" checking + "result": "success", # not passing "success" bypases the "conversion_rate" checking "error_type": "", # "conversion_rate" fehlt absichtlich } @@ -75,7 +76,7 @@ def test_get_resp(url, timeout): data = get_rates("EUR", "USD") assert data is None - captured=capsys.readouterr() + captured = capsys.readouterr() assert "Unerwartete API-Antwortstruktur." in captured.out @@ -97,7 +98,7 @@ def test_get_resp(url, timeout): assert data == {"result": "success", "error_type": "", "conversion_rate": 1.2} -def test_check_currency_invalid(monkeypatch,capsys): +def test_check_currency_invalid(monkeypatch, capsys): test_resp = Mock() test_resp.raise_for_status.return_value = None test_resp.json.return_value = { @@ -114,7 +115,7 @@ def test_get_resp(url, timeout): data = get_rates("EUR", "USD") assert data is None - captured=capsys.readouterr() + captured = capsys.readouterr() assert "Invalid request! Please try again later." in captured.out @@ -143,7 +144,4 @@ def test_check_error(capsys): check_error("Some unknown Error") captured = capsys.readouterr() - assert ( - captured.out - == "" - ) + assert captured.out == "" diff --git a/tests/test_timeseries_service.py b/tests/test_timeseries_service.py index b0c8b79..cd5c97a 100644 --- a/tests/test_timeseries_service.py +++ b/tests/test_timeseries_service.py @@ -24,7 +24,7 @@ def test_get_a_full_timeseries(): } result = prepare_trend_analysis(test_curr, test_start, test_end, test_interval) - assert not ( result is None) + assert result is not None result_df, result_dict = result result_df["date"] = result_df["date"].astype("str") diff --git a/tests/test_yfinance_client.py b/tests/test_yfinance_client.py index faf15fc..6201b19 100644 --- a/tests/test_yfinance_client.py +++ b/tests/test_yfinance_client.py @@ -72,7 +72,7 @@ def test_error_raise(monkeypatch): def fake_yfinance_download( tickers=test_curr, start=test_start, end=test_end, interval=test_interval ): - return Exception("fake yfinance error") + raise Exception("fake yfinance error") monkeypatch.setattr("yfinance.download", fake_yfinance_download)