mirror of
https://github.com/Hestia-Homes/Model.git
synced 2026-06-08 11:17:27 +00:00
148 lines
5.2 KiB
Python
148 lines
5.2 KiB
Python
from typing import Dict
|
|
from unittest.mock import MagicMock, patch
|
|
|
|
from backend.ecmk_fetcher.address_list import PropertyRow
|
|
from backend.ecmk_fetcher.ecmk_service import EcmkService
|
|
from utils.sharepoint.domna_sharepoint_client import DomnaSharepointClient
|
|
|
|
|
|
FAKE_PROPERTY_MAP: Dict[str, PropertyRow] = {
|
|
"10 FAKE ST SW1A 1AA": PropertyRow(
|
|
row_index=2, address="10 Fake St SW1A 1AA", listing_id="hs-001"
|
|
)
|
|
}
|
|
|
|
|
|
def make_service(
|
|
sharepoint_client: DomnaSharepointClient | None = None,
|
|
s3_bucket: str = "test-bucket",
|
|
property_list_filepath: str = "/fake/properties.xlsx",
|
|
sharepoint_base_path: str = "/base",
|
|
sharepoint_excel_path: str = "/excel",
|
|
local_dimensions_path: str = "/fake/Dimensions.xlsx",
|
|
) -> EcmkService:
|
|
return EcmkService(
|
|
sharepoint_client=sharepoint_client or MagicMock(spec=DomnaSharepointClient),
|
|
s3_bucket=s3_bucket,
|
|
property_list_filepath=property_list_filepath,
|
|
sharepoint_base_path=sharepoint_base_path,
|
|
sharepoint_excel_path=sharepoint_excel_path,
|
|
local_dimensions_path=local_dimensions_path,
|
|
)
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# __init__: loads property map from spreadsheet filepath
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
def test_init_loads_property_map_from_filepath() -> None:
|
|
with patch(
|
|
"backend.ecmk_fetcher.ecmk_service.extract_addresses_from_spreadsheet",
|
|
return_value=FAKE_PROPERTY_MAP,
|
|
) as mock_extract:
|
|
_ = make_service(property_list_filepath="/some/props.xlsx")
|
|
|
|
mock_extract.assert_called_once_with("/some/props.xlsx")
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# run(): downloads Dimensions.xlsx before Playwright browser launches
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
def _make_playwright_mocks() -> tuple[MagicMock, MagicMock, MagicMock, MagicMock]:
|
|
mock_page = MagicMock()
|
|
mock_context = MagicMock()
|
|
mock_context.new_page.return_value = mock_page
|
|
mock_browser = MagicMock()
|
|
mock_browser.new_context.return_value = mock_context
|
|
mock_playwright = MagicMock()
|
|
mock_playwright.chromium.launch.return_value = mock_browser
|
|
return mock_page, mock_context, mock_browser, mock_playwright
|
|
|
|
|
|
def test_run_downloads_dimensions_before_browser_launch() -> None:
|
|
call_order: list[str] = []
|
|
|
|
mock_client = MagicMock(spec=DomnaSharepointClient)
|
|
|
|
def _on_download(**_: object) -> None:
|
|
call_order.append("download")
|
|
|
|
mock_client.download_file.side_effect = _on_download
|
|
|
|
_, _, mock_browser, mock_playwright = _make_playwright_mocks()
|
|
|
|
def _on_launch(**_: object) -> MagicMock:
|
|
call_order.append("browser")
|
|
return mock_browser
|
|
|
|
mock_playwright.chromium.launch.side_effect = _on_launch
|
|
|
|
with (
|
|
patch(
|
|
"backend.ecmk_fetcher.ecmk_service.extract_addresses_from_spreadsheet",
|
|
return_value=FAKE_PROPERTY_MAP,
|
|
),
|
|
patch("backend.ecmk_fetcher.ecmk_service.sync_playwright") as mock_sync_pw,
|
|
):
|
|
mock_sync_pw.return_value.__enter__.return_value = mock_playwright
|
|
service = make_service(
|
|
sharepoint_client=mock_client,
|
|
sharepoint_excel_path="/excel",
|
|
local_dimensions_path="/fake/Dimensions.xlsx",
|
|
)
|
|
with patch.object(service, "_run_browser_session"):
|
|
service.run()
|
|
|
|
assert call_order == ["download", "browser"]
|
|
|
|
|
|
def test_run_downloads_dimensions_with_correct_paths() -> None:
|
|
mock_client = MagicMock(spec=DomnaSharepointClient)
|
|
_, _, _, mock_playwright = _make_playwright_mocks()
|
|
|
|
with (
|
|
patch(
|
|
"backend.ecmk_fetcher.ecmk_service.extract_addresses_from_spreadsheet",
|
|
return_value=FAKE_PROPERTY_MAP,
|
|
),
|
|
patch("backend.ecmk_fetcher.ecmk_service.sync_playwright") as mock_sync_pw,
|
|
):
|
|
mock_sync_pw.return_value.__enter__.return_value = mock_playwright
|
|
service = make_service(
|
|
sharepoint_client=mock_client,
|
|
sharepoint_excel_path="/excel",
|
|
local_dimensions_path="/fake/Dimensions.xlsx",
|
|
)
|
|
with patch.object(service, "_run_browser_session"):
|
|
service.run()
|
|
|
|
mock_client.download_file.assert_called_once_with(
|
|
sharepoint_path="/excel/Dimensions.xlsx",
|
|
local_path="/fake/Dimensions.xlsx",
|
|
)
|
|
|
|
|
|
# ---------------------------------------------------------------------------
|
|
# run(): passes the Playwright Page into _run_browser_session
|
|
# ---------------------------------------------------------------------------
|
|
|
|
|
|
def test_run_passes_page_to_run_browser_session() -> None:
|
|
mock_page, _, _, mock_playwright = _make_playwright_mocks()
|
|
|
|
with (
|
|
patch(
|
|
"backend.ecmk_fetcher.ecmk_service.extract_addresses_from_spreadsheet",
|
|
return_value=FAKE_PROPERTY_MAP,
|
|
),
|
|
patch("backend.ecmk_fetcher.ecmk_service.sync_playwright") as mock_sync_pw,
|
|
):
|
|
mock_sync_pw.return_value.__enter__.return_value = mock_playwright
|
|
service = make_service()
|
|
with patch.object(service, "_run_browser_session") as mock_session:
|
|
service.run()
|
|
|
|
mock_session.assert_called_once_with(mock_page)
|