161 lines
4.3 KiB
Python
161 lines
4.3 KiB
Python
from typing import Optional, List
|
|
from pydantic import Field
|
|
from aiohttp import web
|
|
|
|
from aiohttp_pydantic import PydanticView
|
|
|
|
|
|
class ArticleView(PydanticView):
|
|
async def get(
|
|
self,
|
|
with_comments: bool,
|
|
age: Optional[int] = None,
|
|
nb_items: int = 7,
|
|
tags: List[str] = Field(default_factory=list),
|
|
):
|
|
return web.json_response(
|
|
{
|
|
"with_comments": with_comments,
|
|
"age": age,
|
|
"nb_items": nb_items,
|
|
"tags": tags,
|
|
}
|
|
)
|
|
|
|
|
|
async def test_get_article_without_required_qs_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.get("/article")
|
|
assert resp.status == 400
|
|
assert resp.content_type == "application/json"
|
|
assert await resp.json() == [
|
|
{
|
|
"in": "query string",
|
|
"loc": ["with_comments"],
|
|
"msg": "field required",
|
|
"type": "value_error.missing",
|
|
}
|
|
]
|
|
|
|
|
|
async def test_get_article_with_wrong_qs_type_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.get("/article", params={"with_comments": "foo"})
|
|
assert resp.status == 400
|
|
assert resp.content_type == "application/json"
|
|
assert await resp.json() == [
|
|
{
|
|
"in": "query string",
|
|
"loc": ["with_comments"],
|
|
"msg": "value could not be parsed to a boolean",
|
|
"type": "type_error.bool",
|
|
}
|
|
]
|
|
|
|
|
|
async def test_get_article_with_valid_qs_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.get("/article", params={"with_comments": "yes", "age": 3})
|
|
assert resp.status == 200
|
|
assert resp.content_type == "application/json"
|
|
assert await resp.json() == {
|
|
"with_comments": True,
|
|
"age": 3,
|
|
"nb_items": 7,
|
|
"tags": [],
|
|
}
|
|
|
|
|
|
async def test_get_article_with_valid_qs_and_omitted_optional_should_return_default_value(
|
|
aiohttp_client, loop
|
|
):
|
|
app = web.Application()
|
|
app.router.add_view("/article", ArticleView)
|
|
|
|
client = await aiohttp_client(app)
|
|
|
|
resp = await client.get("/article", params={"with_comments": "yes"})
|
|
assert await resp.json() == {
|
|
"with_comments": True,
|
|
"age": None,
|
|
"nb_items": 7,
|
|
"tags": [],
|
|
}
|
|
assert resp.status == 200
|
|
assert resp.content_type == "application/json"
|
|
|
|
|
|
async def test_get_article_with_multiple_value_for_qs_age_must_failed(
|
|
aiohttp_client, loop
|
|
):
|
|
app = web.Application()
|
|
app.router.add_view("/article", ArticleView)
|
|
|
|
client = await aiohttp_client(app)
|
|
|
|
resp = await client.get("/article", params={"age": ["2", "3"], "with_comments": 1})
|
|
assert await resp.json() == [
|
|
{
|
|
"in": "query string",
|
|
"loc": ["age"],
|
|
"msg": "value is not a valid integer",
|
|
"type": "type_error.integer",
|
|
}
|
|
]
|
|
assert resp.status == 400
|
|
assert resp.content_type == "application/json"
|
|
|
|
|
|
async def test_get_article_with_multiple_value_of_tags(aiohttp_client, loop):
|
|
app = web.Application()
|
|
app.router.add_view("/article", ArticleView)
|
|
|
|
client = await aiohttp_client(app)
|
|
|
|
resp = await client.get(
|
|
"/article", params={"age": 2, "with_comments": 1, "tags": ["aa", "bb"]}
|
|
)
|
|
assert await resp.json() == {
|
|
"age": 2,
|
|
"nb_items": 7,
|
|
"tags": ["aa", "bb"],
|
|
"with_comments": True,
|
|
}
|
|
assert resp.status == 200
|
|
assert resp.content_type == "application/json"
|
|
|
|
|
|
async def test_get_article_with_one_value_of_tags_must_be_a_list(aiohttp_client, loop):
|
|
app = web.Application()
|
|
app.router.add_view("/article", ArticleView)
|
|
|
|
client = await aiohttp_client(app)
|
|
|
|
resp = await client.get(
|
|
"/article", params={"age": 2, "with_comments": 1, "tags": ["aa"]}
|
|
)
|
|
assert await resp.json() == {
|
|
"age": 2,
|
|
"nb_items": 7,
|
|
"tags": ["aa"],
|
|
"with_comments": True,
|
|
}
|
|
assert resp.status == 200
|
|
assert resp.content_type == "application/json"
|