Skip to content
5 changes: 4 additions & 1 deletion app/api/v1/__init__.py
Original file line number Diff line number Diff line change
@@ -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/<int:id>')
37 changes: 37 additions & 0 deletions app/api/v1/models.py
Original file line number Diff line number Diff line change
@@ -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


48 changes: 42 additions & 6 deletions app/api/v1/views.py
Original file line number Diff line number Diff line change
@@ -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
pass

Empty file added app/tests/__init__.py
Empty file.
Empty file added app/tests/v1/__init__.py
Empty file.
55 changes: 55 additions & 0 deletions app/tests/v1/test_parcels.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
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))

def test_GET_single_delivery_order(self):
"""
Test if API can retrieve a single delivery order by its id
"""
response = self.app.post('/api/v1/parcels', data=json.dumps(self.data), content_type='application/json')
self.assertEqual(response.status_code, 201)
result = self.app.get('/api/v1/parcels/1')
self.assertEqual(result.status_code, 200)
self.assertIn('seven ballons', str(result.data))

# make the tests you have written executable

if __name__ == "__main__":
unittest.main()
24 changes: 24 additions & 0 deletions requirements.txt
Original file line number Diff line number Diff line change
@@ -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