def test_choice_state_creation():
    choice_state = Choice('Choice', input_path='$.Input')
    choice_state.add_choice(ChoiceRule.IsPresent("$.StringVariable1", True), Pass("End State 1"))
    choice_state.add_choice(ChoiceRule.StringEquals("$.StringVariable1", "ABC"), Pass("End State 1"))
    choice_state.add_choice(ChoiceRule.StringLessThanEqualsPath("$.StringVariable2", "$.value"), Pass("End State 2"))
    choice_state.default_choice(Pass('End State 3'))
    assert choice_state.state_id == 'Choice'
    assert len(choice_state.choices) == 3
    assert choice_state.default.state_id == 'End State 3'
    assert choice_state.to_dict() == {
        'Type': 'Choice',
        'InputPath': '$.Input',
        'Choices': [
            {
                'Variable': '$.StringVariable1',
                'IsPresent': True,
                'Next': 'End State 1'
            },
            {
                'Variable': '$.StringVariable1',
                'StringEquals': 'ABC',
                'Next': 'End State 1'
            },
            {
                'Variable': '$.StringVariable2',
                'StringLessThanEqualsPath': '$.value',
                'Next': 'End State 2'
            }
        ],
        'Default': 'End State 3'
    }

    with pytest.raises(TypeError):
        Choice('Choice', unknown_field='Unknown Field')
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_must_start_with_prefix():
    with pytest.raises(ValueError):
        ChoiceRule.StringEquals('Variable', '42')
            'SAGEMAKER_AUTOPILOT_TARGET_MODEL',
            'Type':
            'PLAIN_TEXT',
            'Value':
            '{}.tar.gz'.format(execution_input['ModelName'])
        }]
    })

# happy path
model_and_endpoint_step = Chain(
    [model_step, endpoint_config_step, endpoint_step, deploy_rest_api_task])

# define choice
check_job_choice.add_choice(
    ChoiceRule.StringEquals(variable=check_autopilot_job_status.output()
                            ['Payload']['AutopilotJobStatus'],
                            value='InProgress'),
    next_step=check_autopilot_job_status)

check_job_choice.add_choice(
    ChoiceRule.StringEquals(variable=check_autopilot_job_status.output()
                            ['Payload']['AutopilotJobStatus'],
                            value='Stopping'),
    next_step=check_autopilot_job_status)

check_job_choice.add_choice(
    ChoiceRule.StringEquals(variable=check_autopilot_job_status.output()
                            ['Payload']['AutopilotJobStatus'],
                            value='Failed'),
    next_step=workflow_failure)