Skip to content

Commit 179c448

Browse files
committed
Added parametrize fixture for unit tests for several orms
1 parent 92c336e commit 179c448

23 files changed

Lines changed: 392 additions & 296 deletions

fastadmin/api/api.py

Lines changed: 1 addition & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -84,12 +84,7 @@ async def me(
8484
"""
8585
model = settings.ADMIN_USER_MODEL
8686
admin_model = get_admin_model(model)
87-
if not admin_model:
88-
raise HTTPException(status.HTTP_404_NOT_FOUND, detail=f"{model} model is not registered.")
89-
user = await admin_model.get_obj(user_id)
90-
if not user:
91-
raise HTTPException(status.HTTP_404_NOT_FOUND, detail="User not found.")
92-
return user
87+
return await admin_model.get_obj(user_id)
9388

9489

9590
@router.get("/list/{model}")

fastadmin/models/helpers.py

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,8 @@ def unregister_admin_model(model_classes: list[Any]):
2626
from fastadmin.app import admin_models
2727

2828
for model_class in model_classes:
29-
del admin_models[model_class]
29+
if model_class in admin_models:
30+
del admin_models[model_class]
3031

3132

3233
def get_admin_models() -> dict[Any, type[BaseModelAdmin]]:
Lines changed: 24 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,15 @@
1-
from fastadmin import TortoiseModelAdmin, register
1+
from tests.api.helpers import sign_in, sign_out
2+
from fastadmin.models.helpers import unregister_admin_model, register_admin_model
23

3-
from tests.api.tortoise.helpers import sign_in
4-
from fastadmin.models.helpers import unregister_admin_model
54

6-
7-
async def test_add(superuser, tournament, event, client):
8-
9-
@register(event.__class__)
10-
class EventAdmin(TortoiseModelAdmin):
11-
pass
12-
13-
await sign_in(client, superuser)
5+
async def test_add(objects, client):
6+
superuser = objects["superuser"]
7+
tournament = objects["tournament"]
8+
event = objects["event"]
9+
admin_user_cls = objects["admin_user_cls"]
10+
admin_event_cls = objects["admin_event_cls"]
11+
await sign_in(client, superuser, admin_user_cls)
12+
register_admin_model(admin_event_cls, [event.__class__])
1413
r = await client.post(
1514
f"/api/add/{event.__class__.__name__}",
1615
json={
@@ -28,8 +27,14 @@ class EventAdmin(TortoiseModelAdmin):
2827
assert item["updated_at"] == event.updated_at.isoformat()
2928
assert item["participants"] == [superuser.id]
3029

30+
unregister_admin_model([event.__class__])
31+
await sign_out(client, superuser)
32+
3133

32-
async def test_add_401(superuser, tournament, event, client):
34+
async def test_add_401(objects, client):
35+
superuser = objects["superuser"]
36+
tournament = objects["tournament"]
37+
event = objects["event"]
3338
r = await client.post(
3439
f"/api/add/{event.__class__.__name__}",
3540
json={
@@ -41,9 +46,12 @@ async def test_add_401(superuser, tournament, event, client):
4146
assert r.status_code == 401
4247

4348

44-
async def test_add_404(superuser, tournament, event, client):
45-
unregister_admin_model([event.__class__])
46-
await sign_in(client, superuser)
49+
async def test_add_404(objects, client):
50+
superuser = objects["superuser"]
51+
tournament = objects["tournament"]
52+
event = objects["event"]
53+
admin_user_cls = objects["admin_user_cls"]
54+
await sign_in(client, superuser, admin_user_cls)
4755
r = await client.post(
4856
f"/api/add/{event.__class__.__name__}",
4957
json={
@@ -53,3 +61,4 @@ async def test_add_404(superuser, tournament, event, client):
5361
}
5462
)
5563
assert r.status_code == 404
64+
await sign_out(client, superuser)

tests/api/api/test_auth.py

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
from tests.api.helpers import sign_in, sign_out
2+
from fastadmin.models.helpers import unregister_admin_model, register_admin_model
3+
4+
5+
async def test_sign_in_401_invalid_password(objects, client):
6+
superuser = objects["superuser"]
7+
admin_user_cls = objects["admin_user_cls"]
8+
register_admin_model(admin_user_cls, [superuser.__class__])
9+
r = await client.post(
10+
"/api/sign-in",
11+
json={
12+
"username": superuser.username,
13+
"password": "invalid",
14+
}
15+
)
16+
assert r.status_code == 401
17+
unregister_admin_model([superuser.__class__])
18+
19+
20+
async def test_sign_in_401(objects, client):
21+
superuser = objects["superuser"]
22+
r = await client.post(
23+
"/api/sign-in",
24+
json={
25+
"username": superuser.username,
26+
"password": superuser.password,
27+
}
28+
)
29+
assert r.status_code == 401
30+
31+
32+
async def test_sign_in(objects, client):
33+
superuser = objects["superuser"]
34+
admin_user_cls = objects["admin_user_cls"]
35+
assert await sign_in(client, superuser, admin_user_cls)
36+
await sign_out(client, superuser)
37+
38+
39+
async def test_me(objects, client):
40+
superuser = objects["superuser"]
41+
admin_user_cls = objects["admin_user_cls"]
42+
await sign_in(client, superuser, admin_user_cls)
43+
44+
r = await client.get(
45+
"/api/me",
46+
)
47+
assert r.status_code == 200
48+
me = r.json()
49+
assert me["id"] == superuser.id
50+
assert me["username"] == superuser.username
51+
await sign_out(client, superuser)
52+
53+
54+
async def test_me_401(client):
55+
r = await client.get("/api/me")
56+
assert r.status_code == 401
57+
58+
59+
async def test_me_404(objects, client):
60+
superuser = objects["superuser"]
61+
admin_user_cls = objects["admin_user_cls"]
62+
await sign_in(client, superuser, admin_user_cls)
63+
unregister_admin_model([superuser.__class__])
64+
r = await client.get("/api/me")
65+
assert r.status_code == 401
66+
register_admin_model(admin_user_cls, [superuser.__class__])
67+
await sign_out(client, superuser)
68+
69+
70+
async def test_sign_out(objects, client):
71+
superuser = objects["superuser"]
72+
admin_user_cls = objects["admin_user_cls"]
73+
await sign_in(client, superuser, admin_user_cls)
74+
75+
r = await client.post(
76+
"/api/sign-out",
77+
)
78+
assert r.status_code == 200
79+
80+
r = await client.get(
81+
"/api/me",
82+
)
83+
assert r.status_code == 401
84+
85+
r = await client.post(
86+
"/api/sign-out",
87+
)
88+
assert r.status_code == 401
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
from fastadmin import TortoiseModelAdmin, register
1+
from tests.api.helpers import sign_in, sign_out
2+
from fastadmin.models.helpers import unregister_admin_model, register_admin_model
23

3-
from tests.api.tortoise.helpers import sign_in
4-
from fastadmin.models.helpers import unregister_admin_model
54

6-
7-
async def test_change(superuser, event, client):
8-
9-
@register(event.__class__)
10-
class EventAdmin(TortoiseModelAdmin):
11-
pass
12-
13-
await sign_in(client, superuser)
5+
async def test_change(objects, client):
6+
superuser = objects["superuser"]
7+
event = objects["event"]
8+
admin_user_cls = objects["admin_user_cls"]
9+
admin_event_cls = objects["admin_event_cls"]
10+
await sign_in(client, superuser, admin_user_cls)
11+
register_admin_model(admin_event_cls, [event.__class__])
1412
r = await client.patch(
1513
f"/api/change/{event.__class__.__name__}/{event.id}",
1614
json={
@@ -29,8 +27,13 @@ class EventAdmin(TortoiseModelAdmin):
2927
assert item["updated_at"] == event.updated_at.isoformat()
3028
assert item["participants"] == [superuser.id]
3129

30+
unregister_admin_model([event.__class__])
31+
await sign_out(client, superuser)
32+
3233

33-
async def test_change_401(superuser, tournament, event, client):
34+
async def test_change_401(objects, client):
35+
superuser = objects["superuser"]
36+
event = objects["event"]
3437
r = await client.patch(
3538
f"/api/change/{event.__class__.__name__}/{event.id}",
3639
json={
@@ -41,9 +44,11 @@ async def test_change_401(superuser, tournament, event, client):
4144
assert r.status_code == 401
4245

4346

44-
async def test_change_404(superuser, event, client):
45-
unregister_admin_model([event.__class__])
46-
await sign_in(client, superuser)
47+
async def test_change_404(objects, client):
48+
superuser = objects["superuser"]
49+
event = objects["event"]
50+
admin_user_cls = objects["admin_user_cls"]
51+
await sign_in(client, superuser, admin_user_cls)
4752
r = await client.patch(
4853
f"/api/change/{event.__class__.__name__}/{event.id}",
4954
json={
@@ -52,3 +57,4 @@ async def test_change_404(superuser, event, client):
5257
}
5358
)
5459
assert r.status_code == 404
60+
await sign_out(client, superuser)
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
from fastadmin import TortoiseModelAdmin, register
2+
3+
from tests.api.helpers import sign_in
4+
from fastadmin.models.helpers import unregister_admin_model, register_admin_model
5+
6+
7+
async def test_configuration(objects, client):
8+
superuser = objects["superuser"]
9+
event = objects["event"]
10+
admin_user_cls = objects["admin_user_cls"]
11+
admin_event_cls = objects["admin_event_cls"]
12+
13+
await sign_in(client, superuser, admin_user_cls)
14+
15+
register_admin_model(admin_event_cls, [event.__class__])
16+
r = await client.get(
17+
f"/api/configuration",
18+
)
19+
assert r.status_code == 200
20+
data = r.json()
21+
assert data
22+
23+
unregister_admin_model([event.__class__])

tests/api/api/test_delete.py

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
from tests.api.helpers import sign_in, sign_out
2+
from fastadmin.models.helpers import unregister_admin_model, register_admin_model
3+
4+
5+
async def test_delete(objects, client):
6+
superuser = objects["superuser"]
7+
event = objects["event"]
8+
admin_user_cls = objects["admin_user_cls"]
9+
admin_event_cls = objects["admin_event_cls"]
10+
await sign_in(client, superuser, admin_user_cls)
11+
register_admin_model(admin_event_cls, [event.__class__])
12+
r = await client.delete(
13+
f"/api/delete/{event.__class__.__name__}/{event.id}",
14+
)
15+
assert r.status_code == 200
16+
item = r.json()
17+
assert item == str(event.id)
18+
19+
unregister_admin_model([event.__class__])
20+
await sign_out(client, superuser)
21+
22+
23+
async def test_delete_401(objects, client):
24+
event = objects["event"]
25+
r = await client.delete(
26+
f"/api/delete/{event.__class__.__name__}/{event.id}",
27+
)
28+
assert r.status_code == 401
29+
30+
31+
async def test_delete_404(objects, client):
32+
superuser = objects["superuser"]
33+
event = objects["event"]
34+
admin_user_cls = objects["admin_user_cls"]
35+
await sign_in(client, superuser, admin_user_cls)
36+
r = await client.delete(
37+
f"/api/delete/{event.__class__.__name__}/{event.id}",
38+
)
39+
assert r.status_code == 404
40+
await sign_out(client, superuser)
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
1-
from fastadmin import TortoiseModelAdmin, register
1+
from tests.api.helpers import sign_in, sign_out
2+
from fastadmin.models.helpers import unregister_admin_model, register_admin_model
23

3-
from tests.api.tortoise.helpers import sign_in
4-
from fastadmin.models.helpers import unregister_admin_model
54

6-
7-
async def test_list(superuser, event, client):
8-
9-
@register(event.__class__)
10-
class EventAdmin(TortoiseModelAdmin):
11-
pass
12-
13-
await sign_in(client, superuser)
5+
async def test_list(objects, client):
6+
superuser = objects["superuser"]
7+
event = objects["event"]
8+
admin_user_cls = objects["admin_user_cls"]
9+
admin_event_cls = objects["admin_event_cls"]
10+
await sign_in(client, superuser, admin_user_cls)
11+
register_admin_model(admin_event_cls, [event.__class__])
1412
r = await client.get(
1513
f"/api/list/{event.__class__.__name__}",
1614
)
@@ -26,18 +24,25 @@ class EventAdmin(TortoiseModelAdmin):
2624
assert item["updated_at"] == event.updated_at.isoformat()
2725
assert "participants" not in item # no m2m2 fields on list
2826

27+
unregister_admin_model([event.__class__])
28+
await sign_out(client, superuser)
29+
2930

30-
async def test_list_401(superuser, tournament, event, client):
31+
async def test_list_401(objects, client):
32+
event = objects["event"]
3133
r = await client.get(
3234
f"/api/list/{event.__class__.__name__}",
3335
)
3436
assert r.status_code == 401
3537

3638

37-
async def test_list_404(superuser, event, client):
38-
unregister_admin_model([event.__class__])
39-
await sign_in(client, superuser)
39+
async def test_list_404(objects, client):
40+
superuser = objects["superuser"]
41+
event = objects["event"]
42+
admin_user_cls = objects["admin_user_cls"]
43+
await sign_in(client, superuser, admin_user_cls)
4044
r = await client.get(
4145
f"/api/list/{event.__class__.__name__}",
4246
)
4347
assert r.status_code == 404
48+
await sign_out(client, superuser)

0 commit comments

Comments
 (0)