From d9b441962ff7717f22dd9d18e0eb0693e94ba9b1 Mon Sep 17 00:00:00 2001 From: Daniel Roth Date: Tue, 7 Jul 2026 13:02:25 +0000 Subject: [PATCH] =?UTF-8?q?Name=20the=20Abri=20trigger=20builder=20for=20i?= =?UTF-8?q?ts=20None-or-message=20contract=20=F0=9F=9F=AA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5 --- etl/hubspot/abri_flow_triggers.py | 2 +- etl/hubspot/scripts/scraper/main.py | 8 +++++--- etl/hubspot/tests/test_abri_flow_triggers.py | 18 +++++++++--------- scripts/smoke_test_abri_logjob_flow.py | 6 +++--- 4 files changed, 18 insertions(+), 16 deletions(-) diff --git a/etl/hubspot/abri_flow_triggers.py b/etl/hubspot/abri_flow_triggers.py index 6d72bbfcc..ccc1358b7 100644 --- a/etl/hubspot/abri_flow_triggers.py +++ b/etl/hubspot/abri_flow_triggers.py @@ -18,7 +18,7 @@ from etl.hubspot.project_data import ProjectData from etl.hubspot.utils import parse_hs_date -def build_abri_trigger_message( +def abri_trigger_message_for_scrape( hubspot_deal_id: str, new_deal: Dict[str, str], new_project: Optional[ProjectData], diff --git a/etl/hubspot/scripts/scraper/main.py b/etl/hubspot/scripts/scraper/main.py index 89c49b867..78ce9cf65 100644 --- a/etl/hubspot/scripts/scraper/main.py +++ b/etl/hubspot/scripts/scraper/main.py @@ -6,7 +6,7 @@ from backend.app.config import get_settings from etl.hubspot.hubspotClient import HubspotClient from etl.hubspot.hubspotDataTodB import CompanyData, HubspotDataToDb from etl.hubspot.project_data import ProjectData -from etl.hubspot.abri_flow_triggers import build_abri_trigger_message +from etl.hubspot.abri_flow_triggers import abri_trigger_message_for_scrape from etl.hubspot.hubspot_deal_differ import HubspotDealDiffer from etl.hubspot.hubspot_trigger_orchestrator_trigger_request import ( HubspotTriggerOrchestratorTriggerRequest, @@ -128,14 +128,16 @@ def handler(body: dict[str, Any], context: Any) -> None: sqs_client, hubspot_deal, listing, hubspot_deal_id ) - abri_message = build_abri_trigger_message( + # None means no Abri flow fired this scrape; a dict is the message + # naming the flows that did. + abri_message = abri_trigger_message_for_scrape( hubspot_deal_id=hubspot_deal_id, new_deal=hubspot_deal, new_project=project, new_listing=listing, old_deal=db_deal, ) - if abri_message: + if abri_message is not None: logger.info( f"Triggering Abri flows {abri_message['flows']} for HubSpot " f"deal ID {hubspot_deal_id}" diff --git a/etl/hubspot/tests/test_abri_flow_triggers.py b/etl/hubspot/tests/test_abri_flow_triggers.py index 9c7291562..a586ab05c 100644 --- a/etl/hubspot/tests/test_abri_flow_triggers.py +++ b/etl/hubspot/tests/test_abri_flow_triggers.py @@ -3,7 +3,7 @@ from typing import Any, Dict import uuid from backend.app.db.models.hubspot_deal_data import HubspotDealData -from etl.hubspot.abri_flow_triggers import build_abri_trigger_message +from etl.hubspot.abri_flow_triggers import abri_trigger_message_for_scrape BASE_TIME = datetime(2025, 12, 1, 12, 0, 0) @@ -50,7 +50,7 @@ def test_a_first_confirmed_survey_date_builds_a_log_job_message() -> None: ) # Act - message = build_abri_trigger_message( + message = abri_trigger_message_for_scrape( hubspot_deal_id=DEAL_ID, new_deal=new_deal, new_project=None, @@ -80,7 +80,7 @@ def test_a_changed_confirmed_survey_date_builds_an_amend_job_message() -> None: ) # Act - message = build_abri_trigger_message( + message = abri_trigger_message_for_scrape( hubspot_deal_id=DEAL_ID, new_deal=new_deal, new_project=None, @@ -102,7 +102,7 @@ def test_a_first_expected_commencement_date_builds_a_tenant_sync_message() -> No new_deal = make_new_deal(expected_commencement_date="2026-07-01") # Act - message = build_abri_trigger_message( + message = abri_trigger_message_for_scrape( hubspot_deal_id=DEAL_ID, new_deal=new_deal, new_project=None, @@ -135,7 +135,7 @@ def test_several_flows_firing_in_one_scrape_share_one_message() -> None: ) # Act - message = build_abri_trigger_message( + message = abri_trigger_message_for_scrape( hubspot_deal_id=DEAL_ID, new_deal=new_deal, new_project=None, @@ -159,7 +159,7 @@ def test_no_message_when_no_abri_trigger_fires() -> None: new_deal = make_new_deal(outcome="left voicemail") # Act - message = build_abri_trigger_message( + message = abri_trigger_message_for_scrape( hubspot_deal_id=DEAL_ID, new_deal=new_deal, new_project=None, @@ -179,7 +179,7 @@ def test_no_message_for_a_non_abri_deal() -> None: ) # Act - message = build_abri_trigger_message( + message = abri_trigger_message_for_scrape( hubspot_deal_id=DEAL_ID, new_deal=new_deal, new_project=None, @@ -200,7 +200,7 @@ def test_abandonment_alone_stays_unwired_and_builds_no_message() -> None: new_deal = make_new_deal(number_of_attempts="3", outcome="no answer") # Act - message = build_abri_trigger_message( + message = abri_trigger_message_for_scrape( hubspot_deal_id=DEAL_ID, new_deal=new_deal, new_project=None, @@ -226,7 +226,7 @@ def test_a_missing_listing_still_builds_the_message_without_a_place_ref() -> Non new_deal = make_new_deal(confirmed_survey_date="2026-06-24") # Act - message = build_abri_trigger_message( + message = abri_trigger_message_for_scrape( hubspot_deal_id=DEAL_ID, new_deal=new_deal, new_project=None, diff --git a/scripts/smoke_test_abri_logjob_flow.py b/scripts/smoke_test_abri_logjob_flow.py index f03f4004a..8f0de3246 100644 --- a/scripts/smoke_test_abri_logjob_flow.py +++ b/scripts/smoke_test_abri_logjob_flow.py @@ -7,7 +7,7 @@ canned LogJob success carrying a fake job_no. Concretely, the script 1. fetches the deal, listing and project from the real HubSpot portal (exactly what the scraper lambda sees), 2. reads the deal's row from the real (dev) deal database, - 3. runs the real differ predicates via build_abri_trigger_message, + 3. runs the real differ predicates via abri_trigger_message_for_scrape, 4. validates the real message contract (AbriTriggerRequest), 5. runs the real dispatch through the real AbriOrchestrator, so the fake job_no is written to the deal's client_booking_reference property in @@ -129,7 +129,7 @@ def main() -> None: from applications.abri.abri_trigger_request import AbriTriggerRequest from applications.abri.dispatch import dispatch_abri_flows from backend.app.db.models.hubspot_deal_data import HubspotDealData - from etl.hubspot.abri_flow_triggers import build_abri_trigger_message + from etl.hubspot.abri_flow_triggers import abri_trigger_message_for_scrape from etl.hubspot.hubspotClient import HubspotClient from infrastructure.abri.abri_client import AbriClient from infrastructure.abri.config import AbriConfig @@ -196,7 +196,7 @@ def main() -> None: f"job_no={deal_row.client_booking_reference}" ) - message = build_abri_trigger_message( + message = abri_trigger_message_for_scrape( hubspot_deal_id=DEAL_ID, new_deal=hubspot_deal, new_project=project,