From 65e0ae21712d4d9a091b96b8cdc69c73cf9f99eb Mon Sep 17 00:00:00 2001 From: Himanshu Warekar Date: Mon, 10 Jun 2019 11:24:24 +0530 Subject: [PATCH] test: new test cases for sla --- erpnext/support/doctype/issue/issue.py | 10 +- erpnext/support/doctype/issue/test_issue.py | 60 +++++++- .../service_level/test_service_level.py | 144 ++++++------------ .../service_level_agreement.py | 2 +- .../test_service_level_agreement.py | 52 +++++-- 5 files changed, 146 insertions(+), 122 deletions(-) diff --git a/erpnext/support/doctype/issue/issue.py b/erpnext/support/doctype/issue/issue.py index 525f8293f6..773e61a516 100644 --- a/erpnext/support/doctype/issue/issue.py +++ b/erpnext/support/doctype/issue/issue.py @@ -11,7 +11,7 @@ from frappe.utils import now, time_diff_in_hours, now_datetime, getdate, get_wee from datetime import datetime, timedelta from frappe.model.mapper import get_mapped_doc from frappe.utils.user import is_website_user -from ..service_level_agreement.service_level_agreement import get_active_service_level_agreement_for +from erpnext.support.doctype.service_level_agreement.service_level_agreement import get_active_service_level_agreement_for from erpnext.crm.doctype.opportunity.opportunity import assign_to_user from frappe.email.inbox import link_communication_to_document @@ -63,10 +63,10 @@ class Issue(Document): def update_status(self): status = frappe.db.get_value("Issue", self.name, "status") if self.status!="Open" and status =="Open" and not self.first_responded_on: - self.first_responded_on = now_datetime() + self.first_responded_on = frappe.flags.current_time or now_datetime() if self.status=="Closed" and status !="Closed": - self.resolution_date = now_datetime() + self.resolution_date = frappe.flags.current_time or now_datetime() if frappe.db.get_value("Issue", self.name, "agreement_fulfilled") == "Ongoing": set_service_level_agreement_variance(issue=self.name) self.update_agreement_status() @@ -79,7 +79,9 @@ class Issue(Document): current_time = frappe.flags.current_time or now_datetime() if self.service_level_agreement and self.agreement_fulfilled == "Ongoing": - if self.response_by_variance < 0 or self.resolution_by_variance < 0: + if frappe.db.get_value("Issue", self.name, "response_by_variance") < 0 or \ + frappe.db.get_value("Issue", self.name, "resolution_by_variance") < 0: + self.agreement_fulfilled = "Failed" else: self.agreement_fulfilled = "Fulfilled" diff --git a/erpnext/support/doctype/issue/test_issue.py b/erpnext/support/doctype/issue/test_issue.py index 565c603928..22e00c604e 100644 --- a/erpnext/support/doctype/issue/test_issue.py +++ b/erpnext/support/doctype/issue/test_issue.py @@ -4,7 +4,7 @@ from __future__ import unicode_literals import frappe import unittest -from erpnext.support.doctype.service_level_agreement.test_service_level_agreement import make_service_level_agreement +from erpnext.support.doctype.service_level_agreement.test_service_level_agreement import create_service_level_agreements_for_issues from frappe.utils import now_datetime import datetime from datetime import timedelta @@ -18,15 +18,30 @@ class TestIssue(unittest.TestCase): def test_response_time_and_resolution_time_based_on_different_sla(self): - make_service_level_agreement() + create_service_level_agreements_for_issues() creation = "2019-03-04 12:00:00" # make issue with customer specific SLA - issue = make_issue(creation, '_Test Customer') + customer = create_customer("_Test Customer", "__Test SLA Customer Group", "__Test SLA Territory") + issue = make_issue(creation, "_Test Customer") - self.assertEquals(issue.response_by, datetime.datetime(2019, 3, 7, 18, 0)) - self.assertEquals(issue.resolution_by, datetime.datetime(2019, 3, 9, 18, 0)) + self.assertEquals(issue.response_by, datetime.datetime(2019, 3, 4, 14, 0)) + self.assertEquals(issue.resolution_by, datetime.datetime(2019, 3, 4, 15, 0)) + + # make issue with customer_group specific SLA + customer = create_customer("__Test Customer", "_Test SLA Customer Group", "__Test SLA Territory") + issue = make_issue(creation, "__Test Customer") + + self.assertEquals(issue.response_by, datetime.datetime(2019, 3, 4, 14, 0)) + self.assertEquals(issue.resolution_by, datetime.datetime(2019, 3, 4, 15, 0)) + + # make issue with territory specific SLA + customer = create_customer("___Test Customer", "__Test SLA Customer Group", "_Test SLA Territory") + issue = make_issue(creation, "___Test Customer") + + self.assertEquals(issue.response_by, datetime.datetime(2019, 3, 4, 14, 0)) + self.assertEquals(issue.resolution_by, datetime.datetime(2019, 3, 4, 15, 0)) # make issue with default SLA issue = make_issue(creation) @@ -41,7 +56,7 @@ class TestIssue(unittest.TestCase): self.assertEquals(issue.response_by, datetime.datetime(2019, 3, 4, 18, 0)) self.assertEquals(issue.resolution_by, datetime.datetime(2019, 3, 6, 12, 0)) - frappe.flags.current_time = datetime.datetime(2019, 3, 3, 12, 0) + frappe.flags.current_time = datetime.datetime(2019, 3, 4, 15, 0) issue.status = 'Closed' issue.save() @@ -52,10 +67,39 @@ def make_issue(creation=None, customer=None): issue = frappe.get_doc({ "doctype": "Issue", - "subject": "Issue 1", + "subject": "Service Level Agreement Issue", "customer": customer, "raised_by": "test@example.com", "creation": creation }).insert(ignore_permissions=True) - return issue \ No newline at end of file + return issue + +def create_customer(name, customer_group, territory): + + create_customer_group(customer_group) + create_territory(territory) + + if not frappe.db.exists("Customer", {"customer_name": name}): + frappe.get_doc({ + "doctype": "Customer", + "customer_name": name, + "customer_group": customer_group, + "territory": territory + }).insert(ignore_permissions=True) + +def create_customer_group(customer_group): + + if not frappe.db.exists("Customer Group", {"customer_group_name": customer_group}): + frappe.get_doc({ + "doctype": "Customer Group", + "customer_group_name": customer_group + }).insert(ignore_permissions=True) + +def create_territory(territory): + + if not frappe.db.exists("Territory", {"territory_name": territory}): + frappe.get_doc({ + "doctype": "Territory", + "territory_name": territory, + }).insert(ignore_permissions=True) diff --git a/erpnext/support/doctype/service_level/test_service_level.py b/erpnext/support/doctype/service_level/test_service_level.py index 9131d807f6..09577df166 100644 --- a/erpnext/support/doctype/service_level/test_service_level.py +++ b/erpnext/support/doctype/service_level/test_service_level.py @@ -4,9 +4,6 @@ from __future__ import unicode_literals from erpnext.hr.doctype.employee_group.test_employee_group import make_employee_group from erpnext.support.doctype.issue_priority.test_issue_priority import make_priorities -from frappe.utils import now_datetime -import datetime -from datetime import timedelta import frappe import unittest @@ -14,45 +11,54 @@ import unittest class TestServiceLevel(unittest.TestCase): def test_service_level(self): - test_make_service_level = make_service_level() - get_make_service_level = get_service_level() + employee_group = make_employee_group() + make_holiday_list() + make_priorities() + + # Default Service Level + test_make_service_level = create_service_level("__Test Service Level", "__Test Holiday List", employee_group, 4, 6) + get_make_service_level = get_service_level("__Test Service Level") self.assertEqual(test_make_service_level.name, get_make_service_level.name) self.assertEqual(test_make_service_level.holiday_list, get_make_service_level.holiday_list) self.assertEqual(test_make_service_level.employee_group, get_make_service_level.employee_group) -def make_service_level(): - employee_group = make_employee_group() - make_holiday_list() - make_priorities() + # Service Level + test_make_service_level = create_service_level("_Test Service Level", "__Test Holiday List", employee_group, 2, 3) + get_make_service_level = get_service_level("_Test Service Level") - # Default Service Level Agreement - default_service_level = frappe.get_doc({ + self.assertEqual(test_make_service_level.name, get_make_service_level.name) + self.assertEqual(test_make_service_level.holiday_list, get_make_service_level.holiday_list) + self.assertEqual(test_make_service_level.employee_group, get_make_service_level.employee_group) + + +def create_service_level(service_level, holiday_list, employee_group, response_time, resolution_time): + sl = frappe.get_doc({ "doctype": "Service Level", - "service_level": "__Test Service Level", - "holiday_list": "__Test Holiday List", + "service_level": service_level, + "holiday_list": holiday_list, "employee_group": employee_group, "priorities": [ { "priority": "Low", - "response_time": 4, + "response_time": response_time, "response_time_period": "Hour", - "resolution_time": 6, + "resolution_time": resolution_time, "resolution_time_period": "Hour", }, { "priority": "Medium", - "response_time": 4, + "response_time": response_time, "default_priority": 1, "response_time_period": "Hour", - "resolution_time": 6, + "resolution_time": resolution_time, "resolution_time_period": "Hour", }, { "priority": "High", - "response_time": 4, + "response_time": response_time, "response_time_period": "Hour", - "resolution_time": 6, + "resolution_time": resolution_time, "resolution_time_period": "Hour", } ], @@ -95,92 +101,21 @@ def make_service_level(): ] }) - default_service_level_exists = frappe.db.exists("Service Level", "__Test Service Level") - if not default_service_level_exists: - default_service_level.insert() + sl_exists = frappe.db.exists("Service Level", {"service_level": service_level}) - service_level = frappe.get_doc({ - "doctype": "Service Level", - "service_level": "_Test Service Level", - "holiday_list": "__Test Holiday List", - "employee_group": employee_group, - "priorities": [ - { - "priority": "Low", - "response_time": 2, - "response_time_period": "Day", - "resolution_time": 3, - "resolution_time_period": "Day", - }, - { - "priority": "Medium", - "response_time": 2, - "default_priority": 1, - "response_time_period": "Day", - "resolution_time": 3, - "resolution_time_period": "Day", - }, - { - "priority": "High", - "response_time": 2, - "response_time_period": "Day", - "resolution_time": 3, - "resolution_time_period": "Day", - } - ], - "support_and_resolution": [ - { - "workday": "Monday", - "start_time": "10:00:00", - "end_time": "18:00:00", - }, - { - "workday": "Tuesday", - "start_time": "10:00:00", - "end_time": "18:00:00", - }, - { - "workday": "Wednesday", - "start_time": "10:00:00", - "end_time": "18:00:00", - }, - { - "workday": "Thursday", - "start_time": "10:00:00", - "end_time": "18:00:00", - }, - { - "workday": "Friday", - "start_time": "10:00:00", - "end_time": "18:00:00", - }, - { - "workday": "Saturday", - "start_time": "10:00:00", - "end_time": "18:00:00", - }, - { - "workday": "Sunday", - "start_time": "10:00:00", - "end_time": "18:00:00", - } - ] - }) - service_level_exist = frappe.db.exists("Service Level", {"service_level": "_Test Service Level"}) - - if not service_level_exist: - service_level.insert() - return service_level + if not sl_exists: + sl.insert() + return sl else: - return frappe.get_doc("Service Level", "_Test Service Level") + return frappe.get_doc("Service Level", {"service_level": service_level}) -def get_service_level(): - return frappe.get_doc("Service Level", "_Test Service Level") +def get_service_level(service_level): + return frappe.get_doc("Service Level", service_level) def make_holiday_list(): holiday_list = frappe.db.exists("Holiday List", "__Test Holiday List") if not holiday_list: - now = datetime.datetime.now() + now = frappe.utils.now_datetime() holiday_list = frappe.get_doc({ "doctype": "Holiday List", "holiday_list_name": "__Test Holiday List", @@ -200,4 +135,15 @@ def make_holiday_list(): "holiday_date": "2019-02-11" }, ] - }).insert() \ No newline at end of file + }).insert() + +def create_service_level_for_sla(): + employee_group = make_employee_group() + make_holiday_list() + make_priorities() + + # Default Service Level + create_service_level("__Test Service Level", "__Test Holiday List", employee_group, 4, 6) + + # Service Level + create_service_level("_Test Service Level", "__Test Holiday List", employee_group, 2, 3) diff --git a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py index ccc287bdc8..aeeb86dec5 100644 --- a/erpnext/support/doctype/service_level_agreement/service_level_agreement.py +++ b/erpnext/support/doctype/service_level_agreement/service_level_agreement.py @@ -62,7 +62,7 @@ def get_active_service_level_agreement_for(priority, customer=None, service_leve or_filters.append(["Service Level Agreement", "default_service_level_agreement", "=", 1]) agreement = frappe.get_list("Service Level Agreement", filters=filters, or_filters=or_filters, - fields=["name", "default_priority"], debug=True) + fields=["name", "default_priority"]) return agreement[0] if agreement else None diff --git a/erpnext/support/doctype/service_level_agreement/test_service_level_agreement.py b/erpnext/support/doctype/service_level_agreement/test_service_level_agreement.py index 214fe4bfcf..e04265fcc1 100644 --- a/erpnext/support/doctype/service_level_agreement/test_service_level_agreement.py +++ b/erpnext/support/doctype/service_level_agreement/test_service_level_agreement.py @@ -5,12 +5,12 @@ from __future__ import unicode_literals import frappe import unittest -from erpnext.support.doctype.service_level.test_service_level import make_service_level +from erpnext.support.doctype.service_level.test_service_level import create_service_level_for_sla class TestServiceLevelAgreement(unittest.TestCase): def test_service_level_agreement(self): - make_service_level() + create_service_level_for_sla() # Default Service Level Agreement create_default_service_level_agreement = create_service_level_agreement(default_service_level_agreement=1, @@ -26,7 +26,7 @@ class TestServiceLevelAgreement(unittest.TestCase): # Service Level Agreement for Customer customer = create_customer() create_customer_service_level_agreement = create_service_level_agreement(default_service_level_agreement=0, - service_level="__Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group", + service_level="_Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group", apply_to="Customer", entity=customer, response_time=2, resolution_time=3) get_customer_service_level_agreement = get_service_level_agreement(apply_to="Customer", entity=customer) @@ -38,8 +38,8 @@ class TestServiceLevelAgreement(unittest.TestCase): # Service Level Agreement for Customer Group customer_group = create_customer_group() create_customer_group_service_level_agreement = create_service_level_agreement(default_service_level_agreement=0, - service_level="__Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group", - apply_to="Customer Group", entity=customer_group, response_time=4, resolution_time=6) + service_level="_Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group", + apply_to="Customer Group", entity=customer_group, response_time=2, resolution_time=3) get_customer_group_service_level_agreement = get_service_level_agreement(apply_to="Customer Group", entity=customer_group) self.assertEqual(create_customer_group_service_level_agreement.name, get_customer_group_service_level_agreement.name) @@ -50,7 +50,7 @@ class TestServiceLevelAgreement(unittest.TestCase): # Service Level Agreement for Territory territory = create_territory() create_territory_service_level_agreement = create_service_level_agreement(default_service_level_agreement=0, - service_level="__Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group", + service_level="_Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group", apply_to="Territory", entity=territory, response_time=2, resolution_time=3) get_territory_service_level_agreement = get_service_level_agreement(apply_to="Territory", entity=territory) @@ -67,7 +67,6 @@ def get_service_level_agreement(default_service_level_agreement=None, apply_to=N filters = {"apply_to": apply_to, "entity": entity} service_level_agreement = frappe.get_doc("Service Level Agreement", filters) - print(service_level_agreement) return service_level_agreement def create_service_level_agreement(default_service_level_agreement, service_level, holiday_list, employee_group, @@ -146,13 +145,24 @@ def create_service_level_agreement(default_service_level_agreement, service_leve ] }) - service_level_agreement_exists = frappe.db.exists("Service Level Agreement", service_level_agreement.name) + filters = { + "default_service_level_agreement": service_level_agreement.default_service_level_agreement, + "service_level": service_level_agreement.service_level + } + + if not default_service_level_agreement: + filters.update({ + "apply_to": apply_to, + "entity": entity + }) + + service_level_agreement_exists = frappe.db.exists("Service Level Agreement", filters) if not service_level_agreement_exists: service_level_agreement.insert(ignore_permissions=True) return service_level_agreement else: - return frappe.get_doc("Service Level Agreement", service_level_agreement.name) + return frappe.get_doc("Service Level Agreement", service_level_agreement_exists) def create_customer(): customer = frappe.get_doc({ @@ -190,4 +200,26 @@ def create_territory(): territory.insert() return territory.name else: - return frappe.db.exists("Territory", {"territory_name": "_Test SLA Territory"}) \ No newline at end of file + return frappe.db.exists("Territory", {"territory_name": "_Test SLA Territory"}) + +def create_service_level_agreements_for_issues(): + create_service_level_for_sla() + + create_service_level_agreement(default_service_level_agreement=1, + service_level="__Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group", + apply_to=None, entity=None, response_time=4, resolution_time=6) + + create_customer() + create_service_level_agreement(default_service_level_agreement=0, + service_level="_Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group", + apply_to="Customer", entity="_Test Customer", response_time=2, resolution_time=3) + + create_customer_group() + create_service_level_agreement(default_service_level_agreement=0, + service_level="_Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group", + apply_to="Customer Group", entity="_Test SLA Customer Group", response_time=2, resolution_time=3) + + create_territory() + create_service_level_agreement(default_service_level_agreement=0, + service_level="_Test Service Level", holiday_list="__Test Holiday List", employee_group="_Test Employee Group", + apply_to="Territory", entity="_Test SLA Territory", response_time=2, resolution_time=3)