def test_get_id_previous_started_multi_page(self, page1_response, page2_response, dt1, dt2, dt3, mocker): page1_response['events'] = [{ 'eventId': 3, 'eventType': 'DecisionTaskStarted', 'eventTimestamp': dt3 }, { 'eventId': 2, 'eventType': 'DecisionTaskCompleted', 'eventTimestamp': dt2 }] page2_response['events'] = [{ 'eventId': 1, 'eventType': 'DecisionTaskStarted', 'eventTimestamp': dt1 }] swf_mock = SwfMock() swf_mock.pages['page2'] = page2_response mocker.patch('floto.api.Swf.client', new_callable=PropertyMock, return_value=swf_mock) h = floto.History(domain='d', task_list='tl', response=page1_response) assert h.get_id_previous_started(page1_response['events'][0]) == 1
def test_get_number_activity_task_failures(self, empty_response, dt1, dt2, dt3): activity_task_timed_out_event = { 'eventId': 3, 'eventType': 'ActivityTaskTimedOut', 'eventTimestamp': dt3, 'activityTaskTimedOutEventAttributes': { 'scheduledEventId': 1 } } activity_task_failed_event = { 'eventId': 2, 'eventType': 'ActivityTaskFailed', 'eventTimestamp': dt2, 'activityTaskFailedEventAttributes': { 'scheduledEventId': 1 } } events = [ activity_task_timed_out_event, activity_task_failed_event, { 'eventId': 1, 'eventType': 'ActivityTaskScheduled', 'eventTimestamp': dt1, 'activityTaskScheduledEventAttributes': { 'activityId': 'a_id' } } ] empty_response['events'] = events h = floto.History(domain='d', task_list='tl', response=empty_response) assert h.get_number_activity_task_failures('a_id') == 2
def test_get_id_activity_task_event_for_failed(self, empty_response, dt1, dt2): activity_task_failed_event = { 'eventId': 2, 'eventType': 'ActivityTaskFailed', 'eventTimestamp': dt2, 'activityTaskFailedEventAttributes': { 'scheduledEventId': 1 } } events = [ activity_task_failed_event, { 'eventId': 1, 'eventType': 'ActivityTaskScheduled', 'eventTimestamp': dt1, 'activityTaskScheduledEventAttributes': { 'activityId': 'a_id' } } ] empty_response['events'] = events h = floto.History(domain='d', task_list='tl', response=empty_response) assert h.get_id_activity_task_event( activity_task_failed_event) == 'a_id'
def test_get_result_completed_activity_wo_result(self, dt1, dt2, empty_response): activity_task_completed_event = { 'eventId': 2, 'eventType': 'ActivityTaskCompleted', 'eventTimestamp': dt2, 'activityTaskCompletedEventAttributes': { 'scheduledEventId': 1 } } activity_task_scheduled_event = { 'eventId': 1, 'eventType': 'ActivityTaskScheduled', 'eventTimestamp': dt1, 'activityTaskScheduledEventAttributes': { 'activityId': 'a_id' } } empty_response['events'] = [ activity_task_completed_event, activity_task_scheduled_event ] h = floto.History(domain='d', task_list='tl', response=empty_response) task = floto.specs.task.ActivityTask(domain='d', name='a', version='1', id_='a_id') assert not h.get_result_completed_activity(task)
def test_get_datetime_previous_decision_wo(self, empty_response, dt1): empty_response['events'] = [{ 'eventId': 1, 'eventType': 'WorkflowExecutionStarted', 'eventTimestamp': dt1 }] h = floto.History(domain='d', task_list='tl', response=empty_response) assert h.get_datetime_previous_decision() == dt1
def test_init(self, init_response): h = floto.History(domain='d', task_list='tl', response=init_response) assert h.domain == 'd' assert h.task_list == 'tl' assert h.next_page_token == None assert h.highest_event_id == 3 assert h.lowest_event_id == 1 assert h.decision_task_started_event_id == 3 assert h.previous_decision_id == 0
def get_fail_workflow_execution(domain, run_id, workflow_id): response = floto.api.Swf().get_workflow_execution_history('floto_test', run_id, workflow_id) response['startedEventId'] = 1 response['previousStartedEventId'] = 1 history = floto.History('floto_test', 'no_task_list', response) failed_event = history.get_events_by_type('WorkflowExecutionFailed')[0] details = json.loads(history.get_event_attributes(failed_event)['details']) return details
def test_get_workflow_input_page2(self, mocker, page1_response, page2_response): swf_mock = SwfMock() swf_mock.pages['page2'] = page2_response mocker.patch('floto.api.Swf.client', new_callable=PropertyMock, return_value=swf_mock) h = floto.History(domain='d', task_list='tl', response=page1_response) assert h.get_workflow_input() == 'workflow_input'
def test_get_workflow_input_without_input(self, empty_response, dt1): events = [{ 'eventId': 1, 'eventTimestamp': dt1, 'eventType': 'WorkflowExecutionStarted', 'workflowExecutionStartedEventAttributes': {} }] empty_response['events'] = events h = floto.History('d', 'tl', empty_response) assert h.get_workflow_input() == {}
def is_workflow_completed(domain, run_id, workflow_id): response = floto.api.Swf().get_workflow_execution_history('floto_test', run_id, workflow_id) response['startedEventId'] = 1 response['previousStartedEventId'] = 1 history = floto.History('floto_test', 'no_task_list', response) result = None if history.get_events_by_type('WorkflowExecutionCompleted'): wf_completed = history.get_events_by_type('WorkflowExecutionCompleted')[0] result = json.loads(history.get_event_attributes(wf_completed)['result']) return result
def test__has_next_event_page_true(self, dt1, empty_response): events = [{ 'eventId': 1, 'eventType': 'DecisionTaskCompleted', 'eventTimestamp': dt1 }] empty_response['events'] = events empty_response['previousStartedEvent'] = 1 empty_response['nextPageToken'] = 'page2' h = floto.History(domain='d', task_list='tl', response=empty_response) assert h._has_next_event_page() == True
def test_events_by_id_forbid_next_page(self, mocker, page1_response, page2_response): swf_mock = SwfMock() swf_mock.pages['page2'] = page2_response mocker.patch('floto.api.Swf.client', new_callable=PropertyMock, return_value=swf_mock) h = floto.History(domain='d', task_list='tl', response=page1_response) assert h.lowest_event_id == 2 assert h.get_event(1, allow_read_next_event_page=False) == None assert h.lowest_event_id == 2
def test_read_next_event_page(self, mocker, page1_response, page2_response): swf_mock = SwfMock() swf_mock.pages['page2'] = page2_response mocker.patch('floto.api.Swf.client', new_callable=PropertyMock, return_value=swf_mock) h = floto.History(domain='d', task_list='tl', response=page1_response) h._read_next_event_page() assert h.events_by_id[1]['eventType'] == 'WorkflowExecutionStarted' assert h.next_page_token == 'page3'
def test_is_timer_task_completed_with_started_event( self, init_response, dt1): events = [{ 'eventId': 1, 'eventType': 'TimerStarted', 'eventTimestamp': dt1, 'timerStartedEventAttributes': { 'timerId': 't_id' } }] init_response['events'] = events h = floto.History(domain='d', task_list='tl', response=init_response) assert not h.is_timer_task_completed('t_id')
def test_read_events_up_to_last_decision(self, mocker, page1_decision_response, page2_decision_response): swf_mock = SwfMock() swf_mock.pages['page2'] = page2_decision_response mocker.patch('floto.api.Swf.client', new_callable=PropertyMock, return_value=swf_mock) h = floto.History(domain='d', task_list='tl', response=page1_decision_response) assert h.events_by_id[1]
def test_get_number_child_workflow_failures_after_completion( self, empty_response, dt1, dt2, dt3, dt4): child_workflow_timed_out_event = { 'eventId': 4, 'eventType': 'ChildWorkflowExecutionTimedOut', 'eventTimestamp': dt4, 'childWorkflowExecutionTimedOutEventAttributes': { 'workflowExecution': { 'workflowId': 'wid' } } } child_workflow_completed_event = { 'eventId': 3, 'eventType': 'ChildWorkflowExecutionCompleted', 'eventTimestamp': dt3, 'childWorkflowExecutionCompletedEventAttributes': { 'workflowExecution': { 'workflowId': 'wid' } } } child_workflow_failed_event = { 'eventId': 2, 'eventType': 'ChildWorkflowExecutionFailed', 'eventTimestamp': dt2, 'childWorkflowExecutionFailedEventAttributes': { 'workflowExecution': { 'workflowId': 'wid' } } } child_workflow_initiated_event = { 'eventId': 1, 'eventType': 'StartChildWorkflowExecutionInitiated', 'eventTimestamp': dt1, 'startChildWorkflowExecutionInitiatedEventAttributes': { 'workflowId': 'wid' } } events = [ child_workflow_timed_out_event, child_workflow_completed_event, child_workflow_failed_event, child_workflow_initiated_event ] empty_response['events'] = events h = floto.History(domain='d', task_list='tl', response=empty_response) assert h.get_number_child_workflow_failures('wid') == 1
def test_compress_generator_result(self, init_response): task = floto.specs.task.ActivityTask(domain='d', name='activity1', version='v1') result = [task] floto.decorators.COMPRESS_GENERATOR_RESULT = True z = floto.decorators.compress_generator_result(result) floto.decorators.COMPRESS_GENERATOR_RESULT = False b = floto.decider.DecisionBuilder(activity_tasks=[task], default_activity_task_list='floto_activities') b.history = floto.History('d', 'tl', init_response) uncompressed = b._decompress_result(z) assert result[0].id_ == uncompressed[0]['id_']
def test_get_id_previous_started(self, empty_response, dt1, dt2): started_2 = { 'eventId': 2, 'eventType': 'DecisionTaskStarted', 'eventTimestamp': dt2 } started_1 = { 'eventId': 1, 'eventType': 'DecisionTaskStarted', 'eventTimestamp': dt1 } empty_response['events'] = [started_2, started_1] h = floto.History(domain='d', task_list='tl', response=empty_response) assert h.get_id_previous_started(started_2) == 1
def test_get_event_by_task_id_and_type_single_event( self, init_response, dt1): events = [{ 'eventId': 1, 'eventType': 'ActivityTaskScheduled', 'eventTimestamp': dt1, 'activityTaskScheduledEventAttributes': { 'activityId': 'a_id' } }] init_response['events'] = events h = floto.History(domain='d', task_list='tl', response=init_response) assert h.get_event_by_task_id_and_type( 'a_id', 'ActivityTaskScheduled')['eventId'] == 1
def test_get_datetime_previous_decision_contained_in_page( self, empty_response, dt1, dt2): events = [{ 'eventId': 2, 'eventTimestamp': dt2, 'eventType': 'DecisionTaskStarted' }, { 'eventId': 1, 'eventTimestamp': dt1, 'eventType': 'WorkflowExecutionStarted' }] empty_response['events'] = events empty_response['previousStartedEventId'] = 2 h = floto.History(domain='d', task_list='tl', response=empty_response) assert h.get_datetime_previous_decision() == dt2
def test_get_result_completed_activity_rescheduled(self, dt1, dt2, dt3, page1_response, page2_response, mocker): activity_task_completed_event = { 'eventId': 3, 'eventType': 'ActivityTaskCompleted', 'eventTimestamp': dt3, 'activityTaskCompletedEventAttributes': { 'scheduledEventId': 1, 'result': '{"foo":"bar"}' } } decision_completed = { 'eventId': 2, 'eventType': 'DecisionTaskCompleted', 'eventTimestamp': dt2 } activity_task_scheduled_event = { 'eventId': 1, 'eventType': 'ActivityTaskScheduled', 'eventTimestamp': dt1, 'activityTaskScheduledEventAttributes': { 'activityId': 'a_id' } } page1_response['previousStartedEventId'] = 2 page1_response['events'] = [ activity_task_completed_event, decision_completed ] page2_response['events'] = [activity_task_scheduled_event] swf_mock = SwfMock() swf_mock.pages['page2'] = page2_response mocker.patch('floto.api.Swf.client', new_callable=PropertyMock, return_value=swf_mock) h = floto.History(domain='d', task_list='tl', response=page1_response) task = floto.specs.task.ActivityTask(domain='d', name='a', version='1', id_='a_id') assert h.get_result_completed_activity(task) == {'foo': 'bar'}
def test_get_datetime_previous_decision_contained_in_page2( self, mocker, page1_decision_response, page2_decision_response): swf_mock = SwfMock() swf_mock.pages['page2'] = page2_decision_response mocker.patch('floto.api.Swf.client', new_callable=PropertyMock, return_value=swf_mock) h = floto.History(domain='d', task_list='tl', response=page1_decision_response) dt1 = datetime.datetime(2016, 1, 12, hour=1, tzinfo=datetime.timezone.utc) h.get_datetime_previous_decision() == dt1
def test_event_by_activity_id_wo_scheduled_event(self, empty_response, dt1, dt2): events = [{ 'eventId': 3, 'eventType': 'ActivityTaskCompleted', 'eventTimestamp': dt2, 'activityTaskCompletedEventAttributes': { 'scheduledEventId': 1 } }, { 'eventId': 2, 'eventType': 'DecisionTaskCompleted', 'eventTimestamp': dt1 }] empty_response['events'] = events empty_response['previousStartedEventId'] = 2 h = floto.History(domain='d', task_list='tl', response=empty_response) assert h.events_by_activity_id['none']['ActivityTaskCompleted'][0][ 'eventId'] == 3
def test_event_by_activity_id(self, dt1, dt2, empty_response): events = [{ 'eventId': 2, 'eventType': 'ActivityTaskCompleted', 'eventTimestamp': dt2, 'activityTaskCompletedEventAttributes': { 'scheduledEventId': 1 } }, { 'eventId': 1, 'eventType': 'ActivityTaskScheduled', 'eventTimestamp': dt1, 'activityTaskScheduledEventAttributes': { 'activityId': 'a_id' } }] empty_response['events'] = events h = floto.History(domain='d', task_list='tl', response=empty_response) assert h.events_by_activity_id['a_id']['ActivityTaskCompleted'][0][ 'eventId'] == 2
def test_get_id_activity_task_event_multi_page_forbid_next_page( self, page1_response, page2_response, dt1, dt2, dt3, mocker): activity_task_failed_event = { 'eventId': 3, 'eventType': 'ActivityTaskFailed', 'eventTimestamp': dt3, 'activityTaskFailedEventAttributes': { 'scheduledEventId': 1 } } decision_task_completed = { 'eventId': 2, 'eventType': 'DecisionTaskCompleted', 'eventTimestamp': dt2 } activity_task_scheduled_event = { 'eventId': 1, 'eventType': 'ActivityTaskScheduled', 'eventTimestamp': dt1, 'activityTaskScheduledEventAttributes': { 'activityId': 'a_id' } } page1_response['events'] = [ activity_task_failed_event, decision_task_completed ] page2_response['events'] = [activity_task_scheduled_event] swf_mock = SwfMock() swf_mock.pages['page2'] = page2_response mocker.patch('floto.api.Swf.client', new_callable=PropertyMock, return_value=swf_mock) h = floto.History(domain='d', task_list='tl', response=page1_response) activity_id = h.get_id_activity_task_event( activity_task_failed_event, allow_read_next_event_page=False) assert activity_id == None
def test_get_event_by_task_id_and_type_next_page(self, mocker, page1_response, page2_response): events = [{ 'eventId': 1, 'eventType': 'ActivityTaskScheduled', 'eventTimestamp': dt1, 'activityTaskScheduledEventAttributes': { 'activityId': 'a_id' } }] page2_response['events'] = events swf_mock = SwfMock() swf_mock.pages['page2'] = page2_response mocker.patch('floto.api.Swf.client', new_callable=PropertyMock, return_value=swf_mock) h = floto.History(domain='d', task_list='tl', response=page1_response) assert h.get_event_by_task_id_and_type( 'a_id', 'ActivityTaskScheduled')['eventId'] == 1
def test_get_event_by_task_id_and_type_no_event(self, init_response, dt1, dt2): events = [{ 'eventId': 3, 'eventType': 'ActivityTaskCompleted', 'eventTimestamp': dt2, 'activityTaskCompletedEventAttributes': { 'activityId': 'a_id', 'scheduledEventId': 1 } }, { 'eventId': 2, 'eventType': 'DecisionTaskCompleted', 'eventTimestamp': dt1 }] init_response['events'] = events init_response['previousStartedEventId'] = 1 h = floto.History(domain='d', task_list='tl', response=init_response) assert not h.get_event_by_task_id_and_type('a_id', 'ActivityTaskScheduled')
def test_is_activity_task_completed(self, init_response, dt1, dt2, dt3): events = [{ 'eventId': 3, 'eventType': 'ActivityTaskCompleted', 'eventTimestamp': dt3, 'activityTaskCompletedEventAttributes': { 'scheduledEventId': 2 } }, { 'eventId': 2, 'eventType': 'ActivityTaskScheduled', 'eventTimestamp': dt2, 'activityTaskScheduledEventAttributes': { 'activityId': 'a_id' } }, { 'eventId': 1, 'eventType': 'WorkflowExecutionStarted', 'eventTimestamp': dt1 }] init_response['events'] = events h = floto.History(domain='d', task_list='tl', response=init_response) assert h.is_activity_task_completed('a_id')
def test_is_timer_task_completed_multiple_pages(self, page1_response, page2_response, dt1, dt2, dt3, mocker): page1_response['events'] = [{ 'eventId': 3, 'eventType': 'TimerFired', 'eventTimestamp': dt3, 'timerFiredEventAttributes': { 'timerId': 't_id' } }, { 'eventId': 2, 'eventType': 'DecisionTaskCompleted', 'eventTimestamp': dt2 }] page2_response['events'] = [{ 'eventId': 1, 'eventType': 'TimerStarted', 'eventTimestamp': dt1, 'timerStartedEventAttributes': { 'timerId': 't_id' } }] page2_response.pop('nextPageToken', None) swf_mock = SwfMock() swf_mock.pages['page2'] = page2_response mocker.patch('floto.api.Swf.client', new_callable=PropertyMock, return_value=swf_mock) h = floto.History(domain='d', task_list='tl', response=page1_response) assert h._has_next_event_page() assert h.is_timer_task_completed('t_id') assert not h._has_next_event_page()
def test_events_by_id(self, init_response): h = floto.History(domain='d', task_list='tl', response=init_response) assert h.events_by_id[1]['eventType'] == 'WorkflowExecutionStarted'