feature/support create_case, resolve_case, describe_cases and associated tests (#3776)
* feature/support create_case, resolve_case, describe_cases and associated tests * review/support - addressed PR comments - Have created a SupportCase object to persist case - Associated testing to address PR comments * Support - simplify tests * Support - Simplify tests even more Co-authored-by: Bert Blommers <info@bertblommers.nl>
This commit is contained in:
parent
b06e77b604
commit
74272ae51c
4 changed files with 853 additions and 30 deletions
|
|
@ -3,17 +3,59 @@ from boto3 import Session
|
|||
from pkg_resources import resource_filename
|
||||
from moto.core import BaseBackend
|
||||
from moto.utilities.utils import load_resource
|
||||
import datetime
|
||||
import random
|
||||
|
||||
|
||||
checks_json = "resources/describe_trusted_advisor_checks.json"
|
||||
ADVISOR_CHECKS = load_resource(resource_filename(__name__, checks_json))
|
||||
|
||||
|
||||
class SupportCase(object):
|
||||
def __init__(self, **kwargs):
|
||||
self.case_id = kwargs.get("case_id")
|
||||
self.display_id = "foo_display_id"
|
||||
self.subject = kwargs.get("subject")
|
||||
self.status = "opened"
|
||||
self.service_code = kwargs.get("service_code")
|
||||
self.category_code = kwargs.get("category_code")
|
||||
self.severity_code = kwargs.get("severity_code")
|
||||
self.submitted_by = "moto@moto.com"
|
||||
self.time_created = self.get_datetime()
|
||||
self.attachment_set_id = kwargs.get("attachment_set_id")
|
||||
self.communication_body = kwargs.get("communication_body")
|
||||
self.language = kwargs.get("language")
|
||||
self.cc_email_addresses = kwargs.get("cc_email_addresses")
|
||||
self.communications = {
|
||||
"recentCommunications": {
|
||||
"communications": [
|
||||
{
|
||||
"caseId": self.case_id,
|
||||
"body": self.communication_body,
|
||||
"submittedBy": self.submitted_by,
|
||||
"timeCreated": self.get_datetime(),
|
||||
"attachmentSet": [
|
||||
{
|
||||
"attachmentId": self.attachment_set_id,
|
||||
"fileName": "support_file.txt",
|
||||
},
|
||||
],
|
||||
}
|
||||
],
|
||||
"nextToken": "foo_next_token",
|
||||
}
|
||||
}
|
||||
|
||||
def get_datetime(self):
|
||||
return str(datetime.datetime.now().isoformat())
|
||||
|
||||
|
||||
class SupportBackend(BaseBackend):
|
||||
def __init__(self, region_name=None):
|
||||
super(SupportBackend, self).__init__()
|
||||
self.region_name = region_name
|
||||
self.check_status = {}
|
||||
self.cases = {}
|
||||
|
||||
def reset(self):
|
||||
region_name = self.region_name
|
||||
|
|
@ -58,6 +100,137 @@ class SupportBackend(BaseBackend):
|
|||
elif self.check_status[check_id] == "abandoned":
|
||||
self.check_status[check_id] = "none"
|
||||
|
||||
def advance_case_status(self, case_id):
|
||||
"""
|
||||
Fake an advancement through case statuses
|
||||
"""
|
||||
|
||||
if self.cases[case_id].status == "opened":
|
||||
self.cases[case_id].status = "pending-customer-action"
|
||||
|
||||
elif self.cases[case_id].status == "pending-customer-action":
|
||||
self.cases[case_id].status = "reopened"
|
||||
|
||||
elif self.cases[case_id].status == "reopened":
|
||||
self.cases[case_id].status = "resolved"
|
||||
|
||||
elif self.cases[case_id].status == "resolved":
|
||||
self.cases[case_id].status = "unassigned"
|
||||
|
||||
elif self.cases[case_id].status == "unassigned":
|
||||
self.cases[case_id].status = "work-in-progress"
|
||||
|
||||
elif self.cases[case_id].status == "work-in-progress":
|
||||
self.cases[case_id].status = "opened"
|
||||
|
||||
def advance_case_severity_codes(self, case_id):
|
||||
"""
|
||||
Fake an advancement through case status severities
|
||||
"""
|
||||
if self.cases[case_id].severity_code == "low":
|
||||
self.cases[case_id].severity_code = "normal"
|
||||
|
||||
elif self.cases[case_id].severity_code == "normal":
|
||||
self.cases[case_id].severity_code = "high"
|
||||
|
||||
elif self.cases[case_id].severity_code == "high":
|
||||
self.cases[case_id].severity_code = "urgent"
|
||||
|
||||
elif self.cases[case_id].severity_code == "urgent":
|
||||
self.cases[case_id].severity_code = "critical"
|
||||
|
||||
elif self.cases[case_id].severity_code == "critical":
|
||||
self.cases[case_id].severity_code = "low"
|
||||
|
||||
def resolve_case(self, case_id):
|
||||
self.advance_case_status(case_id)
|
||||
|
||||
resolved_case = {
|
||||
"initialCaseStatus": self.cases[case_id].status,
|
||||
"finalCaseStatus": "resolved",
|
||||
}
|
||||
|
||||
return resolved_case
|
||||
|
||||
# persist case details to self.cases
|
||||
def create_case(
|
||||
self,
|
||||
subject,
|
||||
service_code,
|
||||
severity_code,
|
||||
category_code,
|
||||
communication_body,
|
||||
cc_email_addresses,
|
||||
language,
|
||||
issue_type,
|
||||
attachment_set_id,
|
||||
):
|
||||
# Random case ID
|
||||
random_case_id = "".join(
|
||||
random.choice("0123456789ABCDEFGHIJKLMabcdefghijklm") for i in range(16)
|
||||
)
|
||||
case_id = "case-12345678910-2020-%s" % random_case_id
|
||||
case = SupportCase(
|
||||
case_id=case_id,
|
||||
subject=subject,
|
||||
service_code=service_code,
|
||||
severity_code=severity_code,
|
||||
category_code=category_code,
|
||||
communication_body=communication_body,
|
||||
cc_email_addresses=cc_email_addresses,
|
||||
language=language,
|
||||
attachment_set_id=attachment_set_id,
|
||||
)
|
||||
self.cases[case_id] = case
|
||||
|
||||
return {"caseId": case_id}
|
||||
|
||||
def describe_cases(
|
||||
self,
|
||||
case_id_list,
|
||||
display_id,
|
||||
after_time,
|
||||
before_time,
|
||||
include_resolved_cases,
|
||||
next_token,
|
||||
max_results,
|
||||
language,
|
||||
include_communications,
|
||||
):
|
||||
cases = []
|
||||
|
||||
for case in case_id_list:
|
||||
self.advance_case_status(case)
|
||||
self.advance_case_severity_codes(case)
|
||||
formatted_case = {
|
||||
"caseId": self.cases[case].case_id,
|
||||
"displayId": self.cases[case].display_id,
|
||||
"subject": self.cases[case].subject,
|
||||
"status": self.cases[case].status,
|
||||
"serviceCode": self.cases[case].service_code,
|
||||
"categoryCode": self.cases[case].category_code,
|
||||
"severityCode": self.cases[case].severity_code,
|
||||
"submittedBy": self.cases[case].submitted_by,
|
||||
"timeCreated": self.cases[case].time_created,
|
||||
"ccEmailAddresses": self.cases[case].cc_email_addresses,
|
||||
"language": self.cases[case].language,
|
||||
}
|
||||
|
||||
if include_communications:
|
||||
formatted_case.update(self.cases[case].communications)
|
||||
|
||||
if (
|
||||
include_resolved_cases is False
|
||||
and formatted_case["status"] == "resolved"
|
||||
):
|
||||
continue
|
||||
|
||||
cases.append(formatted_case)
|
||||
case_values = {"cases": cases}
|
||||
case_values.update({"nextToken": next_token})
|
||||
|
||||
return case_values
|
||||
|
||||
|
||||
support_backends = {}
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue