From 6982ee29ac89a0bfedb5d1836429acfec7058668 Mon Sep 17 00:00:00 2001 From: Simon Cross Date: Tue, 12 May 2020 22:43:31 +0200 Subject: [PATCH] Add support for cancelling brews. --- coffee/api.py | 21 ++++++++++++++++++++- coffee/tests/test_api.py | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 55 insertions(+), 1 deletion(-) diff --git a/coffee/api.py b/coffee/api.py index 73a3bce..12962c2 100644 --- a/coffee/api.py +++ b/coffee/api.py @@ -99,7 +99,7 @@ def beverage_queue(self, beverage): def brewables(self, person): brewables = [] - for queue in self._queues.itervalues(): + for queue in self._queues.values(): items = [b for b in queue if b.person == person] for b in items: if b.ready: @@ -119,6 +119,19 @@ def brew(self, data): queue.append(brewable) return brewable + def cancel(self, person): + cancelled = [] + for queue in self._queues.values(): + items = [b for b in queue if b.person == person] + for b in items: + if b.ready: + queue.remove(b) + cancelled.extend(items) + for b in items: + queue.remove(b) + cancelled.sort(key=lambda b: b.ready_at) + return cancelled + @app.route('/') def index(): @@ -146,6 +159,12 @@ def api_v1_brew(person, beverage, subtype=None): return jsonify(brew=brewable.to_dict()), 201 +@app.route('/api/v1/person//cancel', methods=['POST']) +def api_v1_cancel(person): + cancelled = kitchen.cancel(person) + return jsonify(cancelled=[brew.to_dict() for brew in cancelled]), 200 + + @app.route('/api/v1/person//status', methods=['GET']) def api_v1_status(person): brewables = kitchen.brewables(person) diff --git a/coffee/tests/test_api.py b/coffee/tests/test_api.py index edab306..49b5ab7 100644 --- a/coffee/tests/test_api.py +++ b/coffee/tests/test_api.py @@ -67,3 +67,38 @@ def test_v1_brew_subtype(self): "subtype": "mocha", } } + + def test_v1_cancel_empty_queue(self): + rv = self.app.post('/api/v1/person/me/cancel') + assert json.loads(rv.data) == { + "cancelled": [], + } + + def test_v1_cancel_queue_with_brewables(self): + kitchen.brew({"person": "me", "beverage": "coffee"}) + kitchen.brew({"person": "me", "beverage": "coffee"}) + kitchen.brew({"person": "me", "beverage": "tea"}) + rv = self.app.post('/api/v1/person/me/cancel') + assert json.loads(rv.data) == { + "cancelled": [ + { + "beverage": "coffee", + "person": "me", + "status": "brewing", + "subtype": None, + }, + { + "beverage": "coffee", + "person": "me", + "status": "waiting", + "subtype": None, + }, + { + "beverage": "tea", + "person": "me", + "status": "brewing", + "subtype": None, + }, + ], + } + assert kitchen.brewables("me") == []