import importlib.util import json import sys import types import unittest from pathlib import Path from unittest import mock ROOT = Path(__file__).resolve().parents[2] fake_pymysql = types.ModuleType("pymysql") fake_pymysql.cursors = types.SimpleNamespace(DictCursor=object) fake_pymysql.connect = lambda **kwargs: None sys.modules.setdefault("pymysql", fake_pymysql) SUMMARY_PATH = ( ROOT / "latam_lambda_tasks" / "LATAM-Tenants-Summary-Task" / "summary_function.py" ) spec = importlib.util.spec_from_file_location("latam_summary_function", SUMMARY_PATH) summary_function = importlib.util.module_from_spec(spec) spec.loader.exec_module(summary_function) class SummaryFunctionTest(unittest.TestCase): def test_scope_is_latam_and_signup_does_not_require_source_type(self): self.assertIn("sales_force_region = 'LATAM'", summary_function.LATAM_STOCK_SCOPE_SQL) self.assertIn("country_region = 'LATAM'", summary_function.PREVIOUS_UTC_DAY_SIGNUP_SCOPE_SQL) self.assertNotIn("country NOT IN", summary_function.SUMMARY_TENANT_SCOPE_SQL) self.assertNotIn( "source_type = 'new_signup'", summary_function.PREVIOUS_UTC_DAY_SIGNUP_SCOPE_SQL, ) def test_ai_related_uses_exact_categories(self): self.assertTrue( summary_function.is_ai_related( {"entity_ai_category": "institution_ai_related"} ) ) self.assertFalse( summary_function.is_ai_related({"entity_ai_category": "company_non_ai"}) ) def test_unknown_qps_is_rendered_as_na(self): self.assertEqual("N/A", summary_function.qps_label({"tenant_avg_qps": None})) self.assertEqual("0", summary_function.qps_label({"tenant_avg_qps": 0})) def test_icp_categories_are_rendered_as_business_labels(self): self.assertEqual( "Fintech/E-Commerce/iGaming", summary_function.icp_categories_label( {"icp_categories": '["fintech", "e_commerce", "igaming"]'} ), ) def test_each_detail_query_defaults_to_ten_rows(self): with mock.patch.object(summary_function, "fetch_rows", return_value=[]) as fetch: summary_function.fetch_priority_tenants(object(), "P0") self.assertEqual(("P0", 10), fetch.call_args.args[2]) with mock.patch.object(summary_function, "fetch_rows", return_value=[]) as fetch: summary_function.fetch_recent_import_tenants(object()) self.assertEqual((10,), fetch.call_args.args[2]) def test_card_is_latam_and_contains_three_detail_sections(self): metrics = { "signup_total": 12, "signup_non_individual": 8, "signup_ai_related": 3, "priority_p0_total": 2, "priority_p1_total": 4, "icp_match_total": 6, "recent_import_total": 5, "recent_import_event_total": 9, } card = summary_function.build_card( metrics, { "p0_tenants": [], "p1_tenants": [], "recent_imports": [], }, ) rendered = json.dumps(card) self.assertIn("LATAM Tenants Monitor Daily Summary", rendered) self.assertIn("P0 Tenants", rendered) self.assertIn("P1 Tenants", rendered) self.assertIn("ICP-matched tenants", rendered) self.assertNotIn("key_lead", rendered) self.assertIn("Imports in Last 7 Days", rendered) self.assertIn("New signups in previous UTC day", rendered) self.assertIn("New signup non-individual", rendered) self.assertIn("New signup AI-related", rendered) self.assertNotIn("New signup known organizations", rendered) self.assertNotIn("Previous UTC Day Organization Signups", rendered) def test_summary_metrics_count_structured_icp_matches(self): source = summary_function.fetch_summary_metrics.__code__.co_consts sql_fragments = "\n".join(value for value in source if isinstance(value, str)) self.assertIn("JSON_LENGTH(icp_categories) > 0", sql_fragments) def test_non_individual_signup_metric_uses_known_organization_categories(self): source = summary_function.fetch_summary_metrics.__code__.co_consts sql_fragments = "\n".join(value for value in source if isinstance(value, str)) self.assertIn("LOWER(TRIM(COALESCE(entity_ai_category, ''))) IN (", sql_fragments) self.assertIn("'company_ai_core'", sql_fragments) self.assertIn("'company_ai_related'", sql_fragments) self.assertIn("'company_non_ai'", sql_fragments) self.assertIn("'institution_ai_related'", sql_fragments) self.assertIn("'institution_non_ai'", sql_fragments) self.assertNotIn("<> 'individual'", sql_fragments) if __name__ == "__main__": unittest.main()