BMCHelixRemedyforceCreateServiceRequest
This script is used to simplify the process of creating a service request in BMC Helix Remedyforce. The script will consider the ID over the name of the argument when both are provided. Example: client_id is considered when both client_id and client_user_name are provided.
python · Bmc Helix Remedyforce
Details
| ID | BMCHelixRemedyforceCreateServiceRequest |
|---|---|
| Language | python |
| From Version | 5.0.0 |
| Docker Image | demisto/python3:3.12.13.10116658 |
| Tags | bmcremedyforce |
README
This script is used to simplify the process of creating a service request in BMC Helix Remedyforce. The script will consider ID over the name of the argument when both are provided. Example: client_id is considered when both client_id and client_user_name are provided.
Script Data
| Name | Description |
|---|---|
| Script Type | python3 |
| Tags | bmcremedyforce |
| Cortex XSOAR Version | 5.0.0 |
Dependencies
This script uses the following commands and scripts.
- bmc-remedy-category-details-get
- bmc-remedy-account-details-get
- bmc-remedy-user-details-get
- bmc-remedy-service-request-create
- bmc-remedy-service-request-definition-get
- bmc-remedy-urgency-details-get
- bmc-remedy-status-details-get
- bmc-remedy-queue-details-get
- bmc-remedy-impact-details-get
Inputs
| Argument Name | Description |
|---|---|
| client_user_name | User name of the client. Get the username using the ‘bmc-remedy-user-details-get’ command. |
| client_id | The unique ID of the client. It helps to select a client for a particular service request. Get the client ID from the email using the ‘bmc-remedy-user-details-get’ command. |
| category | Classifies the service request using standard classifications to track the reporting purposes. Get the category name using the ‘bmc-remedy-category-details-get’ command. |
| category_id | The unique ID of the category. Categories allow users to classify the incident or service request using standard classifications to track the reporting purposes. Get the category ID using the ‘bmc-remedy-category-details-get’ command. |
| queue | Name of the queue owner. Get the queue name using the ‘bmc-remedy-queue-details-get’ command. |
| queue_id | The unique ID of the queue owner. Get the queue ID using the ‘bmc-remedy-queue-details-get’ command. |
| staff_user_name | The user name of the staff. Get the username using the ‘bmc-remedy-user-details-get’ command. |
| staff_id | The unique ID of the staff to whom the user wants to assign the record. Get the staff ID from the staff details using the ‘bmc-remedy-user-details-get’ command. |
| status | Displays the progress of the service request through its stages from opening to closure. Get the status name using the ‘bmc-remedy-status-details-get’ command. |
| status_id | The unique ID of the status that is used to display the progress of the service request through its stages from opening to closure. Users can get the status ID using the’bmc-remedy-status-details-get’ command. |
| urgency | Determines the priority of the service request. Get the urgency name using the ‘bmc-remedy-urgency-details-get’ command. |
| urgency_id | The unique ID of the urgency which is used to determine the priority of the service request. Get the urgency ID using the ‘bmc-remedy-urgency-details-get’ command. |
| service_request_definition | The Service Request Definition Name. Get the Service Request Definition name using the ‘bmc-remedy-service-request-definition-get’ command. |
| service_request_definition_id | The unique ID of the Service Request Definition. Get the Service Request Definition ID using the ‘bmc-remedy-service-request-definition-get’ command. |
| service_request_definition_params | Each service request definition expects specific parameters to be supplied. Specify the parameters as a delimiter (;) separated string. Example: ‘param1=value1; param2=value2’. |
| impact | Determine the priority of the service request. Users can get the impact name using the ‘bmc-remedy-impact-details-get’ command. |
| impact_id | The unique ID of the impact which is used to determine the priority of the service request. Get the impact ID using the ‘bmc-remedy-impact-details-get’ command. |
| account | Name of the account. Get the account name using the ‘bmc-remedy-account-details-get’ command. |
| account_id | The account ID of the specific account. Get the account ID using the ‘bmc-remedy-account-details-get’ command. |
Outputs
| Path | Description | Type |
|---|---|---|
| BmcRemedyforce.ServiceRequest.Number | Service request number. | String |
| BmcRemedyforce.ServiceRequest.Id | Service request Id. | String |
| BmcRemedyforce.ServiceRequest.CreatedDate | Creation date & time of service request. | String |
Script Example
!BMCHelixRemedyforceCreateServiceRequest service_request_definition_id="a3H2w000000TfAPEA0" using="BMCHelixRemedyforce_instance_jhanvi_acc"
Context Example
{
"BmcRemedyforce": {
"ServiceRequest": {
"CreatedDate": "2020-08-01T08:08:16Z",
"Id": "a2U2w000000cRmvEAE",
"Number": "00000154"
}
}
}
Human Readable Output
The service request 00000154 is successfully created.
import json from unittest.mock import patch from BMCHelixRemedyforceCreateServiceRequest import ( ERROR_MESSAGES, get_field_id, get_service_request_definition_id, main, remove_extra_space_from_args, ) from CommonServerPython import * DUMMY_COMMAND_RESPONSE = [{"Contents": {}}] def fetch_dummy_service_requests(): """ To mock fetch service request dummy. :rtype: ``Dict`` :return: data: Fetch service request dummy data. """ with open("./TestData/ServiceRequest.json", encoding="utf-8") as f: data = json.load(f) return data def test_get_service_request_definition_id_with_id(): """ Test-case to check service_request_definition_id is passed then it should return that service_request_definition_id. :return: None """ actual_result = get_service_request_definition_id("id", "name", "", {}, "ins") assert actual_result == "id" @patch("demistomock.executeCommand") def test_get_service_request_definition_id_positive_scenario(mocker_execute_command): """ When service_request_definition_id is not passed and service_request_definition_name passed Then method should return service_request_definition_id. :param mocker_execute_command: mocker object for executeCommand :return:None """ mocker_execute_command.return_value = [{"Contents": {"Result": {"Id": "abc"}}}] actual_result = get_service_request_definition_id(None, "name", "", {}, "ins") assert actual_result == "abc" @patch("BMCHelixRemedyforceCreateServiceRequest.return_error") @patch("demistomock.executeCommand") def test_get_service_request_definition_id_null_results(mocker_execute_command, mocker_return_error): """ When service_request_definition_id is not passed and service_request_definition_id not found on given name Then method should return error as expected. :param mocker_execute_command: mocker object for executeCommand :param mocker_return_error: mocker object for return_error :return: None """ mocker_execute_command.return_value = DUMMY_COMMAND_RESPONSE get_service_request_definition_id(None, "name", "", {}, "ins") assert mocker_return_error.called for call in mocker_return_error.call_args_list: args, _ = call assert args[0] == ERROR_MESSAGES + json.dumps(DUMMY_COMMAND_RESPONSE) @patch("demistomock.results") @patch("sys.exit") @patch("demistomock.executeCommand") def test_get_service_request_definition_id_no_records_found(mocker_execute_command, mocker_exit, mocker_results): """ When service_request_definition_id is not passed and no records found on given name Then method should work as expected. :param mocker_execute_command: mocker object for executeCommand :param mocker_exit: mocker object for sys.exit :param mocker_results: mocker object for results :return: None """ mocker_execute_command.return_value = [{"Contents": []}] get_service_request_definition_id(None, "name", "", {}, "ins") assert mocker_exit.called assert mocker_results.called for call in mocker_exit.call_args_list: args, _ = call assert args[0] == 0 def test_get_field_id_with_id(): """ Test-case to check field_id is passed then it should return that field_id. :return: None """ actual_result = get_field_id("id", "name", "", {}, "ins") assert actual_result == "id" @patch("demistomock.executeCommand") def test_get_field_id_positive_scenario(mocker_execute_command): """ When field_id is not passed and field_name passed as argument Then method should return field_id. :param mocker_execute_command: mocker object for executeCommand :return: None """ mocker_execute_command.return_value = [{"Contents": {"records": [{"Id": "abc"}]}}] actual_result = get_field_id(None, "name", "", {}, "ins") assert actual_result == "abc" @patch("BMCHelixRemedyforceCreateServiceRequest.return_error") @patch("demistomock.executeCommand") def test_get_field_id_null_results(mocker_execute_command, mocker_return_error): """ When field_id is not passed and field_id not found on given name Then method should return error as expected. :param mocker_execute_command: mocker object for executeCommand :param mocker_return_error: mocker object for return_error :return: None """ mocker_execute_command.return_value = DUMMY_COMMAND_RESPONSE get_field_id(None, "name", "", {}, "ins") assert mocker_return_error.called for call in mocker_return_error.call_args_list: args, _ = call assert args[0] == ERROR_MESSAGES + json.dumps(DUMMY_COMMAND_RESPONSE) @patch("demistomock.executeCommand") def test_get_field_id_records_as_list(mocker_execute_command): """ Get field id from name when api response will be a list. :param mocker_execute_command: mocker object for executeCommand :return: None """ mocker_execute_command.return_value = [{"Contents": [{"Id": "abc"}]}] actual_result = get_field_id(None, "name", "", {}, "ins") assert actual_result == "abc" @patch("demistomock.results") @patch("sys.exit") @patch("demistomock.executeCommand") def test_get_field_id_no_records_found(mocker_execute_command, mocker_exit, mocker_results): """ When field_id could not be found for mentioned name in args then verfying demisto.results and system will exit with field 0. :param mocker_execute_command: mocker object for executeCommand :param mocker_exit: mocker object for sys.exit :param mocker_results: mocker object for results :return: None """ mocker_execute_command.return_value = [{"Contents": "abc"}] get_field_id(None, "name", "", {}, "ins") assert mocker_exit.called assert mocker_results.called for call in mocker_exit.call_args_list: args, _ = call assert args[0] == 0 def test_remove_extra_space_from_args(): """ Given a dictionary of arguments When remove_extra_space_from_args is called upon them Then returned arguments dictionary should not contain any argument value with leading or trailing whitespaces and the ones with NoneType should be removed :return: """ sample_args = {"bad_1": "", "bad_2": " ", "can_be_better": " good ", "good": "good", "very_bad": None} sanitized_args = {"can_be_better": "good", "good": "good"} assert sanitized_args == remove_extra_space_from_args(sample_args) @patch("BMCHelixRemedyforceCreateServiceRequest.return_error") @patch("demistomock.executeCommand") @patch("demistomock.args") def test_main_fail(demisto_args, mocker_execute_command, mocker_return_error): """ Testcase of main method in failure scenarios. :param demisto_args: mocker object for args :param mocker_execute_command: mocker object for executeCommand :param mocker_return_error: mocker object for return_error :return: None """ args = fetch_dummy_service_requests()["args"] demisto_args.return_value = args mocker_execute_command.return_value = [{"Contents": "No records found.", "Type": entryTypes["error"]}] main() assert mocker_return_error.called for call in mocker_return_error.call_args_list: args, _ = call assert args[0] == "No records found." @patch("BMCHelixRemedyforceCreateServiceRequest.return_error") @patch("demistomock.executeCommand") @patch("demistomock.args") def test_main_exception(demisto_args, mocker_execute_command, mocker_return_error): """ Testcase of main method while any exception will be raised. :param demisto_args: mocker object for args :param mocker_execute_command: mocker object for executeCommand :param mocker_return_error: mocker object for return_error :return: None """ args = fetch_dummy_service_requests()["args"] demisto_args.return_value = args mocker_execute_command.return_value = [{"Type": entryTypes["error"]}] main() assert mocker_return_error.called for call in mocker_return_error.call_args_list: args, _ = call assert args[0] == "'Contents'" @patch("BMCHelixRemedyforceCreateServiceRequest.return_error") @patch("demistomock.executeCommand") @patch("demistomock.args") def test_main_fail_to_execute_command(demisto_args, mocker_execute_command, mocker_return_error): """ Testcase of main method when command: 'bmc-remedy-service-request-create' will be failed to execute. :param demisto_args: mocker object for args :param mocker_execute_command: mocker object for executeCommand :param mocker_return_error: mocker object for return_error :return: None """ args = fetch_dummy_service_requests()["args"] demisto_args.return_value = args mocker_execute_command.return_value = [{"Contents": [], "Type": "abc"}] main() assert mocker_return_error.called for call in mocker_return_error.call_args_list: args, _ = call assert args[0] == ERROR_MESSAGES + '{"Contents": [], "Type": "abc"}' @patch("demistomock.results") @patch("demistomock.executeCommand") @patch("demistomock.args") def test_main_success(demisto_args, mocker_execute_command, mocker_results): """ Testcase of main method in positive scenario. :param demisto_args: mocker object for args :param mocker_execute_command: mocker object for executeCommand :param mocker_results: mocker object for results :return: None """ args = fetch_dummy_service_requests()["args"] demisto_args.return_value = args expected_args = fetch_dummy_service_requests()["expected_args"] command_name = "bmc-remedy-service-request-create" mocker_execute_command.return_value = [{"Contents": {"Result": {"Number": 123}}, "Type": "abc", "HumanReadable": "abc"}] main() assert mocker_results.called for call in mocker_results.call_args_list: args, _ = call assert args[0]["HumanReadable"] == "abc" for call in mocker_execute_command.call_args_list: command_args, _ = call assert command_args[0] == command_name assert command_args[1] == expected_args