refactoring and adding test cases for test coverage

This commit is contained in:
Florian Förster 2025-03-14 11:55:29 +01:00
parent c3b8d104b0
commit 28b3b8d144
7 changed files with 191 additions and 31 deletions

View File

@ -23,7 +23,6 @@ from delta_barth.constants import (
) )
from delta_barth.errors import STATUS_HANDLER, wrap_result from delta_barth.errors import STATUS_HANDLER, wrap_result
from delta_barth.types import ( from delta_barth.types import (
CustomerDataSalesForecast,
DualDict, DualDict,
PipeResult, PipeResult,
) )
@ -328,6 +327,6 @@ def pipeline_sales_dummy(
session: Session, session: Session,
company_id: int | None = None, company_id: int | None = None,
start_date: Datetime | None = None, start_date: Datetime | None = None,
) -> SalesPrognosisResultsExport: ) -> SalesPrognosisResultsExport: # pragma: no cover
"""prototype dummy function for tests by DelBar""" """prototype dummy function for tests by DelBar"""
... ...

View File

@ -173,7 +173,7 @@ class Session:
elif resp.status_code == 401: elif resp.status_code == 401:
self._remove_session_token() self._remove_session_token()
response, status = self.login() response, status = self.login()
else: # pragma: no cover else:
response = LoginResponse(token="") response = LoginResponse(token="")
err = DelBarApiError(status_code=resp.status_code, **resp.json()) err = DelBarApiError(status_code=resp.status_code, **resp.json())
status = STATUS_HANDLER.api_error(err) status = STATUS_HANDLER.api_error(err)

View File

@ -54,7 +54,11 @@ def get_sales_prognosis_data(
company_id: int | None = None, company_id: int | None = None,
start_date: Datetime | None = None, start_date: Datetime | None = None,
) -> tuple[SalesPrognosisResponse, Status]: ) -> tuple[SalesPrognosisResponse, Status]:
session.assert_login() resp, status = session.assert_login()
if status != STATUS_HANDLER.SUCCESS:
response = SalesPrognosisResponse(daten=tuple())
return response, status
ROUTE: Final[str] = "verkauf/umsatzprognosedaten" ROUTE: Final[str] = "verkauf/umsatzprognosedaten"
URL: Final = combine_route(session.base_url, ROUTE) URL: Final = combine_route(session.base_url, ROUTE)

View File

@ -1,3 +1,5 @@
from unittest.mock import patch
import pytest import pytest
from delta_barth.api import common from delta_barth.api import common
@ -16,3 +18,15 @@ def session(credentials, api_base_url) -> common.Session:
) )
return session return session
@pytest.fixture
def mock_put():
with patch("requests.put") as mock:
yield mock
@pytest.fixture
def mock_get():
with patch("requests.get") as mock:
yield mock

View File

@ -1,3 +1,5 @@
from unittest.mock import patch
import pytest import pytest
from pydantic import ValidationError from pydantic import ValidationError
@ -8,6 +10,23 @@ from delta_barth.errors import (
) )
from delta_barth.types import HttpRequestTypes from delta_barth.types import HttpRequestTypes
# @pytest.fixture(scope="session")
# def auth_response() -> MockResponse:
# json_data = {"message": "GenericError", "code": "TestLogin", "hints": "TestCase"}
# return MockResponse(401, json_data)
# @pytest.fixture(scope="session")
# def fail_response() -> MockResponse:
# json_data = {"message": "GenericError", "code": "Test123", "hints": "TestCase"}
# return MockResponse(500, json_data)
# @pytest.fixture
# def mock_response():
# with patch("requests.put") as mock_get:
# yield mock_get
@pytest.mark.parametrize( @pytest.mark.parametrize(
["case", "expect"], ["case", "expect"],
@ -112,7 +131,7 @@ def test_session(credentials, api_base_url):
@pytest.mark.api_con_required @pytest.mark.api_con_required
def test_login_logout(session, credentials): def test_login_logout_Success(session, credentials):
assert not session.logged_in assert not session.logged_in
resp, status = session.login() resp, status = session.login()
@ -139,8 +158,37 @@ def test_login_logout(session, credentials):
assert status.api_server_error.message == "Nutzer oder Passwort falsch." assert status.api_server_error.message == "Nutzer oder Passwort falsch."
def test_login_logout_FailApiServer(session, mock_put):
code = 401
json = {
"message": "GenericError",
"code": "TestLogin",
"hints": "TestCase",
}
mock_put.return_value.status_code = code
mock_put.return_value.json.return_value = json
resp, status = session.login()
assert resp is not None
assert not resp.token
assert status.code == 400
assert status.api_server_error is not None
assert status.api_server_error.status_code == code
assert status.api_server_error.message == json["message"]
assert status.api_server_error.code == json["code"]
assert status.api_server_error.hints == json["hints"]
resp, status = session.logout()
assert resp is None
assert status.code == 400
assert status.api_server_error is not None
assert status.api_server_error.status_code == code
assert status.api_server_error.message == json["message"]
assert status.api_server_error.code == json["code"]
assert status.api_server_error.hints == json["hints"]
@pytest.mark.api_con_required @pytest.mark.api_con_required
def test_assert_login_while_logged_out(session): def test_assert_login_SuccessLoggedOut(session):
assert session.session_token is None assert session.session_token is None
assert session._creds is not None assert session._creds is not None
# test logged out state # test logged out state
@ -151,11 +199,12 @@ def test_assert_login_while_logged_out(session):
resp, status = session.logout() resp, status = session.logout()
assert status.code == 0 assert status.code == 0
# test already logged in
@pytest.mark.api_con_required
def test_assert_login_SuccessStillLoggedIn(session):
assert session.session_token is None assert session.session_token is None
assert session._creds is not None assert session._creds is not None
_, status = session.login() resp, status = session.login()
assert status.code == 0
resp, status = session.assert_login() resp, status = session.assert_login()
assert resp is not None assert resp is not None
assert status.code == 0 assert status.code == 0
@ -163,7 +212,31 @@ def test_assert_login_while_logged_out(session):
resp, status = session.logout() resp, status = session.logout()
assert status.code == 0 assert status.code == 0
# test invalid token
@pytest.mark.api_con_required
def test_assert_login_ReloginNoValidAuth(session, mock_get):
code = 401
json = {
"message": "AuthentificationError",
"code": "TestAssertLoginAfter",
"hints": "TestCase",
}
mock_get.return_value.status_code = code
mock_get.return_value.json.return_value = json
resp, status = session.login()
resp, status = session.assert_login()
assert resp is not None
assert status.code == 0
assert session.session_token is not None
resp, status = session.logout()
assert status.code == 0
@pytest.mark.api_con_required
def test_assert_login_ReloginWrongToken(session):
# triggers code 401
assert session.session_token is None assert session.session_token is None
assert session._creds is not None assert session._creds is not None
_, status = session.login() _, status = session.login()
@ -175,3 +248,27 @@ def test_assert_login_while_logged_out(session):
assert session.session_token is not None assert session.session_token is not None
resp, status = session.logout() resp, status = session.logout()
assert status.code == 0 assert status.code == 0
@pytest.mark.api_con_required
def test_assert_login_FailApiServer(session, mock_get):
code = 500
json = {
"message": "ServerError",
"code": "TestExternalServerError",
"hints": "TestCase",
}
mock_get.return_value.status_code = code
mock_get.return_value.json.return_value = json
resp, status = session.login()
resp, status = session.assert_login()
assert resp is not None
assert not resp.token
assert status.code == 400
assert status.api_server_error is not None
assert status.api_server_error.status_code == code
assert status.api_server_error.message == json["message"]
assert status.api_server_error.code == json["code"]
assert status.api_server_error.hints == json["hints"]

View File

@ -6,46 +6,92 @@ from delta_barth.api import requests as requests_
@pytest.mark.api_con_required @pytest.mark.api_con_required
def test_get_sales_prognosis_data(session): def test_get_sales_prognosis_data_Success(session):
resp, state = session.login() resp, status = session.login()
# test without company ID # test without company ID
assert state.code == 0 assert status.code == 0
date = Datetime(2022, 6, 1) date = Datetime(2022, 6, 1)
resp, state = requests_.get_sales_prognosis_data(session, None, date) resp, status = requests_.get_sales_prognosis_data(session, None, date)
assert state.code == 0 assert status.code == 0
assert len(resp.daten) > 0 assert len(resp.daten) > 0
date = Datetime(2030, 1, 1) date = Datetime(2030, 1, 1)
resp, state = requests_.get_sales_prognosis_data(session, None, date) resp, status = requests_.get_sales_prognosis_data(session, None, date)
assert state.code == 0 assert status.code == 0
assert len(resp.daten) == 0 assert len(resp.daten) == 0
# test with company ID # test with company ID
assert state.code == 0 assert status.code == 0
date = Datetime(2022, 6, 1) date = Datetime(2022, 6, 1)
company_id = 1024 company_id = 1024
resp, state = requests_.get_sales_prognosis_data(session, company_id, date) resp, status = requests_.get_sales_prognosis_data(session, company_id, date)
assert state.code == 0 assert status.code == 0
assert len(resp.daten) > 0 assert len(resp.daten) > 0
date = Datetime(2030, 1, 1) date = Datetime(2030, 1, 1)
resp, state = requests_.get_sales_prognosis_data(session, company_id, date) resp, status = requests_.get_sales_prognosis_data(session, company_id, date)
assert state.code == 0 assert status.code == 0
assert len(resp.daten) == 0 assert len(resp.daten) == 0
# test with non-existent company ID # test with non-existent company ID
assert state.code == 0 assert status.code == 0
date = Datetime(2022, 6, 1) date = Datetime(2022, 6, 1)
company_id = 1000024 company_id = 1000024
resp, state = requests_.get_sales_prognosis_data(session, company_id, date) resp, status = requests_.get_sales_prognosis_data(session, company_id, date)
# TODO check if this behaviour is still considered "successful" # TODO check if this behaviour is still considered "successful"
assert state.code == 0 assert status.code == 0
assert len(resp.daten) == 0 assert len(resp.daten) == 0
# test without date # test without date
company_id = 1024 company_id = 1024
resp, state = requests_.get_sales_prognosis_data(session, company_id, None) resp, status = requests_.get_sales_prognosis_data(session, company_id, None)
assert state.code == 0 assert status.code == 0
assert len(resp.daten) > 0 assert len(resp.daten) > 0
# test without filters # test without filters
resp, state = requests_.get_sales_prognosis_data(session, None, None) resp, status = requests_.get_sales_prognosis_data(session, None, None)
assert state.code == 0 assert status.code == 0
assert len(resp.daten) > 0 assert len(resp.daten) > 0
# close connection # close connection
resp, state = session.logout() resp, status = session.logout()
assert state.code == 0 assert status.code == 0
@pytest.mark.api_con_required
def test_get_sales_prognosis_data_FailLogin(session, mock_get):
session.login()
code = 500
json = {
"message": "ServerError",
"code": "TestExternalServerError",
"hints": "TestCase",
}
mock_get.return_value.status_code = code
mock_get.return_value.json.return_value = json
resp, status = requests_.get_sales_prognosis_data(session, None, None)
assert resp is not None
assert len(resp.daten) == 0
assert status.code == 400
assert status.api_server_error is not None
assert status.api_server_error.status_code == code
assert status.api_server_error.message == json["message"]
assert status.api_server_error.code == json["code"]
assert status.api_server_error.hints == json["hints"]
@pytest.mark.new
@pytest.mark.api_con_required
def test_get_sales_prognosis_data_FailApiServer(session, mock_get):
code = 405
json = {
"message": "ServerError",
"code": "TestExternalServerError",
"hints": "TestCase",
}
mock_get.return_value.status_code = code
mock_get.return_value.json.return_value = json
resp, status = requests_.get_sales_prognosis_data(session, None, None)
assert resp is not None
assert len(resp.daten) == 0
assert status.code == 400
assert status.api_server_error is not None
assert status.api_server_error.status_code == code
assert status.api_server_error.message == json["message"]
assert status.api_server_error.code == json["code"]
assert status.api_server_error.hints == json["hints"]