From b5fa485a9f2588aa53e98c27691ae80540000be2 Mon Sep 17 00:00:00 2001 From: Simon Willison Date: Sun, 14 Jun 2026 16:45:48 -0700 Subject: [PATCH] Port datasette manager plugin test to Playwright Refs #2779 --- tests/test_datasette_manager_js.py | 70 ------------------------------ tests/test_playwright.py | 30 +++++++++++++ 2 files changed, 30 insertions(+), 70 deletions(-) diff --git a/tests/test_datasette_manager_js.py b/tests/test_datasette_manager_js.py index 01b6bbac..1a46bb42 100644 --- a/tests/test_datasette_manager_js.py +++ b/tests/test_datasette_manager_js.py @@ -6,76 +6,6 @@ import textwrap STATIC_DIR = Path(__file__).resolve().parents[1] / "datasette" / "static" -def test_datasette_manager_make_column_field(): - script = textwrap.dedent(""" - const fs = require("fs"); - const vm = require("vm"); - const datasetteManagerJs = __DATASETTE_MANAGER_JS__; - - const documentListeners = {}; - global.CustomEvent = class { - constructor(name, options) { - this.type = name; - this.detail = options ? options.detail : undefined; - } - }; - global.document = { - addEventListener(name, callback) { - documentListeners[name] = documentListeners[name] || []; - documentListeners[name].push(callback); - }, - dispatchEvent(event) { - for (const callback of documentListeners[event.type] || []) { - callback(event); - } - }, - }; - global.window = { datasetteVersion: "test" }; - - vm.runInThisContext( - fs.readFileSync(datasetteManagerJs, "utf8"), - { filename: "datasette-manager.js" } - ); - for (const callback of documentListeners.DOMContentLoaded || []) { - callback(); - } - - window.__DATASETTE__.registerPlugin("declines", { - makeColumnField() { - return; - }, - }); - window.__DATASETTE__.registerPlugin("handles", { - makeColumnField(context) { - if (context.columnType.type !== "demo") { - return; - } - return { useTextarea: true }; - }, - }); - - const control = window.__DATASETTE__.makeColumnField({ - column: "body", - columnType: { type: "demo", config: null }, - }); - console.log(JSON.stringify(control)); - """).replace( - "__DATASETTE_MANAGER_JS__", - json.dumps(str(STATIC_DIR / "datasette-manager.js")), - ) - result = subprocess.run( - ["node", "-e", script], - text=True, - capture_output=True, - check=False, - ) - assert result.returncode == 0, result.stderr - assert json.loads(result.stdout) == { - "pluginName": "handles", - "useTextarea": True, - } - - def test_table_plugin_column_field_api(): script = textwrap.dedent(""" const fs = require("fs"); diff --git a/tests/test_playwright.py b/tests/test_playwright.py index caea8b16..353f1d94 100644 --- a/tests/test_playwright.py +++ b/tests/test_playwright.py @@ -183,3 +183,33 @@ def test_navigation_search_renders_jump_sections_from_javascript_plugins( } """) assert "Start a new agent chat" in html + + +@pytest.mark.playwright +def test_datasette_manager_make_column_field(page, datasette_server): + page.goto(datasette_server) + control = page.evaluate(""" + () => { + window.__DATASETTE__.registerPlugin("declines", { + makeColumnField() { + return; + }, + }); + window.__DATASETTE__.registerPlugin("handles", { + makeColumnField(context) { + if (context.columnType.type !== "demo") { + return; + } + return { useTextarea: true }; + }, + }); + return window.__DATASETTE__.makeColumnField({ + column: "body", + columnType: { type: "demo", config: null }, + }); + } + """) + assert control == { + "pluginName": "handles", + "useTextarea": True, + }