', 'Operational', 'id="fleetPrevious"', 'id="fleetNext"', '/assets/minerops-fleet.js', 'data-can-view-locations="true"', 'id="fleetSite"', 'id="fleetRoom"', ): self.assertIn(value, response.text) self.authenticate(permissions=("miners.view",)) restricted = self.client.get("/assets/miners").text self.assertIn('data-can-view-locations="false"', restricted) self.assertNotIn('id="fleetSite"', restricted) self.assertNotIn('id="fleetRoom"', restricted) def test_fleet_reset_action_has_a_visible_label(self): self.authenticate() response = self.client.get("/assets/miners") self.assertIn( '', response.text, ) css = (STATIC_ROOT / "app.css").read_text(encoding="utf-8") self.assertIn( ".fleet-filter-actions .quiet-button { color: var(--ink); }", css, ) def test_fleet_script_dom_contract_matches_authorized_page(self): self.authenticate() response = self.client.get("/assets/miners") source = (STATIC_ROOT / "fleet.js").read_text(encoding="utf-8") declared = re.search(r"const ids = \[(.*?)\];", source, re.DOTALL) self.assertIsNotNone(declared) required = set(re.findall(r'"([A-Za-z][A-Za-z0-9]+)"', declared.group(1))) required.update(("fleetSite", "fleetRoom")) rendered = set(re.findall(r'\bid="([^"]+)"', response.text)) self.assertEqual(required - rendered, set()) def test_fleet_script_is_bounded_read_only_and_xss_safe(self): source = (STATIC_ROOT / "fleet.js").read_text(encoding="utf-8") self.assertEqual(source.count('fetch("/api/inventory/miners?"'), 1) self.assertNotIn("/api/location/map", source) self.assertNotIn("setInterval", source) for method in ('method: "POST"', 'method: "PATCH"', 'method: "PUT"', 'method: "DELETE"'): self.assertNotIn(method, source) for unsafe in ("innerHTML", "insertAdjacentHTML", "document.write"): self.assertNotIn(unsafe, source) self.assertIn("textContent", source) self.assertIn('"/miners/" + encodeURIComponent(miner.id) + "/detail"', source) self.assertIn('"/monitoring/map?" + params.toString()', source) self.assertNotRegex(source.lower(), r"stale.{0,20}(threshold|minutes|hours)") self.assertNotIn("lowHashrate", source) def test_fleet_css_has_status_text_mobile_cards_and_visible_focus(self): css = (STATIC_ROOT / "app.css").read_text(encoding="utf-8") self.assertIn('.fleet-row[data-status="offline"]', css) self.assertIn("content: attr(data-label)", css) self.assertIn(".fleet-pagination", css) self.assertIn(":focus-visible", css) def test_styles_have_no_motion_to_reduce(self): css = (STATIC_ROOT / "app.css").read_text(encoding="utf-8") self.assertNotIn("animation:", css) self.assertNotIn("transition:", css) if __name__ == "__main__": unittest.main()