import typing as t from contextlib import nullcontext from unittest.mock import Mock import boto3 import botocore.errorfactory import pytest from moto import mock_stepfunctions, stepfunctions from slz_clean_up.services.sf_execution import JobService @pytest.fixture(scope="function") def step_function_client(aws_credentials): with mock_stepfunctions(): sf_client = boto3.client('stepfunctions') yield sf_client stepfunctions.stepfunction_backends.clear() @pytest.fixture(scope="function") def step_function_arn(step_function_client): response = step_function_client.create_state_machine( name='test-delphi-slzMainFlow', definition='any', roleArn='arn:aws:iam::475275892927:role/test-delphi-slz_stepfunction_role', ) sf_arn = response['stateMachineArn'] yield sf_arn step_function_client.delete_state_machine(stateMachineArn=sf_arn) @pytest.fixture(scope="function") def step_function_executions_arn(step_function_client, step_function_arn, request): sf_executions = [] names = request.param for name in names: response = step_function_client.start_execution( stateMachineArn=step_function_arn, name=name, input='{}', ) sf_executions.append(response['executionArn']) yield sf_executions for execution in sf_executions: response = step_function_client.stop_execution( executionArn=execution, error='any', cause='any', ) @pytest.mark.parametrize( 'current_execution, step_function_executions_arn, expected', [ ( 'arn:aws:states:us-east-1:123456789012:execution:test-delphi-slzMainFlow:test-exec-1', [ 'test-exec-1', 'test-exec-2', 'test-exec-3', ], nullcontext(), ), # ( # 'arn:aws:states:us-east-1:123456789012:execution:test-delphi-slzMainFlow:test-exec-4', # [ # 'test-exec-1', # 'test-exec-2', # 'test-exec-3', # ], # pytest.raises(stepfunctions.exceptions.ExecutionDoesNotExist), # ), ], indirect=['step_function_executions_arn'] ) def test_stop_uow_execution( step_function_client, step_function_arn, current_execution, step_function_executions_arn, expected ): job_service = JobService(Mock(), step_function_client, step_function_arn, current_execution) with expected: job_service.stop_uow_execution(current_execution) @pytest.mark.parametrize( 'current_execution, step_function_executions_arn, job_ids, expected', [ ( 'arn:aws:states:us-east-1:123456789012:execution:test-delphi-slzMainFlow:test-exec-1', [ 'test-exec-1', 'test-exec-2', 'test-exec-3', 'test-exec-4', ], [ 'test-exec-1', 'test-exec-2', 'test-exec-3', ], [ 'test-exec-2', 'test-exec-3', ], ), ( 'arn:aws:states:us-east-1:123456789012:execution:test-delphi-slzMainFlow:test-exec-1', [ 'test-exec-1', ], [ 'test-exec-1', ], [], ), ], indirect=['step_function_executions_arn'] ) def test_stop_uow_executions( step_function_client, step_function_arn: str, current_execution: str, step_function_executions_arn, job_ids: t.List[str], expected: t.List[str], ): job_service = JobService(Mock(), step_function_client, step_function_arn, current_execution) result = job_service.stop_uow_executions(job_ids) assert set(result) == set(expected)