Add support for query parameters, JOINs, SELECT * and three-part table names
This commit is contained in:
+49
-6
@@ -1,5 +1,4 @@
|
||||
import sqlite3
|
||||
from pathlib import Path
|
||||
|
||||
import pytest
|
||||
from sqlalchemy import create_engine
|
||||
@@ -215,16 +214,60 @@ def test_delete_raises_readonly(engine):
|
||||
engine.execute("DELETE FROM products WHERE id = '1'")
|
||||
|
||||
|
||||
def test_join_raises_unsupported(engine):
|
||||
def test_ambiguous_unqualified_join_column_raises(engine):
|
||||
with pytest.raises(UnsupportedQueryError):
|
||||
engine.execute(
|
||||
"SELECT p.name, o.qty FROM products p JOIN orders o ON p.id = o.product_id"
|
||||
"SELECT name FROM products p JOIN orders o ON p.id = o.product_id"
|
||||
)
|
||||
|
||||
|
||||
def test_select_star_raises_unsupported(engine):
|
||||
with pytest.raises(UnsupportedQueryError):
|
||||
engine.execute("SELECT * FROM products")
|
||||
# ---------------------------------------------------------------------------
|
||||
# R1 — parametrized queries
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def test_positional_param(engine):
|
||||
rows = engine.execute("SELECT id, name FROM products WHERE id = ?", ("1",))
|
||||
assert rows == [{"id": "1", "name": "Widget"}]
|
||||
|
||||
|
||||
def test_named_param(engine):
|
||||
rows = engine.execute("SELECT name FROM products WHERE id = :id", {"id": "2"})
|
||||
assert rows == [{"name": "Gadget"}]
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# R2 — JOIN support
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def test_join_two_tables(engine):
|
||||
rows = engine.execute(
|
||||
"SELECT p.name, o.qty FROM products p "
|
||||
"JOIN orders o ON p.id = o.product_id WHERE p.id = ?",
|
||||
("1",),
|
||||
)
|
||||
assert rows == [{"name": "Widget", "qty": "2"}]
|
||||
|
||||
|
||||
def test_join_caches_both_tables(engine):
|
||||
engine.execute(
|
||||
"SELECT p.name, o.qty FROM products p JOIN orders o ON p.id = o.product_id"
|
||||
)
|
||||
assert engine._cache.is_table_cached("products") is True
|
||||
assert engine._cache.is_table_cached("orders") is True
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
# R3 — SELECT *
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
def test_select_star_returns_all_columns(engine):
|
||||
rows = engine.execute("SELECT * FROM products WHERE id = '1'")
|
||||
assert rows == [{"id": "1", "name": "Widget", "price": "9.99"}]
|
||||
|
||||
|
||||
def test_select_star_marks_table_full(engine):
|
||||
engine.execute("SELECT * FROM products")
|
||||
assert engine._cache.is_table_full("products") is True
|
||||
|
||||
|
||||
# ---------------------------------------------------------------------------
|
||||
|
||||
Reference in New Issue
Block a user