From 03f23990be77403c9f962516191c2080ab856b63 Mon Sep 17 00:00:00 2001 From: crazyplayy <48414755+crazyplayy@users.noreply.github.com> Date: Mon, 11 Sep 2023 15:26:28 +0100 Subject: [PATCH] Feat: Run metrics are now downloaded as zip (#816) Needs to be tested in LIVE environment to compare the behavior happening in DEV. --- web/api/maestro_api/controllers/run_metric.py | 20 +++++++++++++++---- web/api/tests/routes/test_run_metric.py | 12 ++++++++++- 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/web/api/maestro_api/controllers/run_metric.py b/web/api/maestro_api/controllers/run_metric.py index ea3bd0f5..5ac9ebf0 100644 --- a/web/api/maestro_api/controllers/run_metric.py +++ b/web/api/maestro_api/controllers/run_metric.py @@ -1,3 +1,6 @@ +import time +from zipfile import ZipFile, ZipInfo, ZIP_DEFLATED +from io import BytesIO from flask import request, jsonify, send_file from maestro_api.db.models.run import Run @@ -67,16 +70,25 @@ def download(self, run_id, data, user): ] filename = f"metrics_{run.id}.csv" - content_type = "text/csv" binary_file = CsvBytesIO.create_from_dict(headers, jmeter_metrics) + zip_buffer = BytesIO() + zip_filename = f"run_metrics_{run.id}.zip" + + with ZipFile(zip_buffer, "w", compression=ZIP_DEFLATED) as zip_file: + csv_info = ZipInfo(filename) + csv_info.date_time = time.localtime(time.time())[:6] + zip_file.writestr(csv_info, binary_file.getvalue()) + + zip_buffer.seek(0) + return ( send_file( - binary_file, + zip_buffer, as_attachment=True, - download_name=filename, - mimetype=content_type, + download_name=zip_filename, + mimetype="application/zip", ), 200, ) diff --git a/web/api/tests/routes/test_run_metric.py b/web/api/tests/routes/test_run_metric.py index 98256af1..4a7d5d7b 100644 --- a/web/api/tests/routes/test_run_metric.py +++ b/web/api/tests/routes/test_run_metric.py @@ -1,3 +1,5 @@ +import io +import zipfile import json from datetime import datetime, timedelta @@ -409,4 +411,12 @@ def test_run_metrics_download(client): ) assert 200 == response.status_code - assert file_content == response.data.decode("utf-8") + assert "application/zip" in response.content_type + + zip_data = io.BytesIO(response.data) + with zipfile.ZipFile(zip_data, "r") as zip_file: + assert len(zip_file.namelist()) == 1 + csv_file_name = zip_file.namelist()[0] + + csv_content = zip_file.read(csv_file_name).decode("utf-8") + assert csv_content == file_content