From fd787fba40bd2c4cb14edd65c70615af2629040d Mon Sep 17 00:00:00 2001 From: Kizito Akhilome Date: Fri, 7 Sep 2018 13:34:57 +0100 Subject: [PATCH] feat(api): create endpoint to update order status - write unit tests for PUT /api/v1/orders/ - write code to make test pass [Finishes #160239657] --- server/controllers/orderController.js | 23 ++++++++++ server/middleware/findSingleOrder.js | 1 + server/routes/routes.js | 1 + tests/routes/routes.spec.js | 60 +++++++++++++++++++++------ 4 files changed, 73 insertions(+), 12 deletions(-) diff --git a/server/controllers/orderController.js b/server/controllers/orderController.js index cb840a0..5a594e9 100644 --- a/server/controllers/orderController.js +++ b/server/controllers/orderController.js @@ -33,6 +33,29 @@ class OrderController { order, }); } + + static updateOrder(req, res) { + const { orderIndex } = req; + const { status } = req.body; + + if (orderIndex === -1) { + return res.status(404).json({ + error: 'no such order exists', + }); + } + + if (!status) { + return res.status(400).json({ + error: 'no new status specified', + }); + } + + orders[orderIndex].status = status; + return res.status(201).json({ + message: 'order status updated successfully', + order: orders[orderIndex], + }); + } } export default OrderController; diff --git a/server/middleware/findSingleOrder.js b/server/middleware/findSingleOrder.js index 2b8e6dd..c302a43 100644 --- a/server/middleware/findSingleOrder.js +++ b/server/middleware/findSingleOrder.js @@ -4,6 +4,7 @@ const findOrder = (req, res, next) => { let { id } = req.params; id = Number(id); req.order = orders.find(order => order.id === id); + req.orderIndex = orders.findIndex(order => order.id === id); next(); }; diff --git a/server/routes/routes.js b/server/routes/routes.js index 9c65a58..99425c1 100644 --- a/server/routes/routes.js +++ b/server/routes/routes.js @@ -13,5 +13,6 @@ router.get('/', (req, res) => { router.get('/orders', OrderController.getAllOrders); router.get('/orders/:id', findOrder, OrderController.getOrder); router.post('/orders', OrderController.newOrder); +router.put('/orders/:id', findOrder, OrderController.updateOrder); export default router; diff --git a/tests/routes/routes.spec.js b/tests/routes/routes.spec.js index bd8cd07..111449d 100644 --- a/tests/routes/routes.spec.js +++ b/tests/routes/routes.spec.js @@ -8,6 +8,13 @@ import orders from '../../server/db/orders'; chai.use(chaiHttp); chai.use(dirtyChai); +const id = { + valid: Math.ceil(Math.random() * orders.length), + invalid: null, +}; + +const keys = ['id', 'author', 'title', 'status', 'date']; + describe('GET /api/v1/', () => { it('should respond with a 200 status code', (done) => { chai.request(app) @@ -29,7 +36,6 @@ describe('GET /api/v1/', () => { }); describe('GET /api/v1/orders/', () => { - const keys = ['id', 'author', 'title', 'status', 'date']; it('should respond with status 200', (done) => { chai.request(app) .get('/api/v1/orders/') @@ -60,17 +66,6 @@ describe('GET /api/v1/orders/', () => { }); describe('GET /api/v1/orders/', () => { - const id = { - valid: undefined, - invalid: undefined, - }; - const keys = ['id', 'author', 'title', 'status', 'date']; - - before(() => { - id.valid = Math.ceil(Math.random() * orders.length); - id.invalid = orders.length + 1; - }); - it('should respond with status 200 if order is found', (done) => { chai.request(app) .get(`/api/v1/orders/${id.valid}`) @@ -126,3 +121,44 @@ describe('POST /api/v1/orders', () => { }); }); }); + +describe('PUT /api/v1/orders/', () => { + it('should respond with an error if no status is provided', (done) => { + chai.request(app) + .put(`/api/v1/orders/${id.valid}`) + .send({ }) + .end((err, res) => { + res.should.have.status(400); + res.should.be.an('object').which.has.a.property('error'); + done(); + }); + }); + + it('should respond with an error if no order with provided id exists', (done) => { + chai.request(app) + .put(`/api/v1/orders/${id.invalid}`) + .send({ + status: 'done', + }) + .end((err, res) => { + res.should.have.status(404); + res.should.be.an('object').which.has.a.property('error'); + done(); + }); + }); + + it('should update the order and return a success message and the updated order', (done) => { + chai.request(app) + .put(`/api/v1/orders/${id.valid}`) + .send({ + status: 'completed', + }) + .end((err, res) => { + res.should.have.status(201); + res.body.should.be.an('object').with.all.keys('message', 'order'); + res.body.order.should.have.property('status'); + res.body.order.status.should.eql('completed'); + done(); + }); + }); +});