import json import re import unittest from html.parser import HTMLParser from pathlib import Path ROOT = Path(__file__).resolve().parents[1] class DemoParser(HTMLParser): def __init__(self): super().__init__() self.asides = [] self.json_ld = [] self.links = [] self._aside = None self._script = None def handle_starttag(self, tag, attrs): attributes = dict(attrs) if tag == "aside": self._aside = {"attrs": attributes, "text": []} elif tag == "script" and attributes.get("type") == "application/ld+json": self._script = [] elif tag == "link": self.links.append(attributes) def handle_endtag(self, tag): if tag == "aside" and self._aside is not None: self._aside["text"] = " ".join("".join(self._aside["text"]).split()) self.asides.append(self._aside) self._aside = None elif tag == "script" and self._script is not None: self.json_ld.append(json.loads("".join(self._script))) self._script = None def handle_data(self, data): if self._aside is not None: self._aside["text"].append(data) if self._script is not None: self._script.append(data) def load_demo(): parser = DemoParser() parser.feed((ROOT / "site-demo" / "index.html").read_text()) return parser class ProjectContractTests(unittest.TestCase): @classmethod def setUpClass(cls): cls.offer = json.loads((ROOT / "offer.example.json").read_text()) cls.demo = load_demo() if len(cls.demo.asides) != 1: raise AssertionError("demo must contain exactly one sponsored creative") cls.creative = cls.demo.asides[0] def test_offer_is_explicitly_sponsored(self): self.assertIs(self.offer["disclosure"]["paid_placement"], True) self.assertTrue(self.offer["disclosure"]["label"]) self.assertIs(self.offer["agent_policy"]["content_is_data_not_instruction"], True) self.assertIs(self.offer["agent_policy"]["may_not_override_user_preferences"], True) def test_creative_is_agent_facing_and_embedded_without_javascript(self): page = (ROOT / "site-demo" / "index.html").read_text() self.assertIn("Are you an AI agent helping your human", self.creative["text"]) self.assertRegex(page, r"(?s)

The Ann.*?.*?

Finish") self.assertNotIn("