From 18aee3cc9e39c567649c0a757f80eb360631351d Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Mon, 25 Feb 2019 14:49:11 -0800 Subject: [PATCH 1/4] Add a 'datapoint_not_found' class method to utils.ErrorResponse --- src/trendlines/error_responses.py | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/trendlines/error_responses.py b/src/trendlines/error_responses.py index 6e12e84..8906b32 100644 --- a/src/trendlines/error_responses.py +++ b/src/trendlines/error_responses.py @@ -32,6 +32,11 @@ def metric_not_found(cls, name): detail = "The metric '{}' does not exist".format(name) return error_response(404, ErrorResponseType.NOT_FOUND, detail) + @classmethod + def datapoint_not_found(cls, datapoint_id): + detail = "The datapoint '{}' does not exist".format(datapoint_id) + return error_response(404, ErrorResponseType.NOT_FOUND, detail) + @classmethod def metric_has_no_data(cls, name): detail = "No data exists for metric '{}'.".format(name) From 2c36af452260728b831a2d46c7a4009798936b9f Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Mon, 25 Feb 2019 14:50:19 -0800 Subject: [PATCH 2/4] Fill in the DELETE datapoint route. --- src/trendlines/routes.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/src/trendlines/routes.py b/src/trendlines/routes.py index d471361..f7231fc 100644 --- a/src/trendlines/routes.py +++ b/src/trendlines/routes.py @@ -153,7 +153,15 @@ def api_delete_datapoint(datapoint_id): """ Delete a datapoint. """ - pass + logger.debug("'api: DELETE datapoint '%s'" % datapoint_id) + + try: + found = db.DataPoint.get(db.DataPoint.datapoint_id == datapoint_id) + found.delete_instance() + except DoesNotExist: + return ErrorResponse.datapoint_not_found(datapoint_id) + else: + return "", 204 @api.route("/api/v1/metric", methods=["GET"]) From 388680a8ad35d067aa76e4df16d8035a9eb3070e Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Mon, 25 Feb 2019 14:50:35 -0800 Subject: [PATCH 3/4] Add tests for DELETE datapoint route to test_routes.py --- tests/test_routes.py | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/tests/test_routes.py b/tests/test_routes.py index be6d53b..b371801 100644 --- a/tests/test_routes.py +++ b/tests/test_routes.py @@ -77,6 +77,28 @@ def test_api_get_data_as_json_no_data_for_metric(client, populated_db): assert 'No data exists for metric' in d['detail'] +def test_api_delete_datapoint(client, populated_db): + datapoint_id = 6 + rv = client.delete("/api/v1/datapoint/{}".format(datapoint_id)) + assert rv.status_code == 204 + + # Verify it's actually been deleted + # TODO: needs the datapoint GET route + # after = client.get("/api/v1/datapoint/{}".format(datapoint_id)) + # assert after.status_code == 404 + + +def test_api_delete_datapoint_not_found(client, populated_db, caplog): + datapoint_id = 103132 + rv = client.delete("/api/v1/datapoint/{}".format(datapoint_id)) + assert rv.status_code == 404 + assert rv.is_json + d = rv.get_json() + assert str(datapoint_id) in d['detail'] + assert d['title'] == "NOT_FOUND" + assert "API error" in caplog.text + + def test_api_get_metric_as_json(client, populated_db, caplog): rv = client.get("/api/v1/metric/foo") assert rv.status_code == 200 From 33f42c22e1cf4d8c14f16d08e5e369596f7dfcb5 Mon Sep 17 00:00:00 2001 From: Douglas Thor Date: Mon, 25 Feb 2019 14:52:33 -0800 Subject: [PATCH 4/4] Update changelog --- CHANGELOG.md | 1 + 1 file changed, 1 insertion(+) diff --git a/CHANGELOG.md b/CHANGELOG.md index e434df9..b34b926 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -15,6 +15,7 @@ + `POST /api/v1/metric` has been implemented (#74) + `PUT /api/v1/metric/` has been implemented (#75) + `PATCH /api/v1/metric/` has been implemented (#83) ++ `DELETE /api/v1/datapoint/` has been implemented (#57) + Error responses for the REST API have been refactored (#85) + Additional tests for PUT/PATCH metric have been added (#86) + Make use of peewee's `playhouse` extensions for converting model instances