"""Tests for bulk ingestion Slack notification logic.""" from urllib.parse import quote import flask from pytest_mock.plugin import MockerFixture from notifications.api import app from notifications.config import ENVIRONMENT from notifications.connectors import slack from notifications.connectors.redis import client as redis_client from notifications.logic import bulk_ingestion_slack vendor_id = '32387' vendor_name = 'Kitty Wizard Records' execution_arn = 'arn:aws:states:us-east-1:437795906767:execution:prod-sfn-bulk-session-ingest:7d4b1541-1cd7-4c24-9e8b-9542bd90002c_20251119154453' # noqa: E501 bulk_session_id = '7d4b1541-1cd7-4c24-9e8b-9542bd90002c' total_products = 125 payload = { 'total_products': total_products, 'vendor_id': vendor_id, 'vendor_name': vendor_name, 'execution_arn': execution_arn, 'bulk_session_id': bulk_session_id, } def test_bulk_ingest_started(mocker: MockerFixture) -> None: """Test bulk ingest started Slack notification logic.""" ts = '1700420000.000400' send_message_mock = mocker.patch.object(slack, 'send_bulk_message', return_value=ts) redis_mock = mocker.patch.object(redis_client, 'set', return_value=None) rendered_template: str | None = None with app.app_context(): rendered_template = flask.render_template( 'slack/bulk_ingestion/ingestion_start.jinja', **payload, env=ENVIRONMENT ) bulk_ingestion_slack.bulk_ingest_started(payload=payload) send_message_mock.assert_called_once_with(body=rendered_template, color='#d5d5d5') redis_mock.assert_called_once_with( bulk_ingestion_slack.ts_redis_key(execution_arn), ts, ex=2592000 ) def test_bulk_ingest_succeeded(mocker: MockerFixture) -> None: """Test bulk ingest succeeded Slack notification logic.""" send_message_mock = mocker.patch.object(slack, 'send_bulk_message', return_value=None) redis_delete_mock = mocker.patch.object(redis_client, 'delete', return_value=None) rendered_template: str | None = None with app.app_context(): rendered_template = flask.render_template( 'slack/bulk_ingestion/ingestion_success.jinja', **payload, env=ENVIRONMENT ) bulk_ingestion_slack.bulk_ingest_succeeded(payload=payload) send_message_mock.assert_called_once_with(body=rendered_template, color='#2aad73') redis_delete_mock.assert_called_once_with(bulk_ingestion_slack.ts_redis_key(execution_arn)) def test_bulk_ingest_failed(mocker: MockerFixture) -> None: """Test bulk ingest failed Slack notification logic.""" send_message_mock = mocker.patch.object(slack, 'send_bulk_message', return_value=None) redis_delete_mock = mocker.patch.object(redis_client, 'delete', return_value=None) rendered_template: str | None = None with app.app_context(): rendered_template = flask.render_template( 'slack/bulk_ingestion/ingestion_failure.jinja', **payload, env=ENVIRONMENT ) bulk_ingestion_slack.bulk_ingest_failed(payload=payload) send_message_mock.assert_called_once_with(body=rendered_template, color='#900003') redis_delete_mock.assert_called_once_with(bulk_ingestion_slack.ts_redis_key(execution_arn)) def test_bulk_ingest_product_failed(mocker: MockerFixture) -> None: """Test bulk ingest product failed Slack notification logic.""" ts = '1700420000.000400' map_run_id = 'abc123' product_payload = {**payload, 'map_run_id': map_run_id} send_message_mock = mocker.patch.object(slack, 'send_bulk_message', return_value=None) redis_get_mock = mocker.patch.object(redis_client, 'get', return_value=ts) rendered_template: str | None = None with app.app_context(): rendered_template = flask.render_template( 'slack/bulk_ingestion/ingestion_product_failure.jinja', **product_payload, product_map_url=( 'https://us-east-1.console.aws.amazon.com/states/home' '?region=us-east-1' '#/map-runs/executions/' + quote( f'arn:aws:states:us-east-1:437795906767:execution:prod-sfn-bulk-session-ingest/Map:{map_run_id}', safe='', ) ), env=ENVIRONMENT, ) bulk_ingestion_slack.bulk_ingest_product_failed(payload=product_payload) redis_get_mock.assert_called_once_with(bulk_ingestion_slack.ts_redis_key(execution_arn)) send_message_mock.assert_called_once_with( body=rendered_template, color='#900003', thread_ts=str(ts) )