mirror of
https://github.com/d3vyce/sqlalchemy-pgview.git
synced 2026-03-01 19:50:46 +01:00
183 lines
5.7 KiB
Python
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
|