220 lines
6.8 KiB
Python
220 lines
6.8 KiB
Python
import pytest
|
|
from pydantic import ValidationError
|
|
|
|
from delta_barth.api import common
|
|
from delta_barth.constants import DEFAULT_API_ERR_CODE, HTTP_BASE_CONTENT_HEADERS
|
|
from delta_barth.errors import (
|
|
UnspecifiedRequestType,
|
|
)
|
|
from delta_barth.types import HttpRequestTypes
|
|
|
|
|
|
def test_validate_creds(credentials):
|
|
creds = common.validate_credentials(
|
|
username=credentials["user"],
|
|
password=credentials["pwd"],
|
|
database=credentials["db"],
|
|
mandant=credentials["mandant"],
|
|
)
|
|
assert creds.username == credentials["user"]
|
|
assert creds.password == credentials["pwd"]
|
|
assert creds.database == credentials["db"]
|
|
assert creds.mandant == credentials["mandant"]
|
|
# with whitespaces
|
|
user = " " + credentials["user"] + " "
|
|
creds = common.validate_credentials(
|
|
username=user,
|
|
password=credentials["pwd"],
|
|
database=credentials["db"],
|
|
mandant=credentials["mandant"],
|
|
)
|
|
assert user != credentials["user"]
|
|
assert creds.username == credentials["user"]
|
|
# invalid type
|
|
user = 123
|
|
with pytest.raises(ValidationError):
|
|
creds = common.validate_credentials(
|
|
username=user, # type: ignore
|
|
password=credentials["pwd"],
|
|
database=credentials["db"],
|
|
mandant=credentials["mandant"],
|
|
)
|
|
|
|
|
|
@pytest.mark.api_con_required
|
|
def test_ping(api_base_url):
|
|
resp = common.ping(api_base_url, HttpRequestTypes.GET)
|
|
assert resp.status_code == 204
|
|
resp = common.ping(api_base_url, HttpRequestTypes.PUT)
|
|
assert resp.status_code == 204
|
|
resp = common.ping(api_base_url, HttpRequestTypes.DELETE)
|
|
assert resp.status_code == 204
|
|
|
|
with pytest.raises(UnspecifiedRequestType):
|
|
resp = common.ping(api_base_url, HttpRequestTypes.POST)
|
|
|
|
|
|
def test_session(credentials, api_base_url):
|
|
session = common.Session(HTTP_BASE_CONTENT_HEADERS)
|
|
|
|
assert session.session_token is None
|
|
assert session._creds is None
|
|
assert session._base_url is None
|
|
|
|
session.set_base_url(api_base_url)
|
|
assert session._base_url is not None
|
|
session.set_credentials(
|
|
username=credentials["user"],
|
|
password=credentials["pwd"],
|
|
database=credentials["db"],
|
|
mandant=credentials["mandant"],
|
|
)
|
|
assert session._creds is not None
|
|
|
|
assert session.session_token is None
|
|
assert not session.logged_in
|
|
|
|
|
|
@pytest.mark.api_con_required
|
|
def test_login_logout_Success(session, credentials):
|
|
assert not session.logged_in
|
|
|
|
resp, status = session.login()
|
|
assert resp is not None
|
|
assert status.code == 0
|
|
assert session.session_token is not None
|
|
resp, status = session.logout()
|
|
assert resp is None
|
|
assert status.code == 0
|
|
assert session.session_token is None
|
|
assert "DelecoToken" not in session.headers
|
|
|
|
session.set_credentials(
|
|
user_name=credentials["user"],
|
|
password="WRONG_PASSWORD",
|
|
database=credentials["db"],
|
|
mandant=credentials["mandant"],
|
|
)
|
|
resp, status = session.login()
|
|
assert resp is not None
|
|
assert status.code == DEFAULT_API_ERR_CODE
|
|
assert status.api_server_error is not None
|
|
assert status.api_server_error.status_code == 409
|
|
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
|
|
def test_assert_login_SuccessLoggedOut(session):
|
|
assert session.session_token is None
|
|
assert session._creds is not None
|
|
# test logged out state
|
|
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_SuccessStillLoggedIn(session):
|
|
assert session.session_token is None
|
|
assert session._creds is not None
|
|
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_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._creds is not None
|
|
_, status = session.login()
|
|
assert status.code == 0
|
|
session._session_token = "WRONGTOKEN"
|
|
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_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"]
|