def test_choice_state_with_placeholders(): first_state = Task( 'FirstState', resource='arn:aws:lambda:us-east-1:1234567890:function:FirstState') retry = Chain([Pass('Retry'), Pass('Cleanup'), first_state]) choice_state = Choice('Is Completed?') choice_state.add_choice( ChoiceRule.BooleanEquals(choice_state.output()["Completed"], True), Succeed('Complete')) choice_state.add_choice( ChoiceRule.BooleanEquals(choice_state.output()["Completed"], False), retry) first_state.next(choice_state) result = Graph(first_state).to_dict() expected_repr = { "StartAt": "FirstState", "States": { "FirstState": { "Resource": "arn:aws:lambda:us-east-1:1234567890:function:FirstState", "Type": "Task", "Next": "Is Completed?" }, "Is Completed?": { "Type": "Choice", "Choices": [{ "Variable": "$['Completed']", "BooleanEquals": True, "Next": "Complete" }, { "Variable": "$['Completed']", "BooleanEquals": False, "Next": "Retry" }] }, "Complete": { "Type": "Succeed" }, "Retry": { "Type": "Pass", "Next": "Cleanup" }, "Cleanup": { "Type": "Pass", "Next": "FirstState" } } } assert result == expected_repr
def test_wait_loop(): first_state = Task( 'FirstState', resource='arn:aws:lambda:us-east-1:1234567890:function:FirstState') retry = Chain([Pass('Retry'), Pass('Cleanup'), first_state]) choice_state = Choice('Is Completed?') choice_state.add_choice(ChoiceRule.BooleanEquals('$.Completed', True), Succeed('Complete')) choice_state.add_choice(ChoiceRule.BooleanEquals('$.Completed', False), retry) first_state.next(choice_state) result = Graph(first_state).to_dict() assert result == { 'StartAt': 'FirstState', 'States': { 'FirstState': { 'Type': 'Task', 'Resource': 'arn:aws:lambda:us-east-1:1234567890:function:FirstState', 'Next': 'Is Completed?' }, 'Is Completed?': { 'Type': 'Choice', 'Choices': [{ 'Variable': '$.Completed', 'BooleanEquals': True, 'Next': 'Complete' }, { 'Variable': '$.Completed', 'BooleanEquals': False, 'Next': 'Retry' }] }, 'Complete': { 'Type': 'Succeed' }, 'Retry': { 'Type': 'Pass', 'Next': 'Cleanup', }, 'Cleanup': { 'Type': 'Pass', 'Next': 'FirstState' } } }
def test_rule_serialization(): bool_rule = ChoiceRule.BooleanEquals('$.BooleanVariable', True) assert bool_rule.to_dict() == { 'Variable': '$.BooleanVariable', 'BooleanEquals': True } string_rule = ChoiceRule.StringEquals('$.StringVariable', 'ABC') assert string_rule.to_dict() == { 'Variable': '$.StringVariable', 'StringEquals': 'ABC' } and_rule = ChoiceRule.And([bool_rule, string_rule]) assert and_rule.to_dict() == { 'And': [{ 'Variable': '$.BooleanVariable', 'BooleanEquals': True }, { 'Variable': '$.StringVariable', 'StringEquals': 'ABC' }] } not_rule = ChoiceRule.Not(string_rule) assert not_rule.to_dict() == { 'Not': { 'Variable': '$.StringVariable', 'StringEquals': 'ABC' } } compound_rule = ChoiceRule.Or([and_rule, not_rule]) assert compound_rule.to_dict() == { 'Or': [{ 'And': [{ 'Variable': '$.BooleanVariable', 'BooleanEquals': True }, { 'Variable': '$.StringVariable', 'StringEquals': 'ABC' }], }, { 'Not': { 'Variable': '$.StringVariable', 'StringEquals': 'ABC' } }] }
def test_variable_value_must_be_consistent(): string_functions = ( 'StringEquals', 'StringLessThan', 'StringGreaterThan', 'StringLessThanEquals', 'StringGreaterThanEquals', ) for string_function in string_functions: func = getattr(ChoiceRule, string_function) with pytest.raises(ValueError): func('$.Variable', 42) numeric_functions = ( 'NumericEquals', 'NumericLessThan', 'NumericGreaterThan', 'NumericLessThanEquals', 'NumericGreaterThanEquals', ) for numeric_function in numeric_functions: func = getattr(ChoiceRule, numeric_function) with pytest.raises(ValueError): func('$.Variable', 'ABC') with pytest.raises(ValueError): ChoiceRule.BooleanEquals('$.Variable', 42) timestamp_functions = ( 'TimestampEquals', 'TimestampLessThan', 'TimestampGreaterThan', 'TimestampLessThanEquals', 'TimestampGreaterThanEquals', ) for timestamp_function in timestamp_functions: func = getattr(ChoiceRule, timestamp_function) with pytest.raises(ValueError): func('$.Variable', True)
crawl_database_check_status.add_retry( sf.steps.Retry(error_equals=[ "Lambda.ServiceException", "Lambda.AWSLambdaException", "Lambda.SdkClientException" ]) ) crawl_database_check_status.add_catch(Catch( error_equals=["States.TaskFailed"], next_step=fail_state )) crawl_database_check_choice = sf.steps.Choice( state_id='Check finished?', ) crawl_database_check_choice.add_choice( ChoiceRule.BooleanEquals('$.crawlerStatus', False), crawl_database_wait ) crawl_database_check_choice.add_choice( ChoiceRule.BooleanEquals('$.crawlerStatus', True), finish ) workflow_definition = sf.steps.Chain([ glue_import_to_s3_job, crawl_params, crawl_database_start, crawl_database_wait, crawl_database_check_status, crawl_database_check_choice ])