mirror of
https://github.com/bringout/oca-technical.git
synced 2026-04-18 13:52:05 +02:00
111 lines
4.4 KiB
Python
111 lines
4.4 KiB
Python
# Copyright 2022 ACSONE SA/NV
|
|
# License LGPL-3.0 or later (http://www.gnu.org/licenses/LGPL).
|
|
|
|
from functools import partial
|
|
|
|
from requests import Response
|
|
|
|
from odoo.exceptions import UserError
|
|
from odoo.tools.misc import mute_logger
|
|
|
|
from fastapi import status
|
|
|
|
from ..dependencies import fastapi_endpoint
|
|
from ..routers import demo_router
|
|
from ..schemas import DemoEndpointAppInfo, DemoExceptionType
|
|
from .common import FastAPITransactionCase
|
|
|
|
|
|
class FastAPIDemoCase(FastAPITransactionCase):
|
|
"""The fastapi lib comes with a useful testclient that let's you
|
|
easily test your endpoints. Moreover, the dependency overrides functionality
|
|
allows you to provide specific implementation for part of the code to avoid
|
|
to rely on some tricky http stuff for example: authentication
|
|
|
|
This test class is an example on how you can test your own code
|
|
"""
|
|
|
|
@classmethod
|
|
def setUpClass(cls) -> None:
|
|
super().setUpClass()
|
|
cls.default_fastapi_router = demo_router
|
|
cls.default_fastapi_running_user = cls.env.ref("fastapi.my_demo_app_user")
|
|
cls.default_fastapi_authenticated_partner = cls.env["res.partner"].create(
|
|
{"name": "FastAPI Demo"}
|
|
)
|
|
|
|
def test_hello_world(self) -> None:
|
|
with self._create_test_client() as test_client:
|
|
response: Response = test_client.get("/demo/")
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assertDictEqual(response.json(), {"Hello": "World"})
|
|
|
|
def test_who_ami(self) -> None:
|
|
with self._create_test_client() as test_client:
|
|
response: Response = test_client.get("/demo/who_ami")
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
partner = self.default_fastapi_authenticated_partner
|
|
self.assertDictEqual(
|
|
response.json(),
|
|
{
|
|
"name": partner.name,
|
|
"display_name": partner.display_name,
|
|
},
|
|
)
|
|
|
|
def test_endpoint_info(self) -> None:
|
|
demo_app = self.env.ref("fastapi.fastapi_endpoint_demo")
|
|
with self._create_test_client(
|
|
dependency_overrides={fastapi_endpoint: partial(lambda a: a, demo_app)}
|
|
) as test_client:
|
|
response: Response = test_client.get("/demo/endpoint_app_info")
|
|
self.assertEqual(response.status_code, status.HTTP_200_OK)
|
|
self.assertDictEqual(
|
|
response.json(),
|
|
DemoEndpointAppInfo.model_validate(demo_app).model_dump(by_alias=True),
|
|
)
|
|
|
|
def test_exception_raised(self) -> None:
|
|
with self.assertRaisesRegex(UserError, "User Error"):
|
|
with self._create_test_client() as test_client:
|
|
test_client.get(
|
|
"/demo/exception",
|
|
params={
|
|
"exception_type": DemoExceptionType.user_error.value,
|
|
"error_message": "User Error",
|
|
},
|
|
)
|
|
|
|
with self.assertRaisesRegex(NotImplementedError, "Bare Exception"):
|
|
with self._create_test_client() as test_client:
|
|
test_client.get(
|
|
"/demo/exception",
|
|
params={
|
|
"exception_type": DemoExceptionType.bare_exception.value,
|
|
"error_message": "Bare Exception",
|
|
},
|
|
)
|
|
|
|
@mute_logger("odoo.addons.fastapi.tests.common")
|
|
def test_exception_not_raised(self) -> None:
|
|
with self._create_test_client(raise_server_exceptions=False) as test_client:
|
|
response: Response = test_client.get(
|
|
"/demo/exception",
|
|
params={
|
|
"exception_type": DemoExceptionType.user_error.value,
|
|
"error_message": "User Error",
|
|
},
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST)
|
|
self.assertDictEqual(response.json(), {"detail": "User Error"})
|
|
|
|
with self._create_test_client(raise_server_exceptions=False) as test_client:
|
|
response: Response = test_client.get(
|
|
"/demo/exception",
|
|
params={
|
|
"exception_type": DemoExceptionType.bare_exception.value,
|
|
"error_message": "Bare Exception",
|
|
},
|
|
)
|
|
self.assertEqual(response.status_code, status.HTTP_500_INTERNAL_SERVER_ERROR)
|
|
self.assertDictEqual(response.json(), {"detail": "Internal Server Error"})
|