Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
53 changes: 32 additions & 21 deletions src/Weasel.Postgresql.Tests/Tables/detecting_table_deltas.cs
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
using Baseline;
using Shouldly;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Baseline;
using Castle.Components.DictionaryAdapter;
using Shouldly;
using Weasel.Postgresql.Tables;
using Xunit;

Expand Down Expand Up @@ -32,8 +31,7 @@ public detecting_table_deltas() : base("deltas")
theTable.AddColumn<string>("first_name");
theTable.AddColumn<string>("last_name");
theTable.AddColumn<string>("user_name");
theTable.AddColumn("data", "jsonb");

theTable.AddColumn("data", "jsonb");

ResetSchema().GetAwaiter().GetResult();
}
Expand Down Expand Up @@ -121,8 +119,7 @@ public async Task extra_column()
delta.Difference.ShouldBe(SchemaPatchDifference.Update);

await AssertNoDeltasAfterPatching();
}

}

[Fact]
public async Task detect_new_index()
Expand All @@ -140,7 +137,6 @@ public async Task detect_new_index()
delta.Difference.ShouldBe(SchemaPatchDifference.Update);

await AssertNoDeltasAfterPatching();

}

[Fact]
Expand Down Expand Up @@ -188,7 +184,6 @@ public async Task detect_different_index()
[Fact]
public async Task detect_extra_index()
{

theTable.ModifyColumn("user_name").AddIndex(i => i.IsUnique = true);
await CreateSchemaObjectInDatabase(theTable);

Expand Down Expand Up @@ -217,7 +212,6 @@ public async Task matching_index_ddl(string description, Action<Table> configure

// The index DDL should match what the database thinks it is in order to match


var expected = existing!.Indexes.Single();
var actual = theTable.Indexes.Single();

Expand All @@ -226,7 +220,6 @@ public async Task matching_index_ddl(string description, Action<Table> configure
// And no deltas
var delta = await theTable.FindDelta(theConnection);
delta.Indexes.Matched.Count.ShouldBe(1);

}

public static IEnumerable<object[]> IndexTestData()
Expand Down Expand Up @@ -312,7 +305,6 @@ public static IEnumerable<object[]> IndexTestData()

}


[Fact]
public async Task detect_all_new_foreign_key()
{
Expand Down Expand Up @@ -374,8 +366,7 @@ public async Task detect_extra_foreign_key()
delta.Difference.ShouldBe(SchemaPatchDifference.Update);

await AssertNoDeltasAfterPatching(table);
}

}

[Fact]
public async Task match_foreign_key()
Expand Down Expand Up @@ -407,8 +398,7 @@ public async Task match_foreign_key()
delta.Difference.ShouldBe(SchemaPatchDifference.None);

await AssertNoDeltasAfterPatching(table);
}

}

[Fact]
public async Task match_foreign_key_with_inherited_foreign_key_class()
Expand Down Expand Up @@ -487,8 +477,7 @@ public async Task detect_primary_key_change()
delta.HasChanges().ShouldBeTrue();

await AssertNoDeltasAfterPatching(theTable);
}

}

[Fact]
public async Task detect_new_primary_key_change()
Expand All @@ -510,7 +499,6 @@ public async Task detect_new_primary_key_change()
await AssertNoDeltasAfterPatching(theTable);
}


[Fact]
public async Task detect_new_primary_key_constraint_name_change()
{
Expand All @@ -527,6 +515,31 @@ public async Task detect_new_primary_key_constraint_name_change()
await AssertNoDeltasAfterPatching(theTable);
}

[Fact]
public async Task detect_new_primary_key_constraint_name_change_when_also_used_as_foreign_key()
{
var dudeTable = new Table("deltas.dudes");
dudeTable.AddColumn<int>("id").AsPrimaryKey();
dudeTable.AddColumn<string>("first_name");

await CreateSchemaObjectInDatabase(dudeTable);

var carTable = new Table("deltas.cars");
carTable.AddColumn<int>("id").AsPrimaryKey();
carTable.AddColumn<int>("dude_id").ForeignKeyTo(dudeTable, "id");

await CreateSchemaObjectInDatabase(carTable);

dudeTable.PrimaryKeyName = "pk_newchange";

var delta = await dudeTable.FindDelta(theConnection);

delta.PrimaryKeyDifference.ShouldBe(SchemaPatchDifference.Update);

delta.HasChanges().ShouldBeTrue();

await AssertNoDeltasAfterPatching(dudeTable);
}

[Fact]
public async Task equivalency_with_the_postgres_synonym_issue()
Expand Down Expand Up @@ -579,7 +592,5 @@ public async Task patching_and_detecting_deltas_with_computed_indexes()

await AssertNoDeltasAfterPatching(table);
}


}
}
6 changes: 6 additions & 0 deletions src/Weasel.Postgresql/Tables/TableDelta.cs
Original file line number Diff line number Diff line change
Expand Up @@ -113,6 +113,12 @@ public override void WriteUpdate(DdlRules rules, TextWriter writer)
{
case SchemaPatchDifference.Invalid:
case SchemaPatchDifference.Update:
if (Expected.PrimaryKeyColumns.SequenceEqual(Actual?.PrimaryKeyColumns))
{
//for when PK constraint name changes only
writer.WriteLine($"alter table {Expected.Identifier} rename constraint {Actual!.PrimaryKeyName} to {Expected.PrimaryKeyName};");
break;
}
writer.WriteLine($"alter table {Expected.Identifier} drop constraint {Actual!.PrimaryKeyName};");
writer.WriteLine($"alter table {Expected.Identifier} add {Expected.PrimaryKeyDeclaration()};");
break;
Expand Down