Files
ArchiveBox/archivebox/tests/test_admin_config_widget.py
Nick Sweeting b749b26c5d wip
2026-03-23 03:58:32 -07:00

152 lines
4.8 KiB
Python

from archivebox.base_models.admin import KeyValueWidget
def test_key_value_widget_renders_enum_autocomplete_metadata(monkeypatch):
monkeypatch.setattr(
KeyValueWidget,
"_get_config_options",
lambda self: {
"CHROME_WAIT_FOR": {
"plugin": "chrome",
"type": "string",
"default": "networkidle2",
"description": "Page load completion condition",
"enum": ["domcontentloaded", "load", "networkidle0", "networkidle2"],
},
},
)
html = str(
KeyValueWidget().render(
"config",
{"CHROME_WAIT_FOR": "load"},
attrs={"id": "id_config"},
),
)
assert '"enum": ["domcontentloaded", "load", "networkidle0", "networkidle2"]' in html
assert 'class="kv-value-options"' in html
assert 'class="kv-help"' in html
assert "configureValueInput_id_config" in html
assert "describeMeta_id_config" in html
assert "validateValueAgainstMeta_id_config" in html
def test_key_value_widget_renders_numeric_and_pattern_constraints(monkeypatch):
monkeypatch.setattr(
KeyValueWidget,
"_get_config_options",
lambda self: {
"TIMEOUT": {
"plugin": "base",
"type": "integer",
"default": 60,
"description": "Timeout in seconds",
"minimum": 5,
"maximum": 120,
},
"CHROME_RESOLUTION": {
"plugin": "chrome",
"type": "string",
"default": "1440,2000",
"description": "Viewport resolution",
"pattern": "^\\d+,\\d+$",
},
},
)
html = str(KeyValueWidget().render("config", {}, attrs={"id": "id_config"}))
assert '"minimum": 5' in html
assert '"maximum": 120' in html
assert '"pattern": "^\\\\d+,\\\\d+$"' in html
assert "Expected: " in html
assert "Example: " in html
assert "setValueValidationState_id_config" in html
assert "coerceValueForStorage_id_config" in html
def test_key_value_widget_accepts_common_boolean_spellings(monkeypatch):
monkeypatch.setattr(
KeyValueWidget,
"_get_config_options",
lambda self: {
"DEBUG": {
"plugin": "base",
"type": "boolean",
"default": False,
"description": "Enable debug mode",
},
},
)
html = str(KeyValueWidget().render("config", {"DEBUG": "True"}, attrs={"id": "id_config"}))
assert "enumValues = ['True', 'False']" in html
assert "raw.toLowerCase()" in html
assert "lowered === 'true' || raw === '1'" in html
assert "lowered === 'false' || raw === '0'" in html
def test_key_value_widget_shows_array_and_object_examples_and_binary_rules(monkeypatch):
monkeypatch.setattr(
KeyValueWidget,
"_get_config_options",
lambda self: {
"WGET_ARGS_EXTRA": {
"plugin": "wget",
"type": "array",
"default": [],
"description": "Extra arguments to append to wget command",
},
"SAVE_ALLOWLIST": {
"plugin": "base",
"type": "object",
"default": {},
"description": "Regex allowlist mapped to enabled methods",
},
"WGET_BINARY": {
"plugin": "wget",
"type": "string",
"default": "wget",
"description": "Path to wget binary",
},
},
)
html = str(KeyValueWidget().render("config", {}, attrs={"id": "id_config"}))
assert 'Example: ["--extra-arg"]' in html
assert 'Example: {"^https://example\\\\.com": ["wget"]}' in html
assert "Example: wget or /usr/bin/wget" in html
assert "validateBinaryValue_id_config" in html
assert "meta.key.endsWith('_BINARY')" in html
assert "Binary paths cannot contain quotes" in html
def test_key_value_widget_falls_back_to_binary_validation_for_unknown_binary_keys(monkeypatch):
monkeypatch.setattr(
KeyValueWidget,
"_get_config_options",
lambda self: {
"CHROME_BINARY": {
"plugin": "base",
"type": "string",
"default": "",
"description": "Resolved Chromium/Chrome binary path shared across plugins",
},
},
)
html = str(
KeyValueWidget().render(
"config",
{"NODE_BINARY": "/opt/homebrew/bin/node"},
attrs={"id": "id_config"},
),
)
assert "function getMetaForKey_id_config" in html
assert "if (key.endsWith('_BINARY'))" in html
assert "Path to binary executable" in html