Skip to content

Commit 48e3911

Browse files
committed
Add testcase
1 parent ed3ecbf commit 48e3911

File tree

2 files changed

+88
-29
lines changed

2 files changed

+88
-29
lines changed

crates/vespertide-planner/src/diff.rs

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5163,4 +5163,44 @@ mod tests {
51635163
plan.actions
51645164
);
51655165
}
5166+
5167+
#[test]
5168+
fn diff_mismatched_constraint_types_not_paired() {
5169+
// Removing a Unique and adding an Index on the same columns should NOT produce
5170+
// ReplaceConstraint — they are different constraint types (hits _ => false branch).
5171+
let from = vec![table(
5172+
"users",
5173+
vec![col("email", ColumnType::Simple(SimpleColumnType::Text))],
5174+
vec![TableConstraint::Unique {
5175+
name: Some("uq_email".into()),
5176+
columns: vec!["email".into()],
5177+
}],
5178+
)];
5179+
let to = vec![table(
5180+
"users",
5181+
vec![col("email", ColumnType::Simple(SimpleColumnType::Text))],
5182+
vec![idx("ix_email", vec!["email"])],
5183+
)];
5184+
let plan = diff_schemas(&from, &to).unwrap();
5185+
// Should be Remove + Add, not ReplaceConstraint
5186+
let replace_count = plan
5187+
.actions
5188+
.iter()
5189+
.filter(|a| matches!(a, MigrationAction::ReplaceConstraint { .. }))
5190+
.count();
5191+
assert_eq!(
5192+
replace_count, 0,
5193+
"Mismatched types should not produce ReplaceConstraint, got: {:?}",
5194+
plan.actions
5195+
);
5196+
assert_eq!(plan.actions.len(), 2);
5197+
assert!(matches!(
5198+
&plan.actions[0],
5199+
MigrationAction::RemoveConstraint { .. }
5200+
));
5201+
assert!(matches!(
5202+
&plan.actions[1],
5203+
MigrationAction::AddConstraint { .. }
5204+
));
5205+
}
51665206
}

crates/vespertide-query/src/sql/replace_constraint.rs

Lines changed: 48 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -368,11 +368,12 @@ mod tests {
368368
#[case::sqlite(DatabaseBackend::Sqlite)]
369369
fn replace_unique_constraint(#[case] backend: DatabaseBackend) {
370370
// Non-FK constraint: PG/MySQL uses remove+add, SQLite uses temp table
371-
let schema = vec![TableDef {
372-
name: "users".into(),
373-
description: None,
374-
columns: vec![
375-
ColumnDef {
371+
// Multi-table schema so the non-target table hits the else branch (t.clone())
372+
let schema = vec![
373+
TableDef {
374+
name: "other".into(),
375+
description: None,
376+
columns: vec![ColumnDef {
376377
name: "id".into(),
377378
r#type: ColumnType::Simple(SimpleColumnType::Integer),
378379
nullable: false,
@@ -382,30 +383,48 @@ mod tests {
382383
unique: None,
383384
index: None,
384385
foreign_key: None,
385-
},
386-
ColumnDef {
387-
name: "email".into(),
388-
r#type: ColumnType::Simple(SimpleColumnType::Text),
389-
nullable: false,
390-
default: None,
391-
comment: None,
392-
primary_key: None,
393-
unique: None,
394-
index: None,
395-
foreign_key: None,
396-
},
397-
],
398-
constraints: vec![
399-
TableConstraint::PrimaryKey {
400-
auto_increment: false,
401-
columns: vec!["id".into()],
402-
},
403-
TableConstraint::Unique {
404-
name: Some("uq_email".into()),
405-
columns: vec!["email".into()],
406-
},
407-
],
408-
}];
386+
}],
387+
constraints: vec![],
388+
},
389+
TableDef {
390+
name: "users".into(),
391+
description: None,
392+
columns: vec![
393+
ColumnDef {
394+
name: "id".into(),
395+
r#type: ColumnType::Simple(SimpleColumnType::Integer),
396+
nullable: false,
397+
default: None,
398+
comment: None,
399+
primary_key: None,
400+
unique: None,
401+
index: None,
402+
foreign_key: None,
403+
},
404+
ColumnDef {
405+
name: "email".into(),
406+
r#type: ColumnType::Simple(SimpleColumnType::Text),
407+
nullable: false,
408+
default: None,
409+
comment: None,
410+
primary_key: None,
411+
unique: None,
412+
index: None,
413+
foreign_key: None,
414+
},
415+
],
416+
constraints: vec![
417+
TableConstraint::PrimaryKey {
418+
auto_increment: false,
419+
columns: vec!["id".into()],
420+
},
421+
TableConstraint::Unique {
422+
name: Some("uq_email".into()),
423+
columns: vec!["email".into()],
424+
},
425+
],
426+
},
427+
];
409428
let from = TableConstraint::Unique {
410429
name: Some("uq_email".into()),
411430
columns: vec!["email".into()],

0 commit comments

Comments
 (0)