diff --git a/app/api/v1/__init__.py b/app/api/v1/__init__.py index af06015..a419e8f 100644 --- a/app/api/v1/__init__.py +++ b/app/api/v1/__init__.py @@ -1,7 +1,10 @@ from flask import Blueprint from flask_restful import Api - +from .views import ParcelList, IndividualParcel version1 = Blueprint('v1', __name__, url_prefix="/api/v1") api = Api(version1) + +api.add_resource(ParcelList, '/parcels') +api.add_resource(IndividualParcel, '/parcels/') \ No newline at end of file diff --git a/app/api/v1/models.py b/app/api/v1/models.py index e69de29..6e24a12 100644 --- a/app/api/v1/models.py +++ b/app/api/v1/models.py @@ -0,0 +1,37 @@ + +parcels = [] + +class Parcels: + """ + Class with CRUD functionalities on the Parcels resource + """ + def __init__(self): + self.db = parcels + + def create_order(self, item, pickup, dest, pricing): + """ + instance method to generate new entry into delivery orders list + """ + payload = { + "id" : len(self.db) + 1, + "itemName" : item, + "pickupLocation" : pickup, + "destination" : dest, + "pricing" : pricing + } + self.db.append(payload) + + def order_list(self): + """ + retrieves entire list of delivery orders + """ + return self.db + + def retrieve_single_order(self, parcelID): + """ + retrive a single order by id + """ + order_by_id = [parc for parc in self.db if parc['id'] == parcelID][0] + return order_by_id + + \ No newline at end of file diff --git a/app/api/v1/views.py b/app/api/v1/views.py index 2842140..6f0b6be 100644 --- a/app/api/v1/views.py +++ b/app/api/v1/views.py @@ -1,19 +1,55 @@ from flask_restful import Resource from flask import make_response, jsonify, request +from .models import Parcels +order = Parcels() class ParcelList(Resource): - + """ + class for Create order and retrieve list of orders API endpoints + """ def post(self): - pass + """ + post method to add new order to list of orders + """ + data = request.get_json() + item = data['item'] + pickup = data['pickup'] + dest = data['dest'] + pricing = data['pricing'] + order.create_order(item, pickup, dest, pricing) + orders = order.db + return make_response(jsonify({ + "message" : "delivery order created successfully", + "orders" : orders + }), 201) + def get(self): - pass + """ + get method to retrieve list of all orders + """ + resp = order.order_list() + return make_response(jsonify({ + "message" : "ok", + "Delivery Orders" : resp + }), 200) class IndividualParcel(Resource): - + """ + class for API endpoints for retrieving single order and cancelling particular order + """ def get(self, id): - pass + """ + get method to retrieve order by id + """ + single = order.retrieve_single_order(id) + return make_response(jsonify({ + "message" : "Ok", + "order" : single + }), 200) + def put(self, id): - pass \ No newline at end of file + pass + \ No newline at end of file diff --git a/app/tests/__init__.py b/app/tests/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/tests/test_parcels.py b/app/tests/test_parcels.py new file mode 100644 index 0000000..fa4c28c --- /dev/null +++ b/app/tests/test_parcels.py @@ -0,0 +1,46 @@ +from .. import create_app +import unittest +import json + +class TestPracelCreation(unittest.TestCase): + """ + class for Parcels test case + """ + def setUp(self): + """ + Initialize app and define test variables + """ + create_app().testing = True + self.app = create_app().test_client() + self.data = { + "item" : "seven ballons", + "pickup" : "Biashara street", + "dest" : "Kikuyu town", + "pricing": "250 ksh" + } + + def test_POST_create_delivery_order(self): + """ + Test whether API can create a new delivery order via POSt request + """ + response = self.app.post('/api/v1/parcels', data=json.dumps(self.data), content_type='application/json') + result = json.loads(response.data) + self.assertEqual(response.status_code, 201) + self.assertIn('seven ballons', str(result)) + + def test_GET_delivery_orders_list(self): + """ + Test if API can retrieve a list of delivery orders + """ + response = self.app.post('/api/v1/parcels', data=json.dumps(self.data), content_type='application/json') + self.assertEqual(response.status_code, 201) + response = self.app.get('/api/v1/parcels', content_type='application/json') + self.assertEqual(response.status_code, 200) + result = json.loads(response.data) + self.assertIn('seven ballons', str(result)) + + +# make the tests you have written executable + +if __name__ == "__main__": + unittest.main() \ No newline at end of file diff --git a/app/tests/v1/__init__.py b/app/tests/v1/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/app/tests/v1/test_create_parcel.py b/app/tests/v1/test_create_parcel.py new file mode 100644 index 0000000..fad3dcc --- /dev/null +++ b/app/tests/v1/test_create_parcel.py @@ -0,0 +1,25 @@ +from .. import create_app +import unittest +import json + +class TestPracelCreation(unittest.TestCase): + def setUp(self): + create_app().testing = True + self.app = create_app().test_client() + self.data = { + "item" : "seven ballons", + "pickup" : "Biashara street", + "dest" : "Kikuyu town", + "pricing": "250 ksh" + } + + def test_POST_create_delivery_order(self): + response = self.app.post('/api/v1/parcels', data=json.dumps(self.data), content_type='application/json') + result = json.loads(response.data) + self.assertEqual(response.status_code, 201) + self.assertIn('seven ballons', str(result)) + +# make the tests you have written executable + +if __name__ == "__main__": + unittest.main() \ No newline at end of file diff --git a/app/tests/v1/test_parcels.py b/app/tests/v1/test_parcels.py new file mode 100644 index 0000000..69510d2 --- /dev/null +++ b/app/tests/v1/test_parcels.py @@ -0,0 +1,35 @@ +from .. import create_app +import unittest +import json + +class TestPracelCreation(unittest.TestCase): + def setUp(self): + create_app().testing = True + self.app = create_app().test_client() + self.data = { + "item" : "seven ballons", + "pickup" : "Biashara street", + "dest" : "Kikuyu town", + "pricing": "250 ksh" + } + + def test_POST_create_delivery_order(self): + response = self.app.post('/api/v1/parcels', data=json.dumps(self.data), content_type='application/json') + result = json.loads(response.data) + self.assertEqual(response.status_code, 201) + self.assertIn('seven ballons', str(result)) + + def test_GET_delivery_orders_list(self): + """Test if API can retrieve a list of delivery orders""" + response = self.app.post('/api/v1/parcels', data=json.dumps(self.data), content_type='application/json') + self.assertEqual(response.status_code, 201) + response = self.app.get('/api/v1/parcels', content_type='application/json') + self.assertEqual(response.status_code, 200) + result = json.loads(response.data) + self.assertIn('seven ballons', str(result)) + + +# make the tests you have written executable + +if __name__ == "__main__": + unittest.main() \ No newline at end of file diff --git a/requirements.txt b/requirements.txt index e69de29..5fa0e4c 100644 --- a/requirements.txt +++ b/requirements.txt @@ -0,0 +1,24 @@ +aniso8601==4.0.1 +astroid==2.0.4 +atomicwrites==1.2.1 +attrs==18.2.0 +Click==7.0 +Flask==1.0.2 +Flask-RESTful==0.3.6 +isort==4.3.4 +itsdangerous==1.1.0 +Jinja2==2.10 +lazy-object-proxy==1.3.1 +MarkupSafe==1.0 +mccabe==0.6.1 +more-itertools==4.3.0 +pkg-resources==0.0.0 +pluggy==0.8.0 +py==1.7.0 +pylint==2.1.1 +pytest==3.10.0 +pytz==2018.7 +six==1.11.0 +typed-ast==1.1.0 +Werkzeug==0.14.1 +wrapt==1.10.11