Skip to content

Commit

Permalink
#7 update family
Browse files Browse the repository at this point in the history
  • Loading branch information
de1mos242 committed Mar 13, 2020
1 parent bd18dd4 commit afe37a8
Show file tree
Hide file tree
Showing 4 changed files with 62 additions and 7 deletions.
6 changes: 5 additions & 1 deletion family_api/controllers/family.py
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
from aiohttp.web_exceptions import HTTPNotFound

from family_api.repositories import family_member_repository, baby_repository
from family_api.repositories import family_member_repository, baby_repository, family_repository
from family_api.repositories.family_repository import insert_family, get_by_id


Expand All @@ -18,3 +18,7 @@ async def get_family_info(family_id: int, conn):
family['members'] = await family_member_repository.find_by_family_id(family_id, conn)
family['babies'] = await baby_repository.find_by_family_id(family_id, conn)
return family


async def update_family(family_id: int, family_data, conn):
return await family_repository.update_family(family_id, family_data, conn)
6 changes: 5 additions & 1 deletion family_api/repositories/family_repository.py
Original file line number Diff line number Diff line change
Expand Up @@ -5,5 +5,9 @@ async def insert_family(family_obj, conn) -> int:
return await conn.scalar(families_table.insert().values(family_obj))


async def get_by_id(family_id, conn) -> dict:
async def update_family(family_id, family_obj, conn) -> int:
return await conn.execute(families_table.update().values(family_obj).where(families_table.c.id == family_id))


async def get_by_id(family_id, conn):
return await (await conn.execute(families_table.select().where(families_table.c.id == family_id))).first()
16 changes: 14 additions & 2 deletions family_api/views/family_view.py
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
from aiohttp import web
from aiohttp_apispec import docs, request_schema, response_schema

from family_api.controllers.family import register_family, get_family_info
from family_api.controllers.family import register_family, get_family_info, update_family
from family_api.controllers.family_member import add_family_member
from family_api.decorators import is_current_user_in_family
from family_api.schemas import FamilySchema
Expand All @@ -20,7 +20,7 @@ async def post(self):
async with self.request.app['db'].acquire() as conn:
stored_family = await register_family(family_obj, conn)
await add_family_member(stored_family, UUID(self.request['token_data']['user_claims']['uuid']), conn)
return web.json_response(schema.dump(stored_family))
return web.json_response(schema.dump(stored_family))


class FamilyView(web.View):
Expand All @@ -34,3 +34,15 @@ async def get(self):
async with self.request.app['db'].acquire() as conn:
family = await get_family_info(family_id, conn)
return web.json_response(schema.dump(family))

@docs(summary="Update family info",
responses={204: "Successfully updated"})
@request_schema(FamilySchema())
@is_current_user_in_family
async def put(self):
schema = FamilySchema()
family_id = self.request.match_info['family_id']
family_obj = schema.load(await self.request.json())
async with self.request.app['db'].acquire() as conn:
await update_family(family_id, family_obj, conn)
return web.Response(status=204)
41 changes: 38 additions & 3 deletions tests/test_family.py
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
from aiohttp import web
from aiohttp.test_utils import TestClient

from family_api.models import families_table
from family_api.repositories import family_repository, family_member_repository, baby_repository


Expand All @@ -18,13 +17,13 @@ async def test_create_family(app: web.Application, cli: TestClient, make_headers
assert response['id'] > 0

async with app['db'].acquire() as conn:
stored_family = await (
await conn.execute(families_table.select().where(families_table.c.id == response['id']))).first()
stored_family = await family_repository.get_by_id(response['id'], conn)
assert stored_family is not None
assert stored_family.id == response['id']
assert stored_family.title == "My super family"


# pylint: disable=too-many-arguments
async def test_get_family_info(app: web.Application, cli: TestClient, make_headers, family_factory,
family_member_factory, baby_factory):
user_uuid = str(uuid4())
Expand All @@ -36,6 +35,14 @@ async def test_get_family_info(app: web.Application, cli: TestClient, make_heade
baby = baby_factory.create(family_id=family['id'])
baby['id'] = await baby_repository.insert_baby(baby, conn)

another_family = family_factory.create()
another_family['id'] = await family_repository.insert_family(another_family, conn)

resp = await cli.get(f"/v1/family/{another_family['id']}", headers=make_headers(user_uuid))
assert resp.status == 403, await resp.text()
resp = await cli.get(f"/v1/family/{1000000}", headers=make_headers(user_uuid))
assert resp.status == 403, await resp.text()

resp = await cli.get(f"/v1/family/{family['id']}", headers=make_headers(user_uuid))
assert resp.status == 200, await resp.text()

Expand All @@ -51,3 +58,31 @@ async def test_get_family_info(app: web.Application, cli: TestClient, make_heade
assert response['babies'][0]['uuid'] == baby['baby_uuid']
assert response['babies'][0]['first_name'] == baby['first_name']
assert response['babies'][0]['date_of_birth'] == baby['date_of_birth'].strftime("%Y-%m-%dT%H:%M:%S.%f")


async def test_rename_family(app: web.Application, cli: TestClient, make_headers, family_factory,
family_member_factory):
user_uuid = str(uuid4())
async with app['db'].acquire() as conn:
family = family_factory.create()
family['id'] = await family_repository.insert_family(family, conn)
family_member = family_member_factory.create(family_id=family['id'], user_uuid=user_uuid)
family_member['id'] = await family_member_repository.insert_family_member(family_member, conn)
another_family = family_factory.create()
another_family['id'] = await family_repository.insert_family(another_family, conn)

resp = await cli.put(f"/v1/family/{another_family['id']}",
data=json.dumps({'title': "My super family"}),
headers=make_headers(user_uuid))
assert resp.status == 403, await resp.text()

resp = await cli.put(f"/v1/family/{family['id']}",
data=json.dumps({'title': "My super family"}),
headers=make_headers(user_uuid))
assert resp.status == 204, await resp.text()

async with app['db'].acquire() as conn:
stored_family = await family_repository.get_by_id(family['id'], conn)
assert stored_family is not None
assert stored_family.id == family['id']
assert stored_family.title == "My super family"

0 comments on commit afe37a8

Please sign in to comment.