From 64bc03b7faa67a02eb5503c710aa5e79d02ea013 Mon Sep 17 00:00:00 2001 From: pi3c Date: Wed, 31 Jan 2024 01:05:28 +0300 Subject: [PATCH] dishcrud test --- README.md | 17 +++++++--- compose_test.yml | 4 +-- fastfood/config.py | 10 +++--- tests/test_crud.py | 83 +++++++++++++++++++++++++++++++++++++++++++--- 4 files changed, 99 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 23f342d..c5c528f 100644 --- a/README.md +++ b/README.md @@ -97,12 +97,21 @@ Fastapi веб приложение реализующее api для общеп `CREATE DATABASE _test WITH OWNER ;` где и соответвтовали POSTGRES_DB и POSTGRES_USER в файле `.env` -Создайте и запустите образы -Запуск FAstAPI приложения -> `$ docker-compose -f compose_app.yml up -d` +Создайте контейнеры +> `$ docker-compose -f compose_app.yml build && docker-compose -f compose_test.yml build` -Запуск тестов +И запустите образы: + +- Запуск FAstAPI приложения +> `$ docker-compose -f compose_app.yml up -d` +По завершении работы остановите контейнеры +> `$ docker-compose -f compose_app.yml down` + + +- Запуск тестов > `$ docker-compose -f compose_test.yml up` +По завершении работы остановите контейнеры +> `$ docker-compose -f compose_test.yml down` После успешного запуска образов документация по API будет доступна по адресу http://localhost:8000 diff --git a/compose_test.yml b/compose_test.yml index bd471be..0b706f2 100644 --- a/compose_test.yml +++ b/compose_test.yml @@ -9,7 +9,7 @@ services: - .env environment: - POSTGRES_DB: "${POSTGRES_DB}_test" + POSTGRES_DB: ${POSTGRES_DB_TEST} POSTGRES_USER: ${POSTGRES_USER} POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} @@ -17,7 +17,7 @@ services: - 6432:5432 healthcheck: - test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB}_test"] + test: ["CMD-SHELL", "pg_isready -U ${POSTGRES_USER} -d ${POSTGRES_DB_TEST}"] interval: 10s timeout: 5s retries: 5 diff --git a/fastfood/config.py b/fastfood/config.py index 8f24f89..90394d3 100644 --- a/fastfood/config.py +++ b/fastfood/config.py @@ -2,12 +2,12 @@ from pydantic_settings import BaseSettings, SettingsConfigDict class Settings(BaseSettings): - DB_HOST: str = "db" + DB_HOST: str = "" DB_PORT: int = 5432 - POSTGRES_DB: str = "fastfood_db" - POSTGRES_PASSWORD: str = "test" - POSTGRES_USER: str = "testuser" - POSTGRES_DB_TEST: str = "fastfood_db_test" + POSTGRES_DB: str = "" + POSTGRES_PASSWORD: str = "" + POSTGRES_USER: str = "" + POSTGRES_DB_TEST: str = "" @property def DATABASE_URL_asyncpg(self): diff --git a/tests/test_crud.py b/tests/test_crud.py index b4bc383..309cc83 100644 --- a/tests/test_crud.py +++ b/tests/test_crud.py @@ -3,9 +3,11 @@ from uuid import UUID import pytest from sqlalchemy.ext.asyncio import AsyncSession +from fastfood.cruds.dish import DishCrud from fastfood.cruds.menu import MenuCrud from fastfood.cruds.submenu import SubMenuCrud -from fastfood.models import Menu, SubMenu +from fastfood.models import Dish, Menu, SubMenu +from fastfood.schemas import DishBase as dishschema from fastfood.schemas import Menu as menuschema from fastfood.schemas import MenuBase as menubaseschema @@ -48,7 +50,7 @@ async def test_menu(asession: AsyncSession) -> None: async def test_submenu(asession: AsyncSession) -> None: async with asession: # Создаем меню напрямую - menu = Menu(title="SomeMenu", description="SomeDescription") + menu: Menu = Menu(title="SomeMenu", description="SomeDescription") asession.add(menu) await asession.commit() await asession.refresh(menu) @@ -74,6 +76,7 @@ async def test_submenu(asession: AsyncSession) -> None: asession, ) assert submenu == req_submenu + assert submenu.dishes_count == 0 # Обновляем меню submenu.title = "UpdatedSubmenu" @@ -96,9 +99,81 @@ async def test_submenu(asession: AsyncSession) -> None: await MenuCrud.delete_menu_item(menu_id, asession) -@pytest.mark.skip @pytest.mark.asyncio async def test_dish(asession: AsyncSession): """Not Implemented yet""" async with asession: - pass + # Создаем меню напрямую + menu = Menu(title="SomeMenu", description="SomeDescription") + asession.add(menu) + await asession.commit() + await asession.refresh(menu) + menu_id: UUID = menu.id + + # Создаем подменю + submenu: SubMenu = SubMenu( + title="submenu", + description="", + parent_menu=menu_id, + ) + asession.add(submenu) + await asession.commit() + await asession.refresh(submenu) + submenu_id = submenu.id + + # Создаем блюдо + dish: Dish = Dish( + title="dish1", + description="dish number 1", + price="12.5", + parent_submenu=submenu_id, + ) + dish = await DishCrud.create_dish_item( + submenu_id, + dishschema.model_validate(dish), + asession, + ) + dish_id = dish.id + + # Проверяем блюдо + req_dish = await DishCrud.get_dish_item( + dish_id, + asession, + ) + assert dish == req_dish + + menu = await MenuCrud.get_menu_item(menu_id, asession) + submenu = await SubMenuCrud.get_submenu_item( + menu_id, + submenu.id, + asession, + ) + + assert menu.submenus_count == 1 + assert menu.dishes_count == 1 + assert submenu.dishes_count == 1 + + # Обновляем блюдо + dish.price = 177 + req_dish = await DishCrud.update_dish_item( + dish_id, + dishschema.model_validate(dish), + asession, + ) + assert dish == req_dish + + # Удаляем длюдо + await DishCrud.delete_dish_item(dish_id, asession) + + menu = await MenuCrud.get_menu_item(menu_id, asession) + submenu = await SubMenuCrud.get_submenu_item( + menu_id, + submenu.id, + asession, + ) + + assert menu.dishes_count == 0 + assert submenu.dishes_count == 0 + + await SubMenuCrud.delete_submenu_item(submenu_id, asession) + await MenuCrud.delete_menu_item(menu_id, asession)