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"
 |