Files
sqlalchemy-pgview/tests/test_ddl.py
2026-02-08 10:09:48 +01:00

183 lines
5.7 KiB
Python

"""Tests for DDL operations."""
from sqlalchemy import select
from sqlalchemy.engine import Engine
from sqlalchemy_pgview import (
CreateMaterializedView,
CreateView,
DropMaterializedView,
DropView,
MaterializedView,
RefreshMaterializedView,
View,
)
class TestCreateView:
"""Tests for CreateView DDL."""
def test_create_view_sql(self, pg_engine: Engine, sample_tables: tuple) -> None:
"""Test CREATE VIEW SQL generation."""
users, _ = sample_tables
view = View(
"active_users",
select(users.c.id, users.c.name),
)
stmt = CreateView(view)
compiled = stmt.compile(dialect=pg_engine.dialect)
sql = str(compiled)
assert "CREATE VIEW active_users AS" in sql
assert "users.id" in sql
assert "users.name" in sql
def test_create_or_replace_view_sql(
self, pg_engine: Engine, sample_tables: tuple
) -> None:
"""Test CREATE OR REPLACE VIEW SQL generation."""
users, _ = sample_tables
view = View(
"active_users",
select(users.c.id),
)
stmt = CreateView(view, or_replace=True)
compiled = stmt.compile(dialect=pg_engine.dialect)
sql = str(compiled)
assert "CREATE OR REPLACE VIEW" in sql
def test_create_view_with_schema(
self, pg_engine: Engine, sample_tables: tuple
) -> None:
"""Test CREATE VIEW with schema."""
users, _ = sample_tables
view = View(
"active_users",
select(users.c.id),
schema="analytics",
)
stmt = CreateView(view)
compiled = stmt.compile(dialect=pg_engine.dialect)
sql = str(compiled)
assert "analytics.active_users" in sql
class TestDropView:
"""Tests for DropView DDL."""
def test_drop_view_sql(self, pg_engine: Engine) -> None:
"""Test DROP VIEW SQL generation."""
stmt = DropView("test_view")
compiled = stmt.compile(dialect=pg_engine.dialect)
sql = str(compiled)
assert sql == "DROP VIEW test_view"
def test_drop_view_if_exists(self, pg_engine: Engine) -> None:
"""Test DROP VIEW IF EXISTS."""
stmt = DropView("test_view", if_exists=True)
compiled = stmt.compile(dialect=pg_engine.dialect)
sql = str(compiled)
assert sql == "DROP VIEW IF EXISTS test_view"
def test_drop_view_cascade(self, pg_engine: Engine) -> None:
"""Test DROP VIEW CASCADE."""
stmt = DropView("test_view", cascade=True)
compiled = stmt.compile(dialect=pg_engine.dialect)
sql = str(compiled)
assert sql == "DROP VIEW test_view CASCADE"
def test_drop_view_with_schema(self, pg_engine: Engine) -> None:
"""Test DROP VIEW with schema."""
stmt = DropView("test_view", schema="analytics", if_exists=True)
compiled = stmt.compile(dialect=pg_engine.dialect)
sql = str(compiled)
assert sql == "DROP VIEW IF EXISTS analytics.test_view"
class TestCreateMaterializedView:
"""Tests for CreateMaterializedView DDL."""
def test_create_materialized_view_sql(
self, pg_engine: Engine, sample_tables: tuple
) -> None:
"""Test CREATE MATERIALIZED VIEW SQL generation."""
users, _ = sample_tables
mview = MaterializedView(
"user_cache",
select(users.c.id, users.c.name),
with_data=True,
)
stmt = CreateMaterializedView(mview)
compiled = stmt.compile(dialect=pg_engine.dialect)
sql = str(compiled)
assert "CREATE MATERIALIZED VIEW user_cache AS" in sql
assert "WITH DATA" in sql
def test_create_materialized_view_without_data(
self, pg_engine: Engine, sample_tables: tuple
) -> None:
"""Test CREATE MATERIALIZED VIEW WITH NO DATA."""
users, _ = sample_tables
mview = MaterializedView(
"user_cache",
select(users.c.id),
with_data=False,
)
stmt = CreateMaterializedView(mview)
compiled = stmt.compile(dialect=pg_engine.dialect)
sql = str(compiled)
assert "WITH NO DATA" in sql
class TestDropMaterializedView:
"""Tests for DropMaterializedView DDL."""
def test_drop_materialized_view_sql(self, pg_engine: Engine) -> None:
"""Test DROP MATERIALIZED VIEW SQL generation."""
stmt = DropMaterializedView("test_mview", if_exists=True, cascade=True)
compiled = stmt.compile(dialect=pg_engine.dialect)
sql = str(compiled)
assert sql == "DROP MATERIALIZED VIEW IF EXISTS test_mview CASCADE"
class TestRefreshMaterializedView:
"""Tests for RefreshMaterializedView DDL."""
def test_refresh_materialized_view_sql(self, pg_engine: Engine) -> None:
"""Test REFRESH MATERIALIZED VIEW SQL generation."""
stmt = RefreshMaterializedView("test_mview")
compiled = stmt.compile(dialect=pg_engine.dialect)
sql = str(compiled)
assert sql == "REFRESH MATERIALIZED VIEW test_mview WITH DATA"
def test_refresh_concurrently(self, pg_engine: Engine) -> None:
"""Test REFRESH MATERIALIZED VIEW CONCURRENTLY."""
stmt = RefreshMaterializedView("test_mview", concurrently=True)
compiled = stmt.compile(dialect=pg_engine.dialect)
sql = str(compiled)
assert "CONCURRENTLY" in sql
def test_refresh_without_data(self, pg_engine: Engine) -> None:
"""Test REFRESH MATERIALIZED VIEW WITH NO DATA."""
stmt = RefreshMaterializedView("test_mview", with_data=False)
compiled = stmt.compile(dialect=pg_engine.dialect)
sql = str(compiled)
assert "WITH NO DATA" in sql