"""Tests for the subscription and vacation-hold parsers.
Written after a real bug: the first version matched `.account-item-multi-fields`,
which is the HEADING row, so an account with a live subscription reported zero.
A count of nothing looks exactly like an account with nothing.
"""
from __future__ import annotations
import importlib
import sys
import types
from pathlib import Path
COMPONENT = Path(__file__).parent.parent / "custom_components"
def _load():
if "aiohttp" not in sys.modules:
stub = types.ModuleType("aiohttp")
stub.ClientSession = object
stub.ClientError = Exception
stub.ClientTimeout = lambda *args, **kwargs: None
sys.modules["aiohttp"] = stub
sys.path.insert(0, str(COMPONENT))
pkg = types.ModuleType("fh_pkg")
pkg.__path__ = [str(COMPONENT / "freshharvest")]
sys.modules["fh_pkg"] = pkg
return importlib.import_module("fh_pkg.actions")
actions = _load()
SUBS_HTML = """
Qty
Item
Arriving
Partner
Frequency
Georgia Grown Small Box
tomorrow
Various Partners
Weekly
Change Basket
"""
def test_heading_row_is_not_a_subscription():
"""The regression: the header row must not be counted, and must not hide the real one."""
subs = actions.parse_subscriptions(SUBS_HTML)
assert len(subs) == 1
assert subs[0].name == "Georgia Grown Small Box"
def test_subscription_fields():
sub = actions.parse_subscriptions(SUBS_HTML)[0]
assert (sub.quantity, sub.frequency) == (2, "Weekly")
assert sub.partner == "Various Partners"
assert sub.arriving == "tomorrow"
def test_no_subscriptions_is_empty_not_an_error():
assert actions.parse_subscriptions("nothing") == []
def test_vacation_hold_uses_the_sites_own_date_format():
"""The page writes "Tuesday, Dec 1 - Monday, Dec 7", never ISO.
The first version of this test asserted ISO dates, so it passed against a
format the site does not produce while the parser reported zero holds on an
account that had one.
"""
html = (
"Upcoming Pauses"
"
Tuesday, Dec 1 - Monday, Dec 7"
"
Remove "
)
holds = actions.parse_vacation_holds(html)
assert len(holds) == 1
assert (holds[0].start, holds[0].end) == ("Dec 1", "Dec 7")
def test_no_holds_parses_empty():
assert actions.parse_vacation_holds("none
") == []
def test_frequency_names_map_to_site_values():
assert actions.FREQUENCIES["weekly"] == "1"
# id='FrequencyID' but the POST field is popup-toggle; posting the id does nothing.
assert actions.FREQUENCY_FIELD == "popup-toggle"