"""Shared fixtures for custom_reports integration tests.""" import logging import os import time from typing import Any from typing import Generator from aws_testing_utils import lambda_handler import pytest from sqlalchemy.orm import Session from tests import config from tests.src import database from tests.src.utils import s3_key_from_location logger = logging.getLogger(__name__) S3_BUCKET = config.MONEYHUB_CUSTOM_REPORTS_BUCKET @pytest.fixture(scope='session') def warm_up_lambda() -> None: """Pre-warm the custom-reports Lambda. No-op when targeting a local RIE.""" if os.environ.get('LAMBDA_ENDPOINT_URL'): return handler = lambda_handler.LambdaHandler() for _ in range(3): handler.warm_up(config.LAMBDA_CUSTOM_REPORTS) time.sleep(5) @pytest.fixture def setup( request: pytest.FixtureRequest, db_session: Session, s3_client: Any, warm_up_lambda: None, ) -> Generator[dict[str, Any], None, None]: """Seed a report_custom row and clean up after the test. Commits the insert immediately so the row is visible to the lambda (which runs in a separate process) before the test begins. Accepts a seed-data callable via indirect parametrize. """ # --- create testing data --- seed_fn = request.param data = seed_fn() fixture_file_path = data.pop('fixture_file_path', None) expected_filename = data.pop('expected_filename', None) delete_conditions = { 'account_id': data['account_id'], 'contract_id': data['contract_id'], 'statement_period_ids': data['statement_period_ids'], 'dimension_row': data['dimension_row'], 'dimension_column': data['dimension_column'], } result = database.insert_entity( db_session, 'report_custom', data, id_column='report_custom_id', delete_conditions=delete_conditions, ) db_session.commit() assert result is not None expected = {k: v for k, v in data.items() if k != 'created_at'} assert {k: result[k] for k in expected} == expected logger.info('Seeded report_custom id=%s', result['report_custom_id']) yield { **result, 'fixture_file_path': fixture_file_path, 'expected_filename': expected_filename, } # test runs here # --- clean up testing data --- record = database.get_entity( db_session, 'report_custom', {'report_custom_id': result['report_custom_id']}, ) if record and record.get('file_location'): s3_key = s3_key_from_location(record['file_location'], S3_BUCKET) s3_client.delete_if_object_present(S3_BUCKET, s3_key) logger.info('Deleted S3 object %s', s3_key) database.delete_entity_by_id( db_session, 'report_custom', 'report_custom_id', result['report_custom_id'], ) logger.info('Deleted report_custom id=%s', result['report_custom_id'])