Skip to content
Snippets Groups Projects
Verified Commit b96e67e1 authored by David Beniamine's avatar David Beniamine
Browse files

All CRUD tests passing

parent a013bb51
Branches
No related tags found
1 merge request!2Draft:Generic api v1
......@@ -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,6 +138,7 @@ class BaseModel(DeclarativeBase):
def clear(self):
"""Clears all the fields of the object"""
for x in self.fields.keys():
if x != 'id':
setattr(self, x, None)
return self
......@@ -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
}
......@@ -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)
......
......@@ -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)
......@@ -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)
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment