From 87298f5d76de129ce619f1696f1663a8ea6cac31 Mon Sep 17 00:00:00 2001 From: barredterra <14891507+barredterra@users.noreply.github.com> Date: Thu, 3 Nov 2022 12:02:16 +0100 Subject: [PATCH] test: export query report as CSV --- frappe/tests/test_query_report.py | 41 ++++++++++++++++++++++++++++++- 1 file changed, 40 insertions(+), 1 deletion(-) diff --git a/frappe/tests/test_query_report.py b/frappe/tests/test_query_report.py index 7db4d0b4de..434eefb5d5 100644 --- a/frappe/tests/test_query_report.py +++ b/frappe/tests/test_query_report.py @@ -3,7 +3,7 @@ import frappe import frappe.utils -from frappe.desk.query_report import build_xlsx_data +from frappe.desk.query_report import build_xlsx_data, export_query from frappe.tests.utils import FrappeTestCase from frappe.utils.xlsxutils import make_xlsx @@ -69,3 +69,42 @@ class TestQueryReport(FrappeTestCase): for row in xlsx_data: # column_b should be 'str' even with composite cell value self.assertEqual(type(row[1]), str) + + def test_csv(self): + from csv import QUOTE_ALL, QUOTE_MINIMAL, QUOTE_NONE, QUOTE_NONNUMERIC, DictReader + from io import StringIO + + REPORT_NAME = "Test CSV Report" + REF_DOCTYPE = "DocType" + REPORT_COLUMNS = ["name", "module", "issingle"] + + if not frappe.db.exists("Report", REPORT_NAME): + report = frappe.new_doc("Report") + report.report_name = REPORT_NAME + report.ref_doctype = "User" + report.report_type = "Query Report" + report.query = frappe.qb.from_(REF_DOCTYPE).select(*REPORT_COLUMNS).limit(10).get_sql() + report.is_standard = "No" + report.save() + + for delimiter in (",", ";", "\t", "|"): + for quoting in (QUOTE_ALL, QUOTE_MINIMAL, QUOTE_NONE, QUOTE_NONNUMERIC): + frappe.local.form_dict = { + "report_name": REPORT_NAME, + "file_format_type": "CSV", + "csv_quoting": quoting, + "csv_delimiter": delimiter, + "include_indentation": 0, + "visible_idx": [0, 1, 2], + } + export_query() + + self.assertTrue(frappe.response["filename"].endswith(".csv")) + self.assertEqual(frappe.response["type"], "binary") + with StringIO(frappe.response["filecontent"].decode("utf-8")) as result: + reader = DictReader(result, delimiter=delimiter, quoting=quoting) + row = reader.__next__() + for column in REPORT_COLUMNS: + self.assertIn(column, row) + + frappe.delete_doc("Report", REPORT_NAME, delete_permanently=True)