import base64 import json import logging import os from datetime import datetime from unittest.mock import patch from common.schemas.s3_event import S3Event from common.schemas.s3_reference import S3Reference from src.app import main logger = logging.getLogger() def generate_fake_task_token() -> str: """Generate a fake AWS Step Functions task token for testing/mocking.""" random_bytes = os.urandom( 256 ) # Real tokens are long — this makes it ~350 chars base64 return base64.b64encode(random_bytes).decode("utf-8") with open("event.json") as file: s3_reference: S3Reference = S3Event.model_validate(json.load(file)).to_reference() os.environ["KEY"] = s3_reference.key os.environ["BUCKET"] = s3_reference.bucket os.environ["TASK_TOKEN"] = generate_fake_task_token() def mock_heartbeat(**kwargs) -> dict[str, None]: """Mock heartbeat that prints system time instead of calling AWS.""" current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f") logger.info(f"[mock] Heartbeat called at: {current_time}") # noqa: G004 return {} def mock_send_task_success(**kwargs) -> dict[str, None]: """Mock send_task_success that prints system time instead of calling AWS.""" current_time = datetime.now().strftime("%Y-%m-%d %H:%M:%S.%f") logger.info(f"[mock] send_task_success called at: {current_time}") # noqa: G004 return {} # Patch the sfn methods to use our mocks heartbeat_patch = patch("src.connectors.sfn.heartbeat", side_effect=mock_heartbeat) send_task_success_patch = patch("src.connectors.sfn.send_task_success", side_effect=mock_send_task_success) heartbeat_patch.start() send_task_success_patch.start() main()