| # Copyright (c) 2021, Frappe Technologies Pvt. Ltd. and Contributors |
| # License: GNU General Public License v3. See license.txt |
| |
| from typing import Any, Dict, NewType, Optional |
| |
| import frappe |
| from frappe.core.doctype.report.report import get_report_module_dotted_path |
| |
| ReportFilters = Dict[str, Any] |
| ReportName = NewType("ReportName", str) |
| |
| def create_test_contact_and_address(): |
| frappe.db.sql('delete from tabContact') |
| frappe.db.sql('delete from `tabContact Email`') |
| frappe.db.sql('delete from `tabContact Phone`') |
| frappe.db.sql('delete from tabAddress') |
| frappe.db.sql('delete from `tabDynamic Link`') |
| |
| frappe.get_doc({ |
| "doctype": "Address", |
| "address_title": "_Test Address for Customer", |
| "address_type": "Office", |
| "address_line1": "Station Road", |
| "city": "_Test City", |
| "state": "Test State", |
| "country": "India", |
| "links": [ |
| { |
| "link_doctype": "Customer", |
| "link_name": "_Test Customer" |
| } |
| ] |
| }).insert() |
| |
| contact = frappe.get_doc({ |
| "doctype": 'Contact', |
| "first_name": "_Test Contact for _Test Customer", |
| "links": [ |
| { |
| "link_doctype": "Customer", |
| "link_name": "_Test Customer" |
| } |
| ] |
| }) |
| contact.add_email("test_contact_customer@example.com", is_primary=True) |
| contact.add_phone("+91 0000000000", is_primary_phone=True) |
| contact.insert() |
| |
| contact_two = frappe.get_doc({ |
| "doctype": 'Contact', |
| "first_name": "_Test Contact 2 for _Test Customer", |
| "links": [ |
| { |
| "link_doctype": "Customer", |
| "link_name": "_Test Customer" |
| } |
| ] |
| }) |
| contact_two.add_email("test_contact_two_customer@example.com", is_primary=True) |
| contact_two.add_phone("+92 0000000000", is_primary_phone=True) |
| contact_two.insert() |
| |
| |
| def execute_script_report( |
| report_name: ReportName, |
| module: str, |
| filters: ReportFilters, |
| default_filters: Optional[ReportFilters] = None, |
| optional_filters: Optional[ReportFilters] = None |
| ): |
| """Util for testing execution of a report with specified filters. |
| |
| Tests the execution of report with default_filters + filters. |
| Tests the execution using optional_filters one at a time. |
| |
| Args: |
| report_name: Human readable name of report (unscrubbed) |
| module: module to which report belongs to |
| filters: specific values for filters |
| default_filters: default values for filters such as company name. |
| optional_filters: filters which should be tested one at a time in addition to default filters. |
| """ |
| |
| if default_filters is None: |
| default_filters = {} |
| |
| test_filters = [] |
| report_execute_fn = frappe.get_attr(get_report_module_dotted_path(module, report_name) + ".execute") |
| report_filters = frappe._dict(default_filters).copy().update(filters) |
| |
| test_filters.append(report_filters) |
| |
| if optional_filters: |
| for key, value in optional_filters.items(): |
| test_filters.append(report_filters.copy().update({key: value})) |
| |
| for test_filter in test_filters: |
| try: |
| report_execute_fn(test_filter) |
| except Exception: |
| print(f"Report failed to execute with filters: {test_filter}") |
| raise |