mirror of
https://github.com/simonw/datasette.git
synced 2026-05-30 21:57:00 +02:00
Refactored write decision tests
This commit is contained in:
parent
17f45b884b
commit
0b7c26c6c8
2 changed files with 94 additions and 71 deletions
|
|
@ -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"
|
||||
94
tests/test_write_sql_operation_decisions.py
Normal file
94
tests/test_write_sql_operation_decisions.py
Normal 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"
|
||||
Loading…
Add table
Add a link
Reference in a new issue