diff --git a/Mirador_backend/models.py b/Mirador_backend/models.py index c35529c34ba82bc88086b71c0c3d8e50d95a5e59..e6e15a9c64e07f3ecf7e17309fac7dee326b03f2 100644 --- a/Mirador_backend/models.py +++ b/Mirador_backend/models.py @@ -22,7 +22,7 @@ class BaseModel(DeclarativeBase): engine = getApp().db.engine """Access the db session""" - fillable = [] + fillable = ['id'] """Field that can be overriden by self.fill()""" id = mapped_column(Integer, primary_key=True) @@ -138,7 +138,8 @@ class BaseModel(DeclarativeBase): def clear(self): """Clears all the fields of the object""" for x in self.fields.keys(): - setattr(self, x, None) + if x != 'id': + setattr(self, x, None) return self def create(self, data): @@ -177,8 +178,8 @@ class MiradorResource(BaseModel): content = mapped_column(JSON) """JSON content of the resource""" - fillable = ['content'] - fields = { + fillable = BaseModel.fillable + ['content'] + fields = BaseModel.fields | { 'id': fields.Integer, 'content': fields.String } diff --git a/Mirador_backend/resources/base.py b/Mirador_backend/resources/base.py index ab1721e0d08538048b71a64a43738d506e259612..e264ec229954b9ebb6ee29d06042912c10696dc6 100644 --- a/Mirador_backend/resources/base.py +++ b/Mirador_backend/resources/base.py @@ -10,6 +10,9 @@ from flask_apispec import doc from flask_restful import marshal, fields from Mirador_backend.models import BaseModel, NotFound +from Mirador_backend.utils.app import getApp + +logger = getApp().logger class ResourceGroup(MethodResource, Resource): @@ -17,7 +20,7 @@ class ResourceGroup(MethodResource, Resource): def parseData(self, request): """Read the request and return only the useful data""" - return request.form + return request.json def get_queryset(self): """Get the queryset for the request""" @@ -31,7 +34,7 @@ class ResourceGroup(MethodResource, Resource): def post(self): """Handle a post request""" - m = Model().create(self.parseData(request)) + m = self.Model().create(self.parseData(request)) return marshal(m, self.Model.fields), 200 def genDoc(descr, tags): @@ -55,7 +58,7 @@ class ResourceItem(MethodResource, Resource): def parseData(self, request): """Read the request and return only the useful data""" - return request.form + return request.json def get(self, id): """Handle a get request""" @@ -70,21 +73,21 @@ class ResourceItem(MethodResource, Resource): m.fill(data) m = m.save() except NotFound: - m = self.Model.create(data) - return marshal(model, self.Model.fields), 200 - + data['id'] = id + m = self.Model().create(data) + return marshal(m, self.Model.fields), 200 def patch(self, id): """Handle a patch request""" m = self.get_queryset_or_abort(id) - m.clear() m.fill(self.parseData(request)) - return marshal(m.save(), self.Model.fields), 200 + m.save() + return marshal(m, self.Model.fields), 200 def delete(self, id): """Handle a delete request""" m = self.get_queryset_or_abort(id) - return marshal(m.delete(), fields.Boolean), 200 + return marshal({'success': m.delete()}, {'success': fields.Boolean}), 200 def genDoc(descr, tags): doc(description=f'Get {descr} by id', tags=tags)(ResourceItem.get) diff --git a/Mirador_backend/tests/test_mirador_resource.py b/Mirador_backend/tests/test_mirador_resource.py index a0a05581b9dbbe998773de46cb1e65241858c1d1..29e89b4021b6276788ca8cf445cb0138334a9b4b 100644 --- a/Mirador_backend/tests/test_mirador_resource.py +++ b/Mirador_backend/tests/test_mirador_resource.py @@ -4,21 +4,60 @@ from Mirador_backend.tests.tester import TestCase class MiradorResourceTest(TestCase): + headers = {"Content-Type": "application/json"} + def getData(self): return self.getFixtureRecordsByModel(self.fixtures[0], 'Mirador_backend.models.MiradorResource') + def get(self, id, inFixtures=True, raw=None): + response = self.client.get(f'{self.base}/{id}', headers=self.headers) + if inFixtures: + self.assertGoodResponse(response, next(x for x in self.getData() if x['id'] == 1)) + elif raw is not None: + self.assertGoodResponse(response, raw) + else: + self.assertBadResponse(response, 404) + def testGetOne(self): - id = 1 - payload = json.dumps({}) - response = self.client.get(f'{self.base}/{id}', headers={"Content-Type": "application/json"}, data=payload) + self.get(1) - self.assertEqual(200, response.status_code) + def testGetAll(self): + response = self.client.get(self.base, headers=self.headers) + self.assertGoodResponse(response, {str(x['id']): x for x in self.getData()}) - expected = next(x for x in self.getData() if x['id'] == id) - self.assertEqual(expected, response.json) + def testPut(self): + id = 3 + self.get(id, False) + data = {'content': '{"a":"b"}'} + payload = json.dumps(data) + response = self.client.put(f'{self.base}/{id}', headers=self.headers, data=payload) + data['id'] = id + self.assertGoodResponse(response, data) + self.get(id, False, data) - def testGetAll(self): - payload = json.dumps({}) - response = self.client.get(self.base, headers={"Content-Type": "application/json"}, data=payload) - self.assertEqual(200, response.status_code) - self.assertEqual({str(x['id']): x for x in self.getData()}, response.json) + def testPost(self): + id = 2 + self.get(id, False) + data = {'content': '{"a":"b"}'} + payload = json.dumps(data) + response = self.client.post(f'{self.base}', headers=self.headers, data=payload) + data['id'] = id + self.assertGoodResponse(response, data) + self.get(id, False, data) + + def testPatch(self): + id = 1 + self.get(id) + data = {'content': '{"a":"b"}'} + payload = json.dumps(data) + response = self.client.patch(f'{self.base}/{id}', headers=self.headers, data=payload) + data['id'] = id + self.assertGoodResponse(response, data) + self.get(id, False, data) + + def testDelete(self): + id = 1 + self.get(id) + response = self.client.delete(f'{self.base}/{id}', headers=self.headers) + self.assertGoodResponse(response, {'success': True}) + self.get(id, False) diff --git a/Mirador_backend/tests/tester.py b/Mirador_backend/tests/tester.py index 57a9bff763954ead9f7f854f7e33bec6cc55d424..f2f6882b1c3e08cdf8e51d7bfef6a0d7da001298 100644 --- a/Mirador_backend/tests/tester.py +++ b/Mirador_backend/tests/tester.py @@ -16,6 +16,9 @@ class TestCase(unittest.TestCase, FixturesMixin): self.base = 'v1/mirador_resource' self.client = app.test_client() + def tearDown(self): + pass + def getFixture(self, name): with open(f'{dirname(abspath(__file__))}/fixtures/{name}') as f: return json.load(f) @@ -23,6 +26,9 @@ class TestCase(unittest.TestCase, FixturesMixin): def getFixtureRecordsByModel(self, name, model): return next(x['records'] for x in self.getFixture(name) if x['model'] == model) - def tearDown(self): - # TODO - pass + def assertBadResponse(self, response, expectedCode): + self.assertEqual(expectedCode, response.status_code) + + def assertGoodResponse(self, response, expectedData): + self.assertEqual(200, response.status_code) + self.assertEqual(expectedData, response.json)