import json from time import sleep from unittest import SkipTest import boto3 from moto import mock_aws, settings from tests import DEFAULT_ACCOUNT_ID as ACCOUNT_ID failure_definition = { "Comment": "An example of the Amazon States Language using a choice state.", "StartAt": "DefaultState", "States": { "DefaultState": { "Type": "Fail", "Error": "DefaultStateError", "Cause": "No Matches!", } }, } @mock_aws(config={"stepfunctions": {"execute_state_machine": True}}) def test_state_machine_with_simple_failure_state(): if settings.TEST_SERVER_MODE: raise SkipTest("Don't need to test this in ServerMode") client = boto3.client("stepfunctions", region_name="us-east-1") execution_arn, state_machine_arn = _start_execution(client, failure_definition) for _ in range(5): execution = client.describe_execution(executionArn=execution_arn) if execution["status"] == "FAILED": assert "stopDate" in execution assert execution["error"] == "DefaultStateError" assert execution["cause"] == "No Matches!" history = client.get_execution_history(executionArn=execution_arn) assert len(history["events"]) == 3 assert [e["type"] for e in history["events"]] == [ "ExecutionStarted", "FailStateEntered", "ExecutionFailed", ] executions = client.list_executions(stateMachineArn=state_machine_arn)[ "executions" ] assert len(executions) == 1 assert executions[0]["executionArn"] == execution_arn assert executions[0]["stateMachineArn"] == state_machine_arn assert executions[0]["status"] == "FAILED" break sleep(0.2) else: assert False, "Should have failed already" def _start_execution(client, definition): name = "sfn_name" # response = client.create_state_machine( name=name, definition=json.dumps(definition), roleArn=_get_default_role() ) state_machine_arn = response["stateMachineArn"] execution = client.start_execution(name="exec1", stateMachineArn=state_machine_arn) execution_arn = execution["executionArn"] return execution_arn, state_machine_arn def _get_default_role(): return "arn:aws:iam::" + ACCOUNT_ID + ":role/unknown_sf_role"