Skip to content

Commit 85b7d6b

Browse files
authored
♻️ Replace pytest-mock with unittest.mock and remove pytest-cov (#717)
1 parent a7deb9b commit 85b7d6b

File tree

7 files changed

+120
-171
lines changed

7 files changed

+120
-171
lines changed

backend/app/tests/api/routes/test_login.py

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
from unittest.mock import patch
2+
13
from fastapi.testclient import TestClient
2-
from pytest_mock import MockerFixture
34

45
from app.core.config import settings
56
from app.utils import generate_password_reset_token
@@ -39,18 +40,18 @@ def test_use_access_token(
3940

4041

4142
def test_recovery_password(
42-
client: TestClient, normal_user_token_headers: dict[str, str], mocker: MockerFixture
43+
client: TestClient, normal_user_token_headers: dict[str, str]
4344
) -> None:
44-
mocker.patch("app.utils.send_email", return_value=None)
45-
mocker.patch("app.core.config.settings.SMTP_HOST", "smtp.example.com")
46-
mocker.patch("app.core.config.settings.SMTP_USER", "[email protected]")
47-
48-
r = client.post(
49-
f"{settings.API_V1_STR}/password-recovery/{email}",
50-
headers=normal_user_token_headers,
51-
)
52-
assert r.status_code == 200
53-
assert r.json() == {"message": "Password recovery email sent"}
45+
with patch("app.core.config.settings.SMTP_HOST", "smtp.example.com"), patch(
46+
"app.core.config.settings.SMTP_USER", "admin@example.com"
47+
):
48+
49+
r = client.post(
50+
f"{settings.API_V1_STR}/password-recovery/{email}",
51+
headers=normal_user_token_headers,
52+
)
53+
assert r.status_code == 200
54+
assert r.json() == {"message": "Password recovery email sent"}
5455

5556

5657
def test_recovery_password_user_not_exits(

backend/app/tests/api/routes/test_users.py

Lines changed: 69 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
1+
from unittest.mock import patch
2+
13
from fastapi.testclient import TestClient
2-
from pytest_mock import MockerFixture
34
from sqlmodel import Session
45

56
from app import crud
@@ -31,27 +32,24 @@ def test_get_users_normal_user_me(
3132

3233

3334
def test_create_user_new_email(
34-
client: TestClient,
35-
superuser_token_headers: dict[str, str],
36-
db: Session,
37-
mocker: MockerFixture,
35+
client: TestClient, superuser_token_headers: dict[str, str], db: Session
3836
) -> None:
39-
mocker.patch("app.utils.send_email")
40-
mocker.patch("app.core.config.settings.SMTP_HOST", "smtp.example.com")
41-
mocker.patch("app.core.config.settings.SMTP_USER", "[email protected]")
42-
username = random_email()
43-
password = random_lower_string()
44-
data = {"email": username, "password": password}
45-
r = client.post(
46-
f"{settings.API_V1_STR}/users/",
47-
headers=superuser_token_headers,
48-
json=data,
49-
)
50-
assert 200 <= r.status_code < 300
51-
created_user = r.json()
52-
user = crud.get_user_by_email(session=db, email=username)
53-
assert user
54-
assert user.email == created_user["email"]
37+
with patch("app.utils.send_email", return_value=None), patch(
38+
"app.core.config.settings.SMTP_HOST", "smtp.example.com"
39+
), patch("app.core.config.settings.SMTP_USER", "[email protected]"):
40+
username = random_email()
41+
password = random_lower_string()
42+
data = {"email": username, "password": password}
43+
r = client.post(
44+
f"{settings.API_V1_STR}/users/",
45+
headers=superuser_token_headers,
46+
json=data,
47+
)
48+
assert 200 <= r.status_code < 300
49+
created_user = r.json()
50+
user = crud.get_user_by_email(session=db, email=username)
51+
assert user
52+
assert user.email == created_user["email"]
5553

5654

5755
def test_get_existing_user(
@@ -265,55 +263,56 @@ def test_update_password_me_same_password_error(
265263
)
266264

267265

268-
def test_create_user_open(client: TestClient, mocker: MockerFixture) -> None:
269-
mocker.patch("app.core.config.settings.USERS_OPEN_REGISTRATION", True)
270-
username = random_email()
271-
password = random_lower_string()
272-
full_name = random_lower_string()
273-
data = {"email": username, "password": password, "full_name": full_name}
274-
r = client.post(
275-
f"{settings.API_V1_STR}/users/open",
276-
json=data,
277-
)
278-
assert r.status_code == 200
279-
created_user = r.json()
280-
assert created_user["email"] == username
281-
assert created_user["full_name"] == full_name
282-
283-
284-
def test_create_user_open_forbidden_error(
285-
client: TestClient, mocker: MockerFixture
286-
) -> None:
287-
mocker.patch("app.core.config.settings.USERS_OPEN_REGISTRATION", False)
288-
username = random_email()
289-
password = random_lower_string()
290-
full_name = random_lower_string()
291-
data = {"email": username, "password": password, "full_name": full_name}
292-
r = client.post(
293-
f"{settings.API_V1_STR}/users/open",
294-
json=data,
295-
)
296-
assert r.status_code == 403
297-
assert r.json()["detail"] == "Open user registration is forbidden on this server"
298-
299-
300-
def test_create_user_open_already_exists_error(
301-
client: TestClient, mocker: MockerFixture
302-
) -> None:
303-
mocker.patch("app.core.config.settings.USERS_OPEN_REGISTRATION", True)
304-
password = random_lower_string()
305-
full_name = random_lower_string()
306-
data = {
307-
"email": settings.FIRST_SUPERUSER,
308-
"password": password,
309-
"full_name": full_name,
310-
}
311-
r = client.post(
312-
f"{settings.API_V1_STR}/users/open",
313-
json=data,
314-
)
315-
assert r.status_code == 400
316-
assert r.json()["detail"] == "The user with this email already exists in the system"
266+
def test_create_user_open(client: TestClient) -> None:
267+
with patch("app.core.config.settings.USERS_OPEN_REGISTRATION", True):
268+
username = random_email()
269+
password = random_lower_string()
270+
full_name = random_lower_string()
271+
data = {"email": username, "password": password, "full_name": full_name}
272+
r = client.post(
273+
f"{settings.API_V1_STR}/users/open",
274+
json=data,
275+
)
276+
assert r.status_code == 200
277+
created_user = r.json()
278+
assert created_user["email"] == username
279+
assert created_user["full_name"] == full_name
280+
281+
282+
def test_create_user_open_forbidden_error(client: TestClient) -> None:
283+
with patch("app.core.config.settings.USERS_OPEN_REGISTRATION", False):
284+
username = random_email()
285+
password = random_lower_string()
286+
full_name = random_lower_string()
287+
data = {"email": username, "password": password, "full_name": full_name}
288+
r = client.post(
289+
f"{settings.API_V1_STR}/users/open",
290+
json=data,
291+
)
292+
assert r.status_code == 403
293+
assert (
294+
r.json()["detail"] == "Open user registration is forbidden on this server"
295+
)
296+
297+
298+
def test_create_user_open_already_exists_error(client: TestClient) -> None:
299+
with patch("app.core.config.settings.USERS_OPEN_REGISTRATION", True):
300+
password = random_lower_string()
301+
full_name = random_lower_string()
302+
data = {
303+
"email": settings.FIRST_SUPERUSER,
304+
"password": password,
305+
"full_name": full_name,
306+
}
307+
r = client.post(
308+
f"{settings.API_V1_STR}/users/open",
309+
json=data,
310+
)
311+
assert r.status_code == 400
312+
assert (
313+
r.json()["detail"]
314+
== "The user with this email already exists in the system"
315+
)
317316

318317

319318
def test_update_user(
Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,30 @@
1-
from unittest.mock import MagicMock
1+
from unittest.mock import MagicMock, patch
22

3-
from pytest_mock import MockerFixture
43
from sqlmodel import select
54

65
from app.backend_pre_start import init, logger
76

87

9-
def test_init_successful_connection(mocker: MockerFixture) -> None:
8+
def test_init_successful_connection() -> None:
109
engine_mock = MagicMock()
1110

1211
session_mock = MagicMock()
1312
exec_mock = MagicMock(return_value=True)
1413
session_mock.configure_mock(**{"exec.return_value": exec_mock})
15-
mocker.patch("sqlmodel.Session", return_value=session_mock)
1614

17-
mocker.patch.object(logger, "info")
18-
mocker.patch.object(logger, "error")
19-
mocker.patch.object(logger, "warn")
20-
21-
try:
22-
init(engine_mock)
23-
connection_successful = True
24-
except Exception:
25-
connection_successful = False
26-
27-
assert (
28-
connection_successful
29-
), "The database connection should be successful and not raise an exception."
30-
31-
assert session_mock.exec.called_once_with(
32-
select(1)
33-
), "The session should execute a select statement once."
15+
with patch("sqlmodel.Session", return_value=session_mock), patch.object(
16+
logger, "info"
17+
), patch.object(logger, "error"), patch.object(logger, "warn"):
18+
try:
19+
init(engine_mock)
20+
connection_successful = True
21+
except Exception:
22+
connection_successful = False
23+
24+
assert (
25+
connection_successful
26+
), "The database connection should be successful and not raise an exception."
27+
28+
assert session_mock.exec.called_once_with(
29+
select(1)
30+
), "The session should execute a select statement once."
Lines changed: 18 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,33 +1,30 @@
1-
from unittest.mock import MagicMock
1+
from unittest.mock import MagicMock, patch
22

3-
from pytest_mock import MockerFixture
43
from sqlmodel import select
54

65
from app.tests_pre_start import init, logger
76

87

9-
def test_init_successful_connection(mocker: MockerFixture) -> None:
8+
def test_init_successful_connection() -> None:
109
engine_mock = MagicMock()
1110

1211
session_mock = MagicMock()
1312
exec_mock = MagicMock(return_value=True)
1413
session_mock.configure_mock(**{"exec.return_value": exec_mock})
15-
mocker.patch("sqlmodel.Session", return_value=session_mock)
1614

17-
mocker.patch.object(logger, "info")
18-
mocker.patch.object(logger, "error")
19-
mocker.patch.object(logger, "warn")
20-
21-
try:
22-
init(engine_mock)
23-
connection_successful = True
24-
except Exception:
25-
connection_successful = False
26-
27-
assert (
28-
connection_successful
29-
), "The database connection should be successful and not raise an exception."
30-
31-
assert session_mock.exec.called_once_with(
32-
select(1)
33-
), "The session should execute a select statement once."
15+
with patch("sqlmodel.Session", return_value=session_mock), patch.object(
16+
logger, "info"
17+
), patch.object(logger, "error"), patch.object(logger, "warn"):
18+
try:
19+
init(engine_mock)
20+
connection_successful = True
21+
except Exception:
22+
connection_successful = False
23+
24+
assert (
25+
connection_successful
26+
), "The database connection should be successful and not raise an exception."
27+
28+
assert session_mock.exec.called_once_with(
29+
select(1)
30+
), "The session should execute a select statement once."

backend/poetry.lock

Lines changed: 1 addition & 39 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

backend/pyproject.toml

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,13 +29,12 @@ sentry-sdk = {extras = ["fastapi"], version = "^1.40.6"}
2929

3030
[tool.poetry.group.dev.dependencies]
3131
pytest = "^7.4.3"
32-
pytest-cov = "^4.1.0"
3332
mypy = "^1.8.0"
3433
ruff = "^0.2.2"
3534
pre-commit = "^3.6.2"
36-
pytest-mock = "^3.12.0"
3735
types-python-jose = "^3.3.4.20240106"
3836
types-passlib = "^1.7.7.20240106"
37+
coverage = "^7.4.3"
3938

4039
[tool.isort]
4140
multi_line_output = 3

backend/scripts/test-cov-html.sh

Lines changed: 0 additions & 6 deletions
This file was deleted.

0 commit comments

Comments
 (0)