예제 #1
0
    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
예제 #2
0
    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
예제 #3
0
    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'
예제 #4
0
    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)
예제 #5
0
 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
예제 #6
0
 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
예제 #7
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
예제 #8
0
 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'
예제 #9
0
 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() == {}
예제 #10
0
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
예제 #11
0
 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
예제 #12
0
 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
예제 #13
0
    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'
예제 #14
0
 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')
예제 #15
0
    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]
예제 #16
0
    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
예제 #17
0
    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_']
예제 #18
0
 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
예제 #19
0
 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
예제 #20
0
 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
예제 #21
0
    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'}
예제 #22
0
    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
예제 #23
0
 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
예제 #24
0
 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
예제 #25
0
    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
예제 #26
0
    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
예제 #27
0
    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')
예제 #28
0
 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')
예제 #29
0
    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()
예제 #30
0
 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'