diff --git a/tests/conftest.py b/tests/conftest.py index fdbe4d4..104274b 100644 --- a/tests/conftest.py +++ b/tests/conftest.py @@ -1,14 +1,20 @@ import asyncio from typing import AsyncGenerator +from httpx import AsyncClient import pytest import pytest_asyncio -from sqlalchemy.ext.asyncio import AsyncSession, async_sessionmaker, create_async_engine +from sqlalchemy.ext.asyncio import ( + AsyncSession, + async_sessionmaker, + create_async_engine, +) from fastfood.app import create_app from fastfood.config import settings from fastfood.dbase import get_async_session from fastfood.models import Base + async_engine = create_async_engine(settings.TESTDATABASE_URL_asyncpg) async_session_maker = async_sessionmaker( async_engine, @@ -29,9 +35,7 @@ async def db_init(): async with async_engine.begin() as conn: await conn.run_sync(Base.metadata.drop_all) await conn.run_sync(Base.metadata.create_all) - yield - async with async_engine.begin() as conn: await conn.run_sync(Base.metadata.drop_all) diff --git a/tests/test_api.py b/tests/test_api.py index d66c8bf..bece697 100644 --- a/tests/test_api.py +++ b/tests/test_api.py @@ -5,22 +5,122 @@ url = "http://localhost:8000/api/v1/menus" class TestCrud: - @pytest.mark.asyncio - async def test_read_menus(self, app): - """тест пустой бд""" - async with AsyncClient(app=app, base_url=url) as ac: - response = await ac.get("/") - assert response.status_code == 200 - assert response.json() == [] + class Menu: + @staticmethod + async def read_all(app): + """чтение всех меню""" + async with AsyncClient(app=app, base_url=url) as ac: + response = await ac.get("/") + return response.status_code, response.json() + + @staticmethod + async def get(app, data): + """Получение меню по id""" + async with AsyncClient(app=app, base_url=url) as ac: + response = await ac.get(f"/{data.get('id')}") + return response.status_code, response.json() + + @staticmethod + async def write(app, data): + """создания меню""" + async with AsyncClient(app=app, base_url=url) as ac: + response = await ac.post("/", json=data) + return response.status_code, response.json() + + @staticmethod + async def update(app, data): + """Обновление меню по id""" + async with AsyncClient(app=app, base_url=url) as ac: + response = await ac.patch(f"/{data.get('id')}", json=data) + return response.status_code, response.json() + + @staticmethod + async def delete(app, data): + """Удаление меню по id""" + async with AsyncClient(app=app, base_url=url) as ac: + response = await ac.delete(f"/{data.get('id')}") + + class Submenu: + @staticmethod + async def read_all(app, menu): + """чтение всех меню""" + async with AsyncClient(app=app, base_url=url) as ac: + response = await ac.get(f"/{menu.get('id')}/submenus/") + print(response) + return response.status_code, response.json() + + @staticmethod + async def get(app, menu, submenu): + """Получение меню по id""" + async with AsyncClient(app=app, base_url=url) as ac: + response = await ac.get( + f"/{menu.get('id')}/submenus/{submenu.get('id')}", + ) + return response.status_code, response.json() + + @staticmethod + async def write(app, menu, submenu): + """создания меню""" + async with AsyncClient(app=app, base_url=url) as ac: + response = await ac.post( + f"/{menu.get('id')}/submenus/", json=submenu, + ) + return response.status_code, response.json() + + @staticmethod + async def update(app, menu, submenu): + """Обновление меню по id""" + async with AsyncClient(app=app, base_url=url) as ac: + response = await ac.patch( + f"/{menu.get('id')}/submenus/{submenu.get('id')}", + json=submenu, + ) + return response.status_code, response.json() + + @staticmethod + async def delete(app, menu, submenu): + """Удаление меню по id""" + async with AsyncClient(app=app, base_url=url) as ac: + response = await ac.delete(f"/{menu.get('id')}/submenus/{submenu.get('id')}") @pytest.mark.asyncio - async def test_write_menu(self, app): - """""" - async with AsyncClient(app=app, base_url=url) as ac: - response = await ac.post("/", json={"title": "menu 1", "description": None}) - assert response.status_code == 201 - assert response.json()["title"] == "menu 1" - assert response.json()["description"] == None + async def test_menu_crud(self, app): + """Тестирование функций меню""" + code, rspn = await self.Menu.read_all(app) + assert code == 200 + + data = {"title": "Menu", "description": None} + code, rspn = await self.Menu.write(app, data) + assert code == 201 + assert rspn["title"] == "Menu" + assert rspn["description"] is None + + code, menu = await self.Menu.get(app, {"id": rspn.get("id")}) + assert code == 200 + assert menu["title"] == rspn["title"] + + upd_data = { + "id": rspn.get("id"), "title": "upd Menu", "description": "", + } + code, upd_rspn = await self.Menu.update(app, upd_data) + assert code == 200 + assert upd_rspn["title"] == "upd Menu" + + code = await self.Menu.delete(app, rspn) + + code, menu = await self.Menu.get(app, {"id": rspn.get("id")}) + assert code == 404 + + @pytest.mark.asyncio + async def test_submenu(self, app): + menu = {"title": "Menu", "description": "main menu"} + code, rspn = await self.Menu.write(app, menu) + assert code == 201 + menu.update(rspn) + print(menu) + code, rspn = await self.Submenu.read_all(app, menu) + assert code == 200 + assert rspn == [] class TestСontinuity: