Skip to content

♻️ Replace pytest-mock with unittest.mock and remove pytest-cov #717

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Mar 13, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 13 additions & 12 deletions backend/app/tests/api/routes/test_login.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from unittest.mock import patch

from fastapi.testclient import TestClient
from pytest_mock import MockerFixture

from app.core.config import settings
from app.utils import generate_password_reset_token
Expand Down Expand Up @@ -39,18 +40,18 @@ def test_use_access_token(


def test_recovery_password(
client: TestClient, normal_user_token_headers: dict[str, str], mocker: MockerFixture
client: TestClient, normal_user_token_headers: dict[str, str]
) -> None:
mocker.patch("app.utils.send_email", return_value=None)
mocker.patch("app.core.config.settings.SMTP_HOST", "smtp.example.com")
mocker.patch("app.core.config.settings.SMTP_USER", "[email protected]")
email = "[email protected]"
r = client.post(
f"{settings.API_V1_STR}/password-recovery/{email}",
headers=normal_user_token_headers,
)
assert r.status_code == 200
assert r.json() == {"message": "Password recovery email sent"}
with patch("app.core.config.settings.SMTP_HOST", "smtp.example.com"), patch(
"app.core.config.settings.SMTP_USER", "admin@example.com"
):
email = "[email protected]"
r = client.post(
f"{settings.API_V1_STR}/password-recovery/{email}",
headers=normal_user_token_headers,
)
assert r.status_code == 200
assert r.json() == {"message": "Password recovery email sent"}


def test_recovery_password_user_not_exits(
Expand Down
139 changes: 69 additions & 70 deletions backend/app/tests/api/routes/test_users.py
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
from unittest.mock import patch

from fastapi.testclient import TestClient
from pytest_mock import MockerFixture
from sqlmodel import Session

from app import crud
Expand Down Expand Up @@ -31,27 +32,24 @@ def test_get_users_normal_user_me(


def test_create_user_new_email(
client: TestClient,
superuser_token_headers: dict[str, str],
db: Session,
mocker: MockerFixture,
client: TestClient, superuser_token_headers: dict[str, str], db: Session
) -> None:
mocker.patch("app.utils.send_email")
mocker.patch("app.core.config.settings.SMTP_HOST", "smtp.example.com")
mocker.patch("app.core.config.settings.SMTP_USER", "[email protected]")
username = random_email()
password = random_lower_string()
data = {"email": username, "password": password}
r = client.post(
f"{settings.API_V1_STR}/users/",
headers=superuser_token_headers,
json=data,
)
assert 200 <= r.status_code < 300
created_user = r.json()
user = crud.get_user_by_email(session=db, email=username)
assert user
assert user.email == created_user["email"]
with patch("app.utils.send_email", return_value=None), patch(
"app.core.config.settings.SMTP_HOST", "smtp.example.com"
), patch("app.core.config.settings.SMTP_USER", "[email protected]"):
username = random_email()
password = random_lower_string()
data = {"email": username, "password": password}
r = client.post(
f"{settings.API_V1_STR}/users/",
headers=superuser_token_headers,
json=data,
)
assert 200 <= r.status_code < 300
created_user = r.json()
user = crud.get_user_by_email(session=db, email=username)
assert user
assert user.email == created_user["email"]


def test_get_existing_user(
Expand Down Expand Up @@ -265,55 +263,56 @@ def test_update_password_me_same_password_error(
)


def test_create_user_open(client: TestClient, mocker: MockerFixture) -> None:
mocker.patch("app.core.config.settings.USERS_OPEN_REGISTRATION", True)
username = random_email()
password = random_lower_string()
full_name = random_lower_string()
data = {"email": username, "password": password, "full_name": full_name}
r = client.post(
f"{settings.API_V1_STR}/users/open",
json=data,
)
assert r.status_code == 200
created_user = r.json()
assert created_user["email"] == username
assert created_user["full_name"] == full_name


def test_create_user_open_forbidden_error(
client: TestClient, mocker: MockerFixture
) -> None:
mocker.patch("app.core.config.settings.USERS_OPEN_REGISTRATION", False)
username = random_email()
password = random_lower_string()
full_name = random_lower_string()
data = {"email": username, "password": password, "full_name": full_name}
r = client.post(
f"{settings.API_V1_STR}/users/open",
json=data,
)
assert r.status_code == 403
assert r.json()["detail"] == "Open user registration is forbidden on this server"


def test_create_user_open_already_exists_error(
client: TestClient, mocker: MockerFixture
) -> None:
mocker.patch("app.core.config.settings.USERS_OPEN_REGISTRATION", True)
password = random_lower_string()
full_name = random_lower_string()
data = {
"email": settings.FIRST_SUPERUSER,
"password": password,
"full_name": full_name,
}
r = client.post(
f"{settings.API_V1_STR}/users/open",
json=data,
)
assert r.status_code == 400
assert r.json()["detail"] == "The user with this email already exists in the system"
def test_create_user_open(client: TestClient) -> None:
with patch("app.core.config.settings.USERS_OPEN_REGISTRATION", True):
username = random_email()
password = random_lower_string()
full_name = random_lower_string()
data = {"email": username, "password": password, "full_name": full_name}
r = client.post(
f"{settings.API_V1_STR}/users/open",
json=data,
)
assert r.status_code == 200
created_user = r.json()
assert created_user["email"] == username
assert created_user["full_name"] == full_name


def test_create_user_open_forbidden_error(client: TestClient) -> None:
with patch("app.core.config.settings.USERS_OPEN_REGISTRATION", False):
username = random_email()
password = random_lower_string()
full_name = random_lower_string()
data = {"email": username, "password": password, "full_name": full_name}
r = client.post(
f"{settings.API_V1_STR}/users/open",
json=data,
)
assert r.status_code == 403
assert (
r.json()["detail"] == "Open user registration is forbidden on this server"
)


def test_create_user_open_already_exists_error(client: TestClient) -> None:
with patch("app.core.config.settings.USERS_OPEN_REGISTRATION", True):
password = random_lower_string()
full_name = random_lower_string()
data = {
"email": settings.FIRST_SUPERUSER,
"password": password,
"full_name": full_name,
}
r = client.post(
f"{settings.API_V1_STR}/users/open",
json=data,
)
assert r.status_code == 400
assert (
r.json()["detail"]
== "The user with this email already exists in the system"
)


def test_update_user(
Expand Down
39 changes: 18 additions & 21 deletions backend/app/tests/scripts/test_backend_pre_start.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,30 @@
from unittest.mock import MagicMock
from unittest.mock import MagicMock, patch

from pytest_mock import MockerFixture
from sqlmodel import select

from app.backend_pre_start import init, logger


def test_init_successful_connection(mocker: MockerFixture) -> None:
def test_init_successful_connection() -> None:
engine_mock = MagicMock()

session_mock = MagicMock()
exec_mock = MagicMock(return_value=True)
session_mock.configure_mock(**{"exec.return_value": exec_mock})
mocker.patch("sqlmodel.Session", return_value=session_mock)

mocker.patch.object(logger, "info")
mocker.patch.object(logger, "error")
mocker.patch.object(logger, "warn")

try:
init(engine_mock)
connection_successful = True
except Exception:
connection_successful = False

assert (
connection_successful
), "The database connection should be successful and not raise an exception."

assert session_mock.exec.called_once_with(
select(1)
), "The session should execute a select statement once."
with patch("sqlmodel.Session", return_value=session_mock), patch.object(
logger, "info"
), patch.object(logger, "error"), patch.object(logger, "warn"):
try:
init(engine_mock)
connection_successful = True
except Exception:
connection_successful = False

assert (
connection_successful
), "The database connection should be successful and not raise an exception."

assert session_mock.exec.called_once_with(
select(1)
), "The session should execute a select statement once."
39 changes: 18 additions & 21 deletions backend/app/tests/scripts/test_test_pre_start.py
Original file line number Diff line number Diff line change
@@ -1,33 +1,30 @@
from unittest.mock import MagicMock
from unittest.mock import MagicMock, patch

from pytest_mock import MockerFixture
from sqlmodel import select

from app.tests_pre_start import init, logger


def test_init_successful_connection(mocker: MockerFixture) -> None:
def test_init_successful_connection() -> None:
engine_mock = MagicMock()

session_mock = MagicMock()
exec_mock = MagicMock(return_value=True)
session_mock.configure_mock(**{"exec.return_value": exec_mock})
mocker.patch("sqlmodel.Session", return_value=session_mock)

mocker.patch.object(logger, "info")
mocker.patch.object(logger, "error")
mocker.patch.object(logger, "warn")

try:
init(engine_mock)
connection_successful = True
except Exception:
connection_successful = False

assert (
connection_successful
), "The database connection should be successful and not raise an exception."

assert session_mock.exec.called_once_with(
select(1)
), "The session should execute a select statement once."
with patch("sqlmodel.Session", return_value=session_mock), patch.object(
logger, "info"
), patch.object(logger, "error"), patch.object(logger, "warn"):
try:
init(engine_mock)
connection_successful = True
except Exception:
connection_successful = False

assert (
connection_successful
), "The database connection should be successful and not raise an exception."

assert session_mock.exec.called_once_with(
select(1)
), "The session should execute a select statement once."
40 changes: 1 addition & 39 deletions backend/poetry.lock

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

3 changes: 1 addition & 2 deletions backend/pyproject.toml
Original file line number Diff line number Diff line change
Expand Up @@ -29,13 +29,12 @@ sentry-sdk = {extras = ["fastapi"], version = "^1.40.6"}

[tool.poetry.group.dev.dependencies]
pytest = "^7.4.3"
pytest-cov = "^4.1.0"
mypy = "^1.8.0"
ruff = "^0.2.2"
pre-commit = "^3.6.2"
pytest-mock = "^3.12.0"
types-python-jose = "^3.3.4.20240106"
types-passlib = "^1.7.7.20240106"
coverage = "^7.4.3"

[tool.isort]
multi_line_output = 3
Expand Down
6 changes: 0 additions & 6 deletions backend/scripts/test-cov-html.sh

This file was deleted.