|
| 1 | +import os |
| 2 | + |
1 | 3 | import httpx
|
2 | 4 | from fastapi import status
|
3 | 5 | from tortoise.contrib.test import TestCase
|
4 | 6 |
|
5 | 7 | from main import app
|
| 8 | +from src.configs import config |
6 | 9 | from src.models.users import GenderEnum, User
|
7 | 10 | from src.services.auth import AuthService
|
8 | 11 | from src.services.jwt import JWTService
|
| 12 | +from src.tests.utils.fake_file import fake_image, fake_txt_file |
| 13 | +from src.utils.file import IMAGE_EXTENSIONS |
9 | 14 |
|
10 | 15 |
|
11 | 16 | class TestUserRouter(TestCase):
|
@@ -270,3 +275,70 @@ async def test_api_search_user_when_user_not_found(self) -> None:
|
270 | 275 |
|
271 | 276 | # then
|
272 | 277 | assert response.status_code == status.HTTP_404_NOT_FOUND
|
| 278 | + |
| 279 | + async def test_api_register_user_profile_image(self) -> None: |
| 280 | + # given |
| 281 | + async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app), base_url="http://test") as client: |
| 282 | + create_response = await client.post( |
| 283 | + url="/users", |
| 284 | + json={ |
| 285 | + "username": "testuser", |
| 286 | + "password": (password := "password123"), |
| 287 | + "age": 20, |
| 288 | + "gender": GenderEnum.MALE, |
| 289 | + }, |
| 290 | + ) |
| 291 | + user_id = create_response.json() |
| 292 | + user = await User.get(id=user_id) |
| 293 | + |
| 294 | + await client.post(url="/users/login", json={"username": user.username, "password": password}) |
| 295 | + |
| 296 | + # when |
| 297 | + response = await client.post( |
| 298 | + "/users/me/profile_image", files={"image": ((image := "test_image.png"), fake_image(), "image/png")} |
| 299 | + ) |
| 300 | + |
| 301 | + # then |
| 302 | + assert response.status_code == status.HTTP_200_OK |
| 303 | + response_json = response.json() |
| 304 | + |
| 305 | + assert f"users/profile_images/{image.rsplit(".")[0]}" in response_json["profile_image_url"] |
| 306 | + assert image.rsplit(".")[1] in response_json["profile_image_url"] |
| 307 | + |
| 308 | + await user.refresh_from_db() |
| 309 | + assert response_json["profile_image_url"] == user.profile_image_url |
| 310 | + |
| 311 | + saved_file_path = os.path.join(config.MEDIA_DIR, user.profile_image_url) |
| 312 | + # 파일이 저장되었는지 확인 |
| 313 | + assert os.path.exists(saved_file_path) |
| 314 | + |
| 315 | + # 리소스 정리 |
| 316 | + os.remove(saved_file_path) |
| 317 | + |
| 318 | + async def test_api_register_user_profile_image_when_file_has_unavailable_extension(self) -> None: |
| 319 | + # given |
| 320 | + async with httpx.AsyncClient(transport=httpx.ASGITransport(app=app), base_url="http://test") as client: |
| 321 | + create_response = await client.post( |
| 322 | + url="/users", |
| 323 | + json={ |
| 324 | + "username": "testuser", |
| 325 | + "password": (password := "password123"), |
| 326 | + "age": 20, |
| 327 | + "gender": GenderEnum.MALE, |
| 328 | + }, |
| 329 | + ) |
| 330 | + user_id = create_response.json() |
| 331 | + user = await User.get(id=user_id) |
| 332 | + |
| 333 | + await client.post(url="/users/login", json={"username": user.username, "password": password}) |
| 334 | + |
| 335 | + # when |
| 336 | + response = await client.post( |
| 337 | + "/users/me/profile_image", files={"image": ("test_file.txt", fake_txt_file(), "text/plain")} |
| 338 | + ) |
| 339 | + |
| 340 | + # then |
| 341 | + assert response.status_code == status.HTTP_400_BAD_REQUEST |
| 342 | + response_json = response.json() |
| 343 | + |
| 344 | + assert response_json["detail"] == f"not allowed extension. available extensions: {IMAGE_EXTENSIONS}" |
0 commit comments