import importlib.util import json import sys import types import unittest from datetime import datetime from decimal import Decimal from pathlib import Path from unittest import mock ROOT = Path(__file__).resolve().parents[2] fake_boto3 = types.ModuleType("boto3") fake_boto3.client = lambda service_name: None sys.modules.setdefault("boto3", fake_boto3) fake_pymysql = types.ModuleType("pymysql") fake_pymysql.cursors = types.SimpleNamespace(DictCursor=object) fake_pymysql.connect = lambda **kwargs: None sys.modules.setdefault("pymysql", fake_pymysql) DISPATCHER_PATH = ( ROOT / "latam_lambda_tasks" / "LATAM-Tenants-Monitor-Fanout-Dispatcher-Task" / "dispatcher_function.py" ) spec = importlib.util.spec_from_file_location( "latam_dispatcher_function", DISPATCHER_PATH ) dispatcher_function = importlib.util.module_from_spec(spec) spec.loader.exec_module(dispatcher_function) class DispatcherFunctionTest(unittest.TestCase): def test_default_queries_select_only_latam_scope(self): active_sql = dispatcher_function.DEFAULT_TENANT_SELECT_SQL signup_sql = dispatcher_function.DEFAULT_NEW_SIGNUP_SELECT_SQL self.assertIn("sales_force_region = 'LATAM'", active_sql) self.assertIn("country_region = 'LATAM'", signup_sql) self.assertIn("plan NOT IN ('free_trial', 'new_user', 'closing')", active_sql) self.assertNotIn("plan NOT IN", signup_sql) self.assertNotIn("country NOT IN", active_sql + signup_sql) def test_message_body_serializes_database_values(self): body = dispatcher_function.message_body( { "id": 42, "created_at": datetime(2026, 8, 24, 7, 30), "credit": Decimal("1.25"), }, "active_candidate", "run-1", ) payload = json.loads(body) self.assertEqual("42", payload["tenant_id"]) self.assertEqual("2026-08-24 07:30:00", payload["tenant"]["created_at"]) self.assertEqual("1.25", payload["tenant"]["credit"]) def test_enqueue_uses_sqs_batches_of_ten(self): client = mock.Mock() client.send_message_batch.side_effect = [ {"Successful": [{} for _ in range(10)]}, {"Successful": [{} for _ in range(2)]}, ] tenants = [{"id": index} for index in range(12)] with mock.patch.object(dispatcher_function, "sqs_client", return_value=client): sent = dispatcher_function.enqueue_tenants( "queue-url", tenants, "active_candidate", "run-1" ) self.assertEqual(12, sent) self.assertEqual(2, client.send_message_batch.call_count) self.assertEqual( [10, 2], [ len(call.kwargs["Entries"]) for call in client.send_message_batch.call_args_list ], ) if __name__ == "__main__": unittest.main()