def test_click_card_layout_by_index_other_link(self, mock_click_component: MagicMock) -> None: uri = self.report_link_uri test_form = SailUiForm(self.task_set.appian.interactor, json.loads(self.spl_response), uri) def get_call(name: str) -> Optional[Any]: return { 'uuid': test_form.uuid, 'context': test_form.context }.get(name) mock_state = MagicMock() mock_state.get.side_effect = get_call mock_click_component.return_value = mock_state component = find_component_by_index_in_dict("DynamicLink", 3, test_form.state) test_form.click_card_layout_by_index(3, locust_request_label=self.locust_label) mock_click_component.assert_called_once() args, kwargs = mock_click_component.call_args_list[0] self.assertEqual(args[0], self.report_link_uri) self.assertEqual(args[1], component) self.assertEqual(args[2], test_form.context) self.assertEqual(args[3], test_form.uuid) self.assertEqual(kwargs["label"], self.locust_label)
def test_upload_document_invalid_component(self) -> None: with self.assertRaisesRegex(Exception, 'Provided component was not a FileUploadWidget'): label = 'my_label' ui = { 'contents': [ { "contents": { "label": label, "#t": "Some other thing" }, "label": label, "labelPosition": "ABOVE", "instructions": "", "instructionsPosition": "", "helpTooltip": "Upload an application or a multi-patch package", "requiredStyle": "", "skinName": "", "marginBelow": "", "accessibilityText": "", "#t": "FieldLayout" }, ] } sail_form = SailUiForm(self.task_set.appian.interactor, ui, self.process_model_form_uri) sail_form.upload_document_to_upload_field(label, 'fake_file')
def test_click_card_layout_by_index_no_link(self) -> None: uri = self.report_link_uri test_form = SailUiForm(self.task_set.appian.interactor, json.loads(self.spl_response), uri) with self.assertRaisesRegex(Exception, "CardLayout found at index: 2 does not have a link on it"): test_form.click_card_layout_by_index(2)
def test_dispatch_click_task_no_id(self) -> None: uri = self.report_link_uri sites_task_report = SailUiForm(self.task_set.appian.interactor, json.loads(self.sites_task_report_resp), uri) component = {'#t': PROCESS_TASK_LINK_TYPE, 'label': "my task"} with self.assertRaisesRegex(Exception, "No task id found for task with name 'my task'"): sites_task_report._dispatch_click(component, 'no label')
def test_refresh_after_record_action_interaction(self) -> None: sail_ui_record_action_before = json.loads(self.record_action_launch_form_before_refresh) self.custom_locust.enqueue_response(200, self.record_action_refresh_response) sail_form = SailUiForm(self.task_set.appian.interactor, sail_ui_record_action_before, "http://localhost.com") sail_form.refresh_after_record_action("Update Table 1 (Dup) (PSF)")
def test_click_record_search_button_by_index(self) -> None: sail_ui_site_with_record_search_button = json.loads(self.site_with_record_search_button) self.custom_locust.enqueue_response(200, self.uiform_click_record_search_button_response) sail_form = SailUiForm(self.task_set.appian.interactor, sail_ui_site_with_record_search_button, "http://localhost.com") sail_form.click_record_search_button_by_index()
def test_fill_picker_field_no_response(self) -> None: sail_ui_actions_cmf = json.loads(self.sail_ui_actions_response) self.custom_locust.enqueue_response(200, '{}') sail_form = SailUiForm(self.task_set.appian.interactor, sail_ui_actions_cmf, self.process_model_form_uri) label = self.picker_label value = 'You will not find me' with self.assertRaisesRegex(Exception, "No response returned"): sail_form.fill_picker_field(label, value)
def test_filter_records_using_searchbox(self, mock_get_page: MagicMock) -> None: uri = 'suite/rest/a/sites/latest/D6JMim/pages/records/recordType/commit' record_type_list_form = SailUiForm(self.task_set.appian.interactor, json.loads(read_mock_file("records_response.json")), uri) record_type_list_form.filter_records_using_searchbox("Actions Page") mock_get_page.assert_called_once() args, kwargs = mock_get_page.call_args_list[0] self.assertEqual(kwargs['uri'], f"{uri}?searchTerm=Actions%20Page") self.assertEqual(kwargs['headers']['Accept'], "application/vnd.appian.tv.ui+json")
def test_fill_picker_field_suggestions_identifier_is_code(self) -> None: sail_ui_actions_cmf = json.loads(self.sail_ui_actions_response) picker_widget_suggestions = read_mock_file("picker_widget_suggestions_code.json") picker_widget_selected = read_mock_file("picker_widget_selected.json") self.custom_locust.enqueue_response(200, picker_widget_suggestions) self.custom_locust.enqueue_response(200, picker_widget_selected) sail_form = SailUiForm(self.task_set.appian.interactor, sail_ui_actions_cmf, self.process_model_form_uri) label = self.picker_label value = 'GAC Guyana' sail_form.fill_picker_field(label, value, identifier='code')
def test_fill_picker_field_interaction_no_selection_resp(self) -> None: sail_ui_actions_cmf = json.loads(self.sail_ui_actions_response) picker_widget_suggestions = read_mock_file("picker_widget_suggestions.json") self.custom_locust.enqueue_response(200, picker_widget_suggestions) self.custom_locust.enqueue_response(200, '{}') sail_form = SailUiForm(self.task_set.appian.interactor, sail_ui_actions_cmf, self.process_model_form_uri) label = self.picker_label value = self.picker_value with self.assertRaisesRegex(Exception, 'No response returned'): sail_form.fill_picker_field(label, value)
def test_click_card_layout_by_index_spl(self, mock_click_spl: MagicMock) -> None: uri = self.report_link_uri test_form = SailUiForm(self.task_set.appian.interactor, json.loads(self.spl_response), uri) component = find_component_by_label_and_type_dict('label', 'Request Pass', 'StartProcessLink', test_form.state) test_form.click_card_layout_by_index(1, locust_request_label=self.locust_label) mock_click_spl.assert_called_once() args, kwargs = mock_click_spl.call_args_list[0] self.assertTupleEqual(args, ('z1ck30E1', 'home', False, component)) self.assertEqual(kwargs["locust_request_label"], self.locust_label)
def test_fill_picker_field_not_id_or_v(self) -> None: sail_ui_actions_cmf = json.loads(self.sail_ui_actions_response) label = self.picker_label resp = { 'testLabel': f'test-{label}', '#t': 'PickerWidget', 'suggestions': [{'identifier': {'idx': 1}}] } self.custom_locust.enqueue_response(200, json.dumps(resp)) sail_form = SailUiForm(self.task_set.appian.interactor, sail_ui_actions_cmf, self.process_model_form_uri) value = self.picker_value with self.assertRaisesRegex(Exception, "Could not extract picker values"): sail_form.fill_picker_field(label, value)
def _setup_multi_dropdown_form(self) -> SailUiForm: uri = self.multi_dropdown_uri self.custom_locust.set_response(self.multi_dropdown_uri, 200, self.multi_dropdown_response) test_form = SailUiForm(self.task_set.appian.interactor, json.loads(self.multi_dropdown_response), uri) return test_form
def test_fill_picker_field_user(self) -> None: sail_ui_actions_cmf = json.loads(self.sail_ui_actions_response) picker_widget_selected = read_mock_file("picker_widget_selected.json") label = '1. Select a Customer' resp = { 'testLabel': f'test-{label}', '#t': 'PickerWidget', 'suggestions': [{'identifier': {'id': 1, "#t": "User"}}], 'saveInto': {}, '_cId': "abc" } self.custom_locust.enqueue_response(200, json.dumps(resp)) self.custom_locust.enqueue_response(200, picker_widget_selected) sail_form = SailUiForm(self.task_set.appian.interactor, sail_ui_actions_cmf, self.process_model_form_uri) value = 'Admin User' sail_form.fill_picker_field(label, value)
def test_click_related_action_on_record_form(self) -> None: self.custom_locust.set_response('/suite/rest/a/record/latest/BE5pSw/ioBHer_bdD8Emw8hMSiA_CnpxaK0CVK61sPetEqM0lI_pHvjAsXVOlJtUo/actions/' 'ioBHer_bdD8Emw8hMSiA_CnpxaA0SVKp1kzE9BURlYvkxHjzPlX0d81Hmk', 200, self.related_action_response) sail_form = SailUiForm(self.task_set.appian.interactor, json.loads(self.record_instance_response), '/suite/rest/a/sites/latest/D6JMim/page/records/record/' 'lIBHer_bdD8Emw8hLPETeiApJ24AA5ZJilzpBmewf--PdHDSUx022ZVdk6bhtcs5w_3twr_z1drDBwn8DKfhPp90o_A4GrZbDSh09DYkh5Mfq48' '/view/summary') record_instance_header_form = sail_form.get_record_header_form() # perform a related action record_instance_related_action_form = record_instance_header_form.click_related_action("Discuss Case History") # Assert fields on the related action form text_component = find_component_by_attribute_in_dict('label', 'Action Type', record_instance_related_action_form.state) self.assertEqual(text_component.get("#t"), "TextField")
def test_click_start_process_link(self, mock_click_spl: MagicMock) -> None: uri = self.report_link_uri test_form = SailUiForm(self.task_set.appian.interactor, json.loads(self.spl_response), uri) mock_component_object = { "processModelOpaqueId": "iQB8GmxIr5iZT6YnVytCx9QKdJBPaRDdv_-hRj3HM747ZtRjSw", "cacheKey": "c93e2f33-06eb-42b2-9cfc-2c4a0e14088e" } test_form._click_start_process_link("z1ck30E1", "home", False, component=mock_component_object, locust_request_label="I am a label!") mock_click_spl.assert_called_once() args, kwargs = mock_click_spl.call_args_list[0] self.assertEqual(kwargs['component'], mock_component_object) self.assertEqual(kwargs['process_model_opaque_id'], "iQB8GmxIr5iZT6YnVytCx9QKdJBPaRDdv_-hRj3HM747ZtRjSw") self.assertEqual(kwargs['cache_key'], "c93e2f33-06eb-42b2-9cfc-2c4a0e14088e") self.assertEqual(kwargs['is_mobile'], False) self.assertEqual(kwargs['locust_request_label'], "I am a label!")
def nav_to_site_designer(self): uri = "/suite/rest/a/applications/latest/app/design/koBHer_bdD8Emw8hLHIVbTE4VVYhe67L0vlHTpP4tgRJpQLzriXFo6NxZ2dZZJAhDGELUiEJfv4fTh6Y4tJc1q2NxztJuzv-XyAYA" # uri = "/suite/rest/a/applications/latest/app/design/koBRiBJbvt7QuRiqjQRMM3to01_ihyZOZXelvq2wVBYCVYJjp5azZLattqab0AluZv9C7OaLSY2kBts5BU09-bwMfqciz39GHYWTw" headers = self.appian.interactor.setup_sail_headers() headers['X-Client-Mode'] = 'DESIGN' resp = self.appian.interactor.get_page(uri, label="LoadSiteDesignerPage", headers=headers) # print(resp) # print(resp.text) form = SailUiForm(self.appian.interactor, resp.json(), uri, breadcrumb='SitesDesigner') form = form.click('Add Page').select_dropdown_item( 'Type', 'Record List') for extr in helper.extract_values(form.state, 'label', 'Content'): print('Choices after selecting record list ' + str(len(extr['choices']))) form = form.select_dropdown_item('Type', 'Report') for extr in helper.extract_values(form.state, 'label', 'Content'): print('Choices after selecting report ' + str(len(extr['choices'])))
def test_upload_document_missing_file(self) -> None: file = 'fake_file' with self.assertRaisesRegex(Exception, f"No such file or directory: '{file}'"): label = 'my_label' ui = { 'contents': [ { "label": label, "labelPosition": "ABOVE", "instructions": "", "instructionsPosition": "", "helpTooltip": "Upload an application or a multi-patch package", "requiredStyle": "", "skinName": "", "marginBelow": "", "accessibilityText": "", "#t": "FileUploadWidget" }, ] } sail_form = SailUiForm(self.task_set.appian.interactor, ui, self.process_model_form_uri) sail_form.upload_document_to_upload_field(label, file)
def test_dispatch_click_task_with_id(self) -> None: uri = self.report_link_uri sites_task_report = SailUiForm(self.task_set.appian.interactor, json.loads(self.sites_task_report_resp), uri) initial_uuid = sites_task_report.uuid initial_context = sites_task_report.context task_to_accept = read_mock_file('task_accept_resp.json') self.custom_locust.set_response( "/suite/rest/a/task/latest/Bs3k2OfS55jCOcMb5D/status", 200, task_to_accept ) self.custom_locust.set_response( "/suite/rest/a/task/latest/Bs3k2OfS55jCOcMb5D/attributes", 200, """{ "isOfflineTask": false, "isSailTask": true, "isQuickTask": false, "taskId": "Bs3k2OfS55jCOcMb5D", "isAutoAcceptable": "true" }""") sites_task_report.click('Issue recommendation') task_to_accept_state = json.loads(task_to_accept) self.assertNotEqual(initial_uuid, sites_task_report.uuid) self.assertNotEqual(initial_context, sites_task_report.context) self.assertEqual(task_to_accept_state['uuid'], sites_task_report.uuid) self.assertEqual(task_to_accept_state['context'], sites_task_report.context) # Assert ui state updated self.assertEqual('Available Case Workers', find_component_by_attribute_in_dict('label', 'Available Case Workers', sites_task_report.state).get('label') )