Skip to content

Commit 679f2f8

Browse files
committed
atomic create, add tests, create obj with relationship
1 parent 28fef45 commit 679f2f8

File tree

3 files changed

+59
-13
lines changed

3 files changed

+59
-13
lines changed

fastapi_jsonapi/atomic/atomic.py

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -112,16 +112,10 @@ async def view_atomic(
112112
previous_dl = dl
113113
if operation.action == "add":
114114
data = operation.jsonapi.schema_in_post(data=operation.data)
115-
created_object = await dl.create_object(
116-
data_create=data.data,
117-
view_kwargs={},
118-
)
119115
assert isinstance(operation.view, ListViewBase)
120116
view: "ListViewBase" = operation.view
121-
response = await view.response_for_created_object(
122-
dl=operation.data_layer,
123-
created_object=created_object,
124-
)
117+
response = await view.process_create_object(dl=operation.data_layer, data_create=data)
118+
# response.data.id
125119
results.append({"data": response.data})
126120
elif operation.action == "update":
127121
# TODO

fastapi_jsonapi/views/list_view.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
import logging
22
from typing import TYPE_CHECKING, Any, Dict
33

4-
from fastapi_jsonapi.data_typing import TypeModel
54
from fastapi_jsonapi.schema import (
65
BaseJSONAPIDataInSchema,
76
JSONAPIResultDetailSchema,
@@ -49,10 +48,11 @@ async def handle_post_resource_list(
4948
**extra_view_deps,
5049
) -> JSONAPIResultDetailSchema:
5150
dl: "BaseDataLayer" = await self.get_data_layer(extra_view_deps)
51+
return await self.process_create_object(dl=dl, data_create=data_create)
52+
53+
async def process_create_object(self, dl: "BaseDataLayer", data_create: BaseJSONAPIDataInSchema):
5254
created_object = await dl.create_object(data_create=data_create.data, view_kwargs={})
53-
return await self.response_for_created_object(dl=dl, created_object=created_object)
5455

55-
async def response_for_created_object(self, dl: "BaseDataLayer", created_object: TypeModel):
5656
created_object_id = dl.get_object_id(created_object)
5757

5858
view_kwargs = {dl.url_id_field: created_object_id}

tests/test_atomic/test_create_objects.py

Lines changed: 54 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,8 +9,8 @@
99
from starlette import status
1010

1111
from tests.misc.utils import fake
12-
from tests.models import User
13-
from tests.schemas import UserAttributesBaseSchema
12+
from tests.models import User, UserBio
13+
from tests.schemas import UserAttributesBaseSchema, UserBioBaseSchema
1414

1515
pytestmark = mark.asyncio
1616

@@ -198,3 +198,55 @@ async def test_atomic_rollback_on_create_error(
198198
)
199199
result: Result = await async_session.execute(stmt)
200200
assert result.scalar_one() == 0
201+
202+
async def test_create_bio_with_relationship_to_user_to_one(
203+
self,
204+
client: AsyncClient,
205+
async_session: AsyncSession,
206+
user_1: User,
207+
):
208+
user_bio = UserBioBaseSchema(
209+
birth_city=fake.city(),
210+
favourite_movies=fake.sentence(),
211+
)
212+
stmt_bio = select(UserBio).where(UserBio.user_id == user_1.id)
213+
res: Result = await async_session.execute(stmt_bio)
214+
assert res.scalar_one_or_none() is None, "user has to be w/o bio"
215+
216+
data_atomic_request = {
217+
"atomic:operations": [
218+
{
219+
"op": "add",
220+
"data": {
221+
"type": "user_bio",
222+
"attributes": user_bio.dict(),
223+
"relationships": {
224+
"user": {
225+
"data": {
226+
"id": user_1.id,
227+
"type": "user",
228+
},
229+
},
230+
},
231+
},
232+
},
233+
],
234+
}
235+
response = await client.post("/operations", json=data_atomic_request)
236+
assert response.status_code == status.HTTP_200_OK, response.text
237+
resp_data = response.json()
238+
assert resp_data
239+
results = resp_data["atomic:results"]
240+
assert len(results) == 1, results
241+
result_bio_data = results[0]
242+
res: Result = await async_session.execute(stmt_bio)
243+
user_bio_created: UserBio = res.scalar_one()
244+
assert user_bio == UserBioBaseSchema.from_orm(user_bio_created)
245+
assert result_bio_data == {
246+
"data": {
247+
"attributes": user_bio.dict(),
248+
"type": "user_bio",
249+
"id": str(user_bio_created.id),
250+
},
251+
"meta": None,
252+
}

0 commit comments

Comments
 (0)