def test_attributes_as_dict(self): DictRequest = JsonApiRequest('item', dict) obj_to_validate = { 'data': {'type': 'item', 'attributes': {}} } my_request_obj = DictRequest(**obj_to_validate) assert my_request_obj.dict() == obj_to_validate
def test_request_with_relationships(self): MyRequest = JsonApiRequest('item', dict) obj_to_validate = { 'data': { 'type': 'item', 'attributes': {}, 'relationships': { 'sold_at': { 'data': { 'type': 'store', 'id': 'abc123', 'meta': None }, } } }, } my_request_obj = MyRequest(**obj_to_validate) assert my_request_obj.dict() == { 'data': { 'type': 'item', 'attributes': {}, 'relationships': { 'sold_at': { 'data': { 'type': 'store', 'id': 'abc123', 'meta': None }, } }, 'id': None }, }
def test_data_required(self): MyRequest = JsonApiRequest('item', dict) obj_to_validate = { 'data': None } with raises(ValidationError) as e: MyRequest(**obj_to_validate) assert e.value.errors() == [ {'loc': ('data',), 'msg': 'value is not a valid dict', 'type': 'type_error.dict'}, ]
def test_attributes_required(self): MyRequest = JsonApiRequest('item', dict) obj_to_validate = {'data': {'type': 'item', 'attributes': None}} with raises(ValidationError) as e: MyRequest(**obj_to_validate) assert e.value.errors() == [ { 'loc': ('data', 'attributes'), 'msg': 'none is not an allowed value', 'type': 'type_error.none.not_allowed' }, ]
def test_attributes_as_item_model(self): ItemRequest = JsonApiRequest('item', ItemModel) obj_to_validate = { 'data': { 'type': 'item', 'attributes': { 'name': 'apple', 'quantity': 10, 'price': 1.20 } } } my_request_obj = ItemRequest(**obj_to_validate) assert my_request_obj.dict() == obj_to_validate
def test_type_invalid_string(self): MyRequest = JsonApiRequest('item', dict) obj_to_validate = { 'data': {'type': 'not_an_item', 'attributes': {}} } with raises(ValidationError) as e: MyRequest(**obj_to_validate) assert e.value.errors() == [ { 'loc': ('data', 'type'), 'msg': "unexpected value; permitted: 'item'", 'type': 'value_error.const', 'ctx': {'given': 'not_an_item', 'permitted': ('item',)}, }, ]
def test_attributes_as_item_model__empty_dict(self): ItemRequest = JsonApiRequest('item', ItemModel) obj_to_validate = { 'data': { 'type': 'item', 'attributes': {} } } with raises(ValidationError) as e: ItemRequest(**obj_to_validate) assert e.value.errors() == [ {'loc': ('data', 'attributes', 'name'), 'msg': 'field required', 'type': 'value_error.missing'}, {'loc': ('data', 'attributes', 'quantity'), 'msg': 'field required', 'type': 'value_error.missing'}, {'loc': ('data', 'attributes', 'price'), 'msg': 'field required', 'type': 'value_error.missing'} ]
name: str quantity: int price: float id: str = str(uuid4().hex) created_at: datetime = datetime.now() # Define our Item Request/Response schema class Item(BaseModel): name: str quantity: int price: float ITEM_TYPE_NAME = 'item' ItemRequest = JsonApiRequest(ITEM_TYPE_NAME, Item) ItemResponse = JsonApiResponse(ITEM_TYPE_NAME, Item) def marshal_item(item: ItemData) -> dict: return { 'id': item.id, 'type': ITEM_TYPE_NAME, 'attributes': { 'name': item.name, 'quantity': item.quantity, 'price': item.price, }, }
from pydantic import BaseModel from pydantic_jsonapi import JsonApiRequest class ItemModel(BaseModel): name: str quantity: int price: float class ItemModelWithOrmMode(BaseModel): name: str quantity: int price: float class Config: orm_mode = True item_type_name = 'item' ItemRequest = JsonApiRequest(item_type_name, ItemModel)