from pydantic import BaseModel from typing import Optional from aiohttp import web from aiohttp_pydantic import PydanticView class ArticleModel(BaseModel): name: str nb_page: Optional[int] class ArticleView(PydanticView): async def post(self, article: ArticleModel): return web.json_response(article.dict()) async def test_post_an_article_without_required_field_should_return_an_error_message( aiohttp_client, loop ): app = web.Application() app.router.add_view("/article", ArticleView) client = await aiohttp_client(app) resp = await client.post("/article", json={}) assert resp.status == 400 assert resp.content_type == "application/json" assert await resp.json() == [ {"loc": ["name"], "msg": "field required", "type": "value_error.missing"} ] async def test_post_an_article_with_wrong_type_field_should_return_an_error_message( aiohttp_client, loop ): app = web.Application() app.router.add_view("/article", ArticleView) client = await aiohttp_client(app) resp = await client.post("/article", json={"name": "foo", "nb_page": "foo"}) assert resp.status == 400 assert resp.content_type == "application/json" assert await resp.json() == [ { "loc": ["nb_page"], "msg": "value is not a valid integer", "type": "type_error.integer", } ] async def test_post_a_valid_article_should_return_the_parsed_type(aiohttp_client, loop): app = web.Application() app.router.add_view("/article", ArticleView) client = await aiohttp_client(app) resp = await client.post("/article", json={"name": "foo", "nb_page": 3}) assert resp.status == 200 assert resp.content_type == "application/json" assert await resp.json() == {"name": "foo", "nb_page": 3}