from pathlib import Path def test_hybrid_search_dynamic_sql_escapes_format_percent_signs() -> None: contract = Path("sql/aws_pgvector_contract.sql").read_text(encoding="utf-8") dynamic_sql = contract.split("RETURN QUERY EXECUTE format($query$", maxsplit=1)[1] dynamic_sql = dynamic_sql.split("$query$, target_table)", maxsplit=1)[0] remaining_percent_signs = dynamic_sql.replace("%%", "").replace("%I", "") assert "%" not in remaining_percent_signs def test_post_feed_contract_is_synchronized() -> None: migration = Path("sql/migrate_post_feed_v1.sql").read_text(encoding="utf-8") base_contract = Path("sql/aws_pgvector_contract.sql").read_text(encoding="utf-8") full_setup = Path("sql/aws_pgvector_full_setup.psql.sql").read_text(encoding="utf-8") required = { "post_cluster_runs", "post_cluster_memberships", "post_embedding_tombstones", "user_interest_embeddings", "post_sync_checkpoints", "get_post_feed_features", "deactivate_post_embedding", "validate_post_cluster_run", "fail_post_cluster_run", "get_post_cluster_run", "reset_user_interest_profiles", "reset_post_sync_checkpoint", "activate_post_cluster_run", } assert all(name in migration for name in required) base_required = { "post_cluster_runs", "post_cluster_memberships", "post_embedding_tombstones", "user_interest_embeddings", "post_sync_checkpoints", } assert all(name in base_contract for name in base_required) assert "\\ir migrate_post_feed_v1.sql" in full_setup assert "\\ir migrate_post_feed_v2.sql" in full_setup assert Path("sql/verify_post_feed_v1.sql").exists() assert Path("sql/rollback_post_feed_v1.sql").exists() def test_post_feed_v2_and_convergent_schema_are_present() -> None: migration = Path("sql/migrate_post_feed_v2.sql").read_text(encoding="utf-8") verifier = Path("sql/verify_post_feed_v2.sql").read_text(encoding="utf-8") convergent = Path("sql/new_pgvector_schema.sql").read_text(encoding="utf-8") assert "source_version es obligatorio" in migration assert "EXCLUDED.source_version > post_embeddings.source_version" in migration assert "cluster_count <> expected_k" in migration assert "post_embedding_dimension_ok" in verifier assert "aws_pgvector_contract" not in convergent # contenido inline, sin includes assert "CREATE TABLE IF NOT EXISTS post_embeddings" in convergent assert "CREATE OR REPLACE FUNCTION public.get_post_feed_features" in convergent assert "migrate_post_feed_v2.sql" not in convergent # contenido inline, sin includes def test_global_search_candidate_filters_are_convergent_and_incremental() -> None: contract = Path("sql/aws_pgvector_contract.sql").read_text(encoding="utf-8") convergent = Path("sql/new_pgvector_schema.sql").read_text(encoding="utf-8") migration = Path( "sql/migrations/20260712_01_global_search_candidate_filters.sql" ).read_text(encoding="utf-8") verifier = Path("sql/verify_global_search_candidate_filters.sql") for token in ( "event_active_at", "min_semantic_score", "min_lexical_score", "make_interval", "try_parse_timestamptz", "try_parse_positive_integer", ): assert token in contract assert token in convergent assert token in migration upper_migration = migration.upper() assert "BEGIN;" in upper_migration assert "COMMIT;" in upper_migration assert "CREATE OR REPLACE FUNCTION PUBLIC.SEARCH_RESOURCE_EMBEDDINGS" in upper_migration assert "CREATE TABLE" not in upper_migration assert "ALTER TABLE" not in upper_migration assert "CREATE INDEX" not in upper_migration assert "DROP FUNCTION" not in upper_migration assert "TO NLP_READER" in upper_migration assert verifier.exists() verifier_sql = verifier.read_text(encoding="utf-8") assert "RAISE EXCEPTION 'Verify search V2" in verifier_sql assert "SET TRANSACTION READ ONLY" in verifier_sql def test_global_search_sql_does_not_directly_cast_untrusted_event_metadata() -> None: for path in ( Path("sql/aws_pgvector_contract.sql"), Path("sql/new_pgvector_schema.sql"), Path("sql/migrations/20260712_01_global_search_candidate_filters.sql"), ): sql = path.read_text(encoding="utf-8") assert "NULLIF(e.metadata->>'start_time', '')::timestamptz" not in sql assert "(e.metadata->>'duration_minutes')::integer" not in sql def test_places_semantic_index_is_additive_and_hybrid() -> None: migration = Path( "sql/migrations/20260716_02_places_semantic_v1.sql" ).read_text(encoding="utf-8") upper = migration.upper() assert "PLACE_EMBEDDINGS_SEMANTIC_V1" in upper assert "VECTOR(768)" in upper assert "SEARCH_PLACES_SEMANTIC_V1" in upper assert "FULL OUTER JOIN" in upper assert "WEBSEARCH_TO_TSQUERY" in upper assert "USING HNSW" in upper assert "AS MATERIALIZED" not in upper assert "FROM PUBLIC.PLACE_EMBEDDINGS_SEMANTIC_V1 AS PLACE" in upper assert "ALTER TABLE PUBLIC.PLACE_EMBEDDINGS" not in upper assert "DROP TABLE" not in upper verifier = Path("sql/verify_places_semantic_v1.sql") assert verifier.exists() verifier_sql = verifier.read_text(encoding="utf-8").upper() assert "SET TRANSACTION READ ONLY" in verifier_sql assert "VECTOR(768)" in verifier_sql assert "USING HNSW" in verifier_sql assert "EXPLAIN (ANALYZE, BUFFERS" in verifier_sql