from fansifter_common.adapters.sendgrid.models import ( MergeTags, apply_fallback_merge_tags, ) class TestMergeTags: def test_default_substitutes_to_fan(self) -> None: assert MergeTags().to_substitutions() == {"-firstName-": "Fan"} def test_none_substitutes_to_fan(self) -> None: assert MergeTags(first_name=None).to_substitutions() == {"-firstName-": "Fan"} def test_empty_string_substitutes_to_fan(self) -> None: assert MergeTags(first_name="").to_substitutions() == {"-firstName-": "Fan"} def test_whitespace_passes_through(self) -> None: assert MergeTags(first_name=" ").to_substitutions() == {"-firstName-": " "} def test_value_passes_through(self) -> None: assert MergeTags(first_name="John").to_substitutions() == { "-firstName-": "John" } class TestApplyFallbackMergeTags: def test_replaces_first_name(self) -> None: assert apply_fallback_merge_tags("Hi -firstName-!") == "Hi Fan!" def test_idempotent_on_html_without_tokens(self) -> None: assert apply_fallback_merge_tags("

nothing here

") == "

nothing here

" def test_replaces_multiple_occurrences(self) -> None: assert apply_fallback_merge_tags("-firstName- and -firstName-") == "Fan and Fan"