import importlib.util import json import sys import unittest from pathlib import Path from unittest import mock ROOT = Path(__file__).resolve().parents[2] VENDORED_PYMYSQL = ( ROOT / "aws-lambda-apac-copy" / "emea-source" / "unpacked" / "EMEA-Tenants-Scoring-Task" ) sys.path.insert(0, str(VENDORED_PYMYSQL)) SUMMARY_PATH = ( ROOT / "apac_lambda_tasks" / "APAC-Tenants-Summary-Task" / "summary_function.py" ) spec = importlib.util.spec_from_file_location("apac_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_apac_and_signup_does_not_require_source_type(self): self.assertIn("sales_force_region = 'APAC'", summary_function.APAC_STOCK_SCOPE_SQL) self.assertIn("country_region = 'APAC'", summary_function.PREVIOUS_CST_DAY_SIGNUP_SCOPE_SQL) self.assertIn( "DATE_ADD(UTC_TIMESTAMP(), INTERVAL 8 HOUR)", summary_function.PREVIOUS_CST_DAY_SIGNUP_SCOPE_SQL, ) self.assertIn("country NOT IN ('JP')", summary_function.SUMMARY_TENANT_SCOPE_SQL) self.assertNotIn("EMEA", summary_function.SUMMARY_TENANT_SCOPE_SQL) self.assertNotIn( "source_type = 'new_signup'", summary_function.PREVIOUS_CST_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_priority_lines_include_effective_owner_and_source(self): lines = summary_function.priority_lines( [ { "tenant_id": "42", "name": "P0 Org", "priority": "P0", "effective_sales_owner_email": "owner@pingcap.com", "effective_sales_owner_source": "account", } ], "P0", ) self.assertIn("effective_sales_owner=owner@pingcap.com", lines[0]) self.assertIn("owner_source=account", lines[0]) 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]) with mock.patch.object(summary_function, "fetch_rows", return_value=[]) as fetch: summary_function.fetch_target_tenants(object()) self.assertEqual((10,), fetch.call_args.args[2]) self.assertIn("hubspot_target = 1", fetch.call_args.args[1]) def test_card_is_apac_and_contains_target_detail_section(self): metrics = { "signup_total": 12, "signup_non_individual": 8, "signup_ai_related": 3, "priority_p0_total": 2, "priority_p1_total": 4, "target_total": 1, "recent_import_total": 5, "recent_import_event_total": 9, } card = summary_function.build_card( metrics, { "p0_tenants": [], "p1_tenants": [], "target_tenants": [ { "tenant_id": "42", "name": "Target Org", "priority": "P0", "hubspot_match_method": "portal_id", "effective_sales_owner_email": "owner@pingcap.com", "effective_sales_owner_source": "account", } ], "recent_imports": [], }, ) rendered = json.dumps(card) self.assertIn("APAC Tenants Monitor Daily Summary", rendered) self.assertIn("P0 Tenants", rendered) self.assertIn("P1 Tenants", rendered) self.assertIn("HubSpot Target Accounts", rendered) self.assertIn("Target Org", rendered) self.assertIn("match=portal_id", rendered) self.assertIn("effective_sales_owner=owner@pingcap.com", rendered) self.assertIn("owner_source=account", rendered) self.assertNotIn(", sales_owner=owner@pingcap.com", rendered) self.assertNotIn("key_lead", rendered) self.assertIn("Imports in Last 7 Days", rendered) self.assertIn("New signups in previous CST 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 CST Day Organization Signups", rendered) self.assertNotIn("EMEA", rendered) def test_target_metric_uses_summary_scope(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("is_summary_tenant = 1 AND hubspot_target = 1", 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()