fix(openapi): harden story 2.1 production lifecycle
CI / Rust Checks (push) Failing after 4m6s
CI / UI Checks (push) Has been skipped
CI / Frontend E2E (push) Has been skipped
CI / Community Image Smoke (push) Has been skipped
CI / Deploy (push) Has been skipped

This commit is contained in:
2026-08-29 00:48:22 +03:00
parent 2c94af6791
commit bc03c33387
46 changed files with 2198 additions and 276 deletions
@@ -1,7 +1,7 @@
use super::*;
#[tokio::test]
async fn healthy_v11_upgrades_to_v12_without_rewriting_prior_ledger() {
async fn healthy_v11_upgrades_to_v13_without_rewriting_prior_ledger() {
let database_url = crank_test_support::postgres_schema_url("test_v11_to_v12_artifacts").await;
let pool = sqlx::PgPool::connect(&database_url).await.unwrap();
MigrationAuthority::apply(&pool).await.unwrap();
@@ -27,7 +27,7 @@ async fn healthy_v11_upgrades_to_v12_without_rewriting_prior_ledger() {
MigrationAuthority::preflight(&pool).await.unwrap(),
MigrationPreflight::MigrationRequired {
current: 11,
target: 12,
target: 13,
}
);
@@ -51,22 +51,22 @@ async fn healthy_v11_upgrades_to_v12_without_rewriting_prior_ledger() {
.collect::<Vec<_>>();
assert_eq!(after, prior);
let v12_applied_at: time::OffsetDateTime =
sqlx::query_scalar("select applied_at from __crank_migrations where version = 12")
let v13_applied_at: time::OffsetDateTime =
sqlx::query_scalar("select applied_at from __crank_migrations where version = 13")
.fetch_one(&pool)
.await
.unwrap();
MigrationAuthority::apply(&pool).await.unwrap();
let replayed_at: time::OffsetDateTime =
sqlx::query_scalar("select applied_at from __crank_migrations where version = 12")
sqlx::query_scalar("select applied_at from __crank_migrations where version = 13")
.fetch_one(&pool)
.await
.unwrap();
assert_eq!(replayed_at, v12_applied_at);
assert_eq!(replayed_at, v13_applied_at);
}
#[tokio::test]
async fn v12_exact_guard_rejects_column_constraint_index_and_relation_drift() {
async fn v12_guard_still_rejects_column_constraint_index_and_relation_drift() {
let database_url = crank_test_support::postgres_schema_url("test_v12_artifact_drift").await;
let pool = sqlx::PgPool::connect(&database_url).await.unwrap();
MigrationAuthority::apply(&pool).await.unwrap();
@@ -158,7 +158,7 @@ async fn v12_exact_guard_rejects_column_constraint_index_and_relation_drift() {
sqlx::raw_sql(restore).execute(&pool).await.unwrap();
assert_eq!(
MigrationAuthority::preflight(&pool).await.unwrap(),
MigrationPreflight::Current { version: 12 },
MigrationPreflight::Current { version: 13 },
"restore: {restore}"
);
}
@@ -175,3 +175,44 @@ async fn v12_exact_guard_rejects_column_constraint_index_and_relation_drift() {
assert_eq!(error.code(), "partial_sequence");
assert_eq!(error.version(), Some(12));
}
#[tokio::test]
async fn v13_guard_rejects_wrong_cleanup_index_order_and_predicate() {
let database_url =
crank_test_support::postgres_schema_url("test_v13_cleanup_index_drift").await;
let pool = sqlx::PgPool::connect(&database_url).await.unwrap();
MigrationAuthority::apply(&pool).await.unwrap();
for (drift, restore) in [
(
"drop index artifact_sources_blob_lifecycle_detached_idx;
create index artifact_sources_blob_lifecycle_detached_idx
on artifact_sources(lifecycle, blob_digest, detached_at);",
"drop index artifact_sources_blob_lifecycle_detached_idx;
create index artifact_sources_blob_lifecycle_detached_idx
on artifact_sources(blob_digest, lifecycle, detached_at);",
),
(
"drop index artifact_sources_openapi_dangling_idx;
create index artifact_sources_openapi_dangling_idx
on artifact_sources(created_at, workspace_id, source_id)
where lifecycle = 'active';",
"drop index artifact_sources_openapi_dangling_idx;
create index artifact_sources_openapi_dangling_idx
on artifact_sources(created_at, workspace_id, source_id)
where lifecycle = 'active' and left(source_id, 12) = 'src_openapi_';",
),
] {
sqlx::raw_sql(drift).execute(&pool).await.unwrap();
let error = MigrationAuthority::preflight(&pool).await.unwrap_err();
assert_eq!(error.code(), "partial_sequence", "drift: {drift}");
assert_eq!(error.version(), Some(13), "drift: {drift}");
sqlx::raw_sql(restore).execute(&pool).await.unwrap();
assert_eq!(
MigrationAuthority::preflight(&pool).await.unwrap(),
MigrationPreflight::Current { version: 13 },
"restore: {restore}"
);
}
}
@@ -63,7 +63,7 @@ async fn failed_artifact_metadata_migration_rolls_back_schema_and_ledger() {
MigrationAuthority::preflight(&pool).await.unwrap(),
MigrationPreflight::MigrationRequired {
current: 11,
target: 12,
target: 13,
}
);
}