Refactored write decision tests

This commit is contained in:
Simon Willison 2026-05-28 12:09:02 -07:00
commit 0b7c26c6c8
2 changed files with 94 additions and 71 deletions

View file

@ -1,71 +0,0 @@
from datasette.utils.sql_analysis import Operation
from datasette.write_sql import (
IgnoreWriteSqlOperation,
RejectWriteSqlOperation,
RequireWriteSqlPermissions,
UnsupportedWriteSqlOperation,
decision_for_write_sql_operation,
)
def test_decision_for_write_sql_operation_ignores_internal_operations():
decision = decision_for_write_sql_operation(
Operation("read", "schema", None, None, "main", internal=True)
)
assert isinstance(decision, IgnoreWriteSqlOperation)
assert decision.reason == "internal SQLite operation"
def test_decision_for_write_sql_operation_ignores_select_statement_operations():
decision = decision_for_write_sql_operation(
Operation("select", "statement", None, None, None)
)
assert isinstance(decision, IgnoreWriteSqlOperation)
assert decision.reason == "select statement"
def test_decision_for_write_sql_operation_requires_table_write_permissions():
decision = decision_for_write_sql_operation(
Operation("insert", "table", "data", "dogs", None)
)
assert isinstance(decision, RequireWriteSqlPermissions)
assert [permission.action for permission in decision.permissions] == [
"insert-row",
"update-row",
"delete-row",
]
assert [str(permission.resource) for permission in decision.permissions] == [
"data/dogs",
"data/dogs",
"data/dogs",
]
def test_decision_for_write_sql_operation_rejects_vacuum():
decision = decision_for_write_sql_operation(
Operation("vacuum", "statement", None, None, None)
)
assert isinstance(decision, RejectWriteSqlOperation)
assert decision.message == "VACUUM is not allowed in user-supplied SQL"
def test_decision_for_write_sql_operation_ignores_functions():
decision = decision_for_write_sql_operation(
Operation("function", "function", None, None, None, target="upper")
)
assert isinstance(decision, IgnoreWriteSqlOperation)
assert decision.reason == "SQL function"
def test_decision_for_write_sql_operation_reports_unsupported_operations():
decision = decision_for_write_sql_operation(
Operation("unknown", "unknown", None, None, None)
)
assert isinstance(decision, UnsupportedWriteSqlOperation)
assert decision.message == "Unsupported SQL operation: unknown unknown"

View file

@ -0,0 +1,94 @@
import pytest
from datasette.utils.sql_analysis import Operation
from datasette.write_sql import (
IgnoreWriteSqlOperation,
RejectWriteSqlOperation,
RequireWriteSqlPermissions,
UnsupportedWriteSqlOperation,
decision_for_write_sql_operation,
)
@pytest.mark.parametrize(
("operation", "reason"),
(
pytest.param(
Operation("read", "schema", None, None, "main", internal=True),
"internal SQLite operation",
id="internal",
),
pytest.param(
Operation("select", "statement", None, None, None),
"select statement",
id="select-statement",
),
pytest.param(
Operation("function", "function", None, None, None, target="upper"),
"SQL function",
id="function",
),
),
)
def test_decision_for_write_sql_operation_ignores_operations(operation, reason):
decision = decision_for_write_sql_operation(operation)
assert isinstance(decision, IgnoreWriteSqlOperation)
assert decision.reason == reason
@pytest.mark.parametrize("operation", ("insert", "update"))
def test_decision_for_write_sql_operation_requires_table_write_permissions(operation):
decision = decision_for_write_sql_operation(
Operation(operation, "table", "data", "dogs", None)
)
assert isinstance(decision, RequireWriteSqlPermissions)
assert [permission.action for permission in decision.permissions] == [
"insert-row",
"update-row",
"delete-row",
]
assert [str(permission.resource) for permission in decision.permissions] == [
"data/dogs",
"data/dogs",
"data/dogs",
]
@pytest.mark.parametrize(
("operation", "message"),
(
pytest.param(
Operation("vacuum", "statement", None, None, None),
"VACUUM is not allowed in user-supplied SQL",
id="vacuum",
),
pytest.param(
Operation("insert", "table", "data", "docs", None, table_kind="virtual"),
"Writes to virtual tables are not allowed in user-supplied SQL",
id="virtual-table",
),
pytest.param(
Operation(
"insert", "table", "data", "docs_data", None, table_kind="shadow"
),
"Writes to shadow tables are not allowed in user-supplied SQL",
id="shadow-table",
),
),
)
def test_decision_for_write_sql_operation_rejects_operations(operation, message):
decision = decision_for_write_sql_operation(operation)
assert isinstance(decision, RejectWriteSqlOperation)
assert decision.message == message
def test_decision_for_write_sql_operation_reports_unsupported_operations():
decision = decision_for_write_sql_operation(
Operation("unknown", "unknown", None, None, None)
)
assert isinstance(decision, UnsupportedWriteSqlOperation)
assert decision.message == "Unsupported SQL operation: unknown unknown"