Skip to content

Commit 266b561

Browse files
committed
Add list users tests
1 parent 9a3689c commit 266b561

1 file changed

Lines changed: 146 additions & 0 deletions

File tree

Lines changed: 146 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,146 @@
1+
from datetime import timedelta
2+
3+
import httpx
4+
from sqlalchemy.ext.asyncio import AsyncSession
5+
6+
from app.core.common.entities.types_ import UserRole
7+
from app.core.common.entities.user import User
8+
from app.core.common.services.user import UserService
9+
from tests.integration.with_infra.authentication import authenticate
10+
from tests.integration.with_infra.factories import (
11+
create_raw_now,
12+
create_raw_password,
13+
create_user,
14+
create_user_with_password,
15+
)
16+
from tests.integration.with_infra.users.constants import USERS_ENDPOINT
17+
18+
19+
async def test_returns_200_and_lists_single_user(
20+
it_client: httpx.AsyncClient,
21+
it_admin: User,
22+
) -> None:
23+
r = await it_client.get(USERS_ENDPOINT)
24+
25+
assert r.status_code == 200
26+
payload = r.json()
27+
users = payload["users"]
28+
assert len(users) == 1
29+
assert users[0]["id"] == str(it_admin.id_)
30+
assert payload["total"] == 1
31+
assert payload["limit"] == 20
32+
assert payload["offset"] == 0
33+
34+
35+
async def test_returns_200_and_lists_multiple_users(
36+
it_client: httpx.AsyncClient,
37+
it_session: AsyncSession,
38+
it_admin: User,
39+
it_user_service: UserService,
40+
) -> None:
41+
user_1 = create_user(it_user_service)
42+
user_2 = create_user(it_user_service)
43+
it_session.add_all([user_1, user_2])
44+
await it_session.commit()
45+
46+
r = await it_client.get(USERS_ENDPOINT)
47+
48+
assert r.status_code == 200
49+
payload = r.json()
50+
assert payload["total"] == 3
51+
assert len(payload["users"]) == 3
52+
53+
54+
async def test_returns_200_and_respects_pagination_params(
55+
it_client: httpx.AsyncClient,
56+
it_session: AsyncSession,
57+
it_admin: User,
58+
it_user_service: UserService,
59+
) -> None:
60+
users = [create_user(it_user_service) for _ in range(4)]
61+
it_session.add_all(users)
62+
await it_session.commit()
63+
64+
r = await it_client.get(USERS_ENDPOINT, params={"limit": 2, "offset": 1})
65+
66+
assert r.status_code == 200
67+
payload = r.json()
68+
assert payload["total"] == 5
69+
assert payload["limit"] == 2
70+
assert payload["offset"] == 1
71+
assert len(payload["users"]) == 2
72+
73+
74+
async def test_returns_200_and_sorts_by_updated_at_desc(
75+
it_client: httpx.AsyncClient,
76+
it_session: AsyncSession,
77+
it_user_service: UserService,
78+
) -> None:
79+
now = create_raw_now()
80+
admin_password = create_raw_password()
81+
admin = await create_user_with_password(
82+
it_user_service, raw_password=admin_password, role=UserRole.ADMIN, raw_now=now
83+
)
84+
user_1 = create_user(it_user_service, raw_now=now - timedelta(hours=2))
85+
user_2 = create_user(it_user_service, raw_now=now - timedelta(hours=1))
86+
it_session.add_all([admin, user_1, user_2])
87+
await it_session.commit()
88+
await authenticate(it_client, admin.username.value, admin_password)
89+
90+
r = await it_client.get(USERS_ENDPOINT)
91+
92+
assert r.status_code == 200
93+
payload = r.json()
94+
users = payload["users"]
95+
assert users[0]["id"] == str(admin.id_)
96+
assert users[1]["id"] == str(user_2.id_)
97+
assert users[2]["id"] == str(user_1.id_)
98+
99+
100+
async def test_returns_200_and_sorts_by_username_asc(
101+
it_client: httpx.AsyncClient,
102+
it_session: AsyncSession,
103+
it_user_service: UserService,
104+
) -> None:
105+
admin_password = create_raw_password()
106+
admin = await create_user_with_password(
107+
it_user_service, raw_password=admin_password, role=UserRole.ADMIN, raw_username="alice1"
108+
)
109+
user_1 = create_user(it_user_service, raw_username="carol1")
110+
user_2 = create_user(it_user_service, raw_username="bob001")
111+
it_session.add_all([admin, user_1, user_2])
112+
await it_session.commit()
113+
await authenticate(it_client, admin.username.value, admin_password)
114+
115+
r = await it_client.get(USERS_ENDPOINT, params={"sorting_field": "username", "sorting_order": "ASC"})
116+
117+
assert r.status_code == 200
118+
payload = r.json()
119+
users = payload["users"]
120+
assert users[0]["username"] == admin.username.value
121+
assert users[1]["username"] == user_2.username.value
122+
assert users[2]["username"] == user_1.username.value
123+
124+
125+
async def test_returns_401_when_not_authenticated(
126+
it_client: httpx.AsyncClient,
127+
) -> None:
128+
r = await it_client.get(USERS_ENDPOINT)
129+
130+
assert r.status_code == 401
131+
132+
133+
async def test_returns_403_when_user_role(
134+
it_client: httpx.AsyncClient,
135+
it_session: AsyncSession,
136+
it_user_service: UserService,
137+
) -> None:
138+
password = create_raw_password()
139+
user = await create_user_with_password(it_user_service, raw_password=password)
140+
it_session.add(user)
141+
await it_session.commit()
142+
await authenticate(it_client, user.username.value, password)
143+
144+
r = await it_client.get(USERS_ENDPOINT)
145+
146+
assert r.status_code == 403

0 commit comments

Comments
 (0)