test(topology): verify database-driven presentation rendering
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
@@ -81,11 +81,11 @@ class GuanghanTopologyE2ETests(unittest.TestCase):
|
||||
await page.locator(".topology-node").count(), 14
|
||||
)
|
||||
self.assertEqual(
|
||||
await page.locator(".connection.pressurized").count(), 2
|
||||
await page.locator('.connection[data-type="pressurized_passage"]').count(), 2
|
||||
)
|
||||
self.assertEqual(await page.locator(".radiator").count(), 4)
|
||||
strokes = await page.locator(
|
||||
".connection.pressurized"
|
||||
'.connection[data-type="pressurized_passage"]'
|
||||
).evaluate_all(
|
||||
"(els) => els.map((el) => getComputedStyle(el).stroke)"
|
||||
)
|
||||
@@ -220,5 +220,135 @@ class GuanghanTopologyE2ETests(unittest.TestCase):
|
||||
asyncio.run(scenario(base_url))
|
||||
|
||||
|
||||
def test_database_edge_style_changes_browser_rendering(self) -> None:
|
||||
async def scenario(base_url: str) -> None:
|
||||
from topology_api.db import get_writer_connection
|
||||
|
||||
with get_writer_connection() as conn:
|
||||
conn.execute("SET search_path TO topology, public")
|
||||
with conn.cursor() as cur:
|
||||
cur.execute("""
|
||||
SELECT stroke_color
|
||||
FROM diagram_edge_styles
|
||||
WHERE connection_type = 'pressurized_passage'
|
||||
""")
|
||||
original_color = cur.fetchone()["stroke_color"]
|
||||
cur.execute("""
|
||||
UPDATE diagram_edge_styles
|
||||
SET stroke_color = '#00ffaa'
|
||||
WHERE connection_type = 'pressurized_passage'
|
||||
""")
|
||||
conn.commit()
|
||||
try:
|
||||
async with async_playwright() as pw:
|
||||
browser = await pw.chromium.launch(headless=True)
|
||||
page = await browser.new_page(
|
||||
viewport={"width": 1440, "height": 1000}
|
||||
)
|
||||
await page.goto(
|
||||
f"{base_url}/guanghan_topology_demo.html"
|
||||
"?mission=GHC-05",
|
||||
wait_until="networkidle",
|
||||
)
|
||||
await page.wait_for_function(
|
||||
"""() => document.querySelectorAll(
|
||||
'.connection[data-type="pressurized_passage"]'
|
||||
).length === 2"""
|
||||
)
|
||||
strokes = await page.locator(
|
||||
'.connection[data-type="pressurized_passage"]'
|
||||
).evaluate_all(
|
||||
"(els) => els.map((el) => getComputedStyle(el).stroke)"
|
||||
)
|
||||
self.assertEqual(
|
||||
strokes,
|
||||
["rgb(0, 255, 170)", "rgb(0, 255, 170)"],
|
||||
)
|
||||
await browser.close()
|
||||
finally:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute("""
|
||||
UPDATE diagram_edge_styles
|
||||
SET stroke_color = %(original)s
|
||||
WHERE connection_type = 'pressurized_passage'
|
||||
""", {"original": original_color})
|
||||
conn.commit()
|
||||
|
||||
with topology_server() as base_url:
|
||||
asyncio.run(scenario(base_url))
|
||||
|
||||
def test_database_node_style_changes_browser_rendering(self) -> None:
|
||||
async def scenario(base_url: str) -> None:
|
||||
from topology_api.db import get_writer_connection
|
||||
|
||||
with get_writer_connection() as conn:
|
||||
conn.execute("SET search_path TO topology, public")
|
||||
with conn.cursor() as cur:
|
||||
cur.execute("""
|
||||
SELECT fill_color
|
||||
FROM diagram_node_styles
|
||||
WHERE style_key = 'core-card'
|
||||
""")
|
||||
original_fill = cur.fetchone()["fill_color"]
|
||||
cur.execute("""
|
||||
UPDATE diagram_node_styles
|
||||
SET fill_color = '#123456'
|
||||
WHERE style_key = 'core-card'
|
||||
""")
|
||||
conn.commit()
|
||||
try:
|
||||
async with async_playwright() as pw:
|
||||
browser = await pw.chromium.launch(headless=True)
|
||||
page = await browser.new_page(
|
||||
viewport={"width": 1440, "height": 1000}
|
||||
)
|
||||
await page.goto(
|
||||
f"{base_url}/guanghan_topology_demo.html"
|
||||
"?mission=GHC-05",
|
||||
wait_until="networkidle",
|
||||
)
|
||||
core_fill = await page.locator(
|
||||
'.topology-node[data-node-key="core_cabin"] rect'
|
||||
).evaluate(
|
||||
"(el) => getComputedStyle(el).fill"
|
||||
)
|
||||
self.assertEqual(core_fill, "rgb(18, 52, 86)")
|
||||
await browser.close()
|
||||
finally:
|
||||
with conn.cursor() as cur:
|
||||
cur.execute("""
|
||||
UPDATE diagram_node_styles
|
||||
SET fill_color = %(original)s
|
||||
WHERE style_key = 'core-card'
|
||||
""", {"original": original_fill})
|
||||
conn.commit()
|
||||
|
||||
with topology_server() as base_url:
|
||||
asyncio.run(scenario(base_url))
|
||||
|
||||
def test_legend_renders_from_database_presentation(self) -> None:
|
||||
async def scenario(base_url: str) -> None:
|
||||
async with async_playwright() as pw:
|
||||
browser = await pw.chromium.launch(headless=True)
|
||||
page = await browser.new_page(
|
||||
viewport={"width": 1440, "height": 1000}
|
||||
)
|
||||
await page.goto(
|
||||
f"{base_url}/guanghan_topology_demo.html?mission=GHC-05",
|
||||
wait_until="networkidle",
|
||||
)
|
||||
labels = await page.locator("#legend .legend-item").evaluate_all(
|
||||
"(items) => items.map(item => item.textContent.trim())"
|
||||
)
|
||||
self.assertEqual(
|
||||
labels,
|
||||
["结构直连", "加压走道", "燃料 / 供电", "大型折叠散热面板"],
|
||||
)
|
||||
await browser.close()
|
||||
|
||||
with topology_server() as base_url:
|
||||
asyncio.run(scenario(base_url))
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
unittest.main()
|
||||
|
||||
Reference in New Issue
Block a user