Skip to content

Commit ae110f3

Browse files
Add an option to specify the tables to ignore in the comparison.
1 parent d50e609 commit ae110f3

File tree

7 files changed

+72
-15
lines changed

7 files changed

+72
-15
lines changed
Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
//-----------------------------------------------------------------------
2+
// <copyright file="SqlDatabaseComparerOptions.cs" company="P.O.S Informatique">
3+
// Copyright (c) P.O.S Informatique. All rights reserved.
4+
// </copyright>
5+
//-----------------------------------------------------------------------
6+
7+
namespace PosInformatique.UnitTests.Databases
8+
{
9+
using System.Collections.ObjectModel;
10+
11+
/// <summary>
12+
/// Options for the comparison between two SQL database.
13+
/// </summary>
14+
public class SqlDatabaseComparerOptions
15+
{
16+
/// <summary>
17+
/// Initializes a new instance of the <see cref="SqlDatabaseComparerOptions"/> class.
18+
/// </summary>
19+
public SqlDatabaseComparerOptions()
20+
{
21+
this.ExcludedTables = [];
22+
}
23+
24+
/// <summary>
25+
/// Gets the list of the excluded SQL table during the comparison.
26+
/// </summary>
27+
public Collection<string> ExcludedTables { get; }
28+
}
29+
}

src/UnitTests.Databases.SqlServer/Comparer/SqlServerDatabaseComparer.cs

Lines changed: 15 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -18,17 +18,23 @@ public static class SqlServerDatabaseComparer
1818
/// </summary>
1919
/// <param name="source">First database to compare with <paramref name="target"/>.</param>
2020
/// <param name="target">Second database to compare with <paramref name="source"/>.</param>
21+
/// <param name="options">Options of the comparison between the two database.</param>
2122
/// <param name="cancellationToken"><see cref="CancellationToken"/> used to cancel the asynchronous operation.</param>
2223
/// <returns>A <see cref="Task"/> which represents the asynchronous operation and contains the difference between the two databases.</returns>
23-
public static async Task<SqlDatabaseComparisonResults> CompareAsync(SqlServerDatabase source, SqlServerDatabase target, CancellationToken cancellationToken = default)
24+
public static async Task<SqlDatabaseComparisonResults> CompareAsync(SqlServerDatabase source, SqlServerDatabase target, SqlDatabaseComparerOptions? options = null, CancellationToken cancellationToken = default)
2425
{
26+
if (options == null)
27+
{
28+
options = new SqlDatabaseComparerOptions();
29+
}
30+
2531
// Gets the stored procedures
2632
var sourceStoredProcedures = source.GetStoredProceduresAsync(cancellationToken);
2733
var targetStoredProcedures = target.GetStoredProceduresAsync(cancellationToken);
2834

2935
// Gets the tables
30-
var sourceTables = source.GetTablesAsync(cancellationToken);
31-
var targetTables = target.GetTablesAsync(cancellationToken);
36+
var sourceTablesTask = source.GetTablesAsync(cancellationToken);
37+
var targetTablesTask = target.GetTablesAsync(cancellationToken);
3238

3339
// Gets the user types
3440
var sourceUserTypes = source.GetUserTypesAsync(cancellationToken);
@@ -41,15 +47,18 @@ public static async Task<SqlDatabaseComparisonResults> CompareAsync(SqlServerDat
4147
await Task.WhenAll(
4248
sourceStoredProcedures,
4349
targetStoredProcedures,
44-
sourceTables,
45-
targetTables,
50+
sourceTablesTask,
51+
targetTablesTask,
4652
sourceUserTypes,
4753
targetUserTypes,
4854
sourceViews,
4955
targetViews);
5056

57+
var sourceTables = sourceTablesTask.Result.Where(t => !options.ExcludedTables.Contains(t.Name)).ToArray();
58+
var targetTables = targetTablesTask.Result.Where(t => !options.ExcludedTables.Contains(t.Name)).ToArray();
59+
5160
var storedProceduresDifferences = SqlObjectComparer.Compare(sourceStoredProcedures.Result, targetStoredProcedures.Result, sp => sp.Schema + "." + sp.Name);
52-
var tablesDifferences = SqlObjectComparer.Compare(sourceTables.Result, targetTables.Result);
61+
var tablesDifferences = SqlObjectComparer.Compare(sourceTables, targetTables);
5362
var userTypesDifferences = SqlObjectComparer.Compare(sourceUserTypes.Result, targetUserTypes.Result, ut => ut.Name);
5463
var viewsDifferences = SqlObjectComparer.Compare(sourceViews.Result, targetViews.Result, v => v.Schema + "." + v.Name);
5564

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
CREATE TABLE [dbo].[__EFMigrationsHistorySource]
2+
(
3+
[Id] INT NOT NULL PRIMARY KEY
4+
)

tests/UnitTests.Databases.SqlServer.Tests.Source/UnitTests.Databases.SqlServer.Tests.Source.sqlproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -100,5 +100,6 @@
100100
<Build Include="Views\ViewIdentical.sql" />
101101
<Build Include="Views\ViewSource.sql" />
102102
<Build Include="Views\ViewDifference.sql" />
103+
<Build Include="Tables\__EFMigrationsHistorySource.sql" />
103104
</ItemGroup>
104105
</Project>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
CREATE TABLE [dbo].[__EFMigrationsHistoryTarget]
2+
(
3+
[Id] INT NOT NULL PRIMARY KEY
4+
)

tests/UnitTests.Databases.SqlServer.Tests.Target/UnitTests.Databases.SqlServer.Tests.Target.sqlproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -114,5 +114,6 @@
114114
<Build Include="Programmability\Stored Procedures\StoredProcedureIdentical.sql" />
115115
<Build Include="Tables\CheckConstraints\CheckConstraintIdentical.sql" />
116116
<Build Include="Tables\Triggers\TriggerIdentical.sql" />
117+
<Build Include="Tables\__EFMigrationsHistoryTarget.sql" />
117118
</ItemGroup>
118119
</Project>

tests/UnitTests.Databases.SqlServer.Tests/SqlServerDatabaseComparerTest.cs

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,16 @@ public async Task CompareAsync()
1919
var sourceDatabase = server.DeployDacPackage("UnitTests.Databases.SqlServer.Tests.Source.dacpac", $"{nameof(SqlServerDatabaseComparerTest)}_Source");
2020
var targetDatabase = server.DeployDacPackage("UnitTests.Databases.SqlServer.Tests.Target.dacpac", $"{nameof(SqlServerDatabaseComparerTest)}_Target");
2121

22-
var differences = await SqlServerDatabaseComparer.CompareAsync(sourceDatabase, targetDatabase);
22+
var options = new SqlDatabaseComparerOptions()
23+
{
24+
ExcludedTables =
25+
{
26+
"__EFMigrationsHistorySource",
27+
"__EFMigrationsHistoryTarget",
28+
},
29+
};
30+
31+
var differences = await SqlServerDatabaseComparer.CompareAsync(sourceDatabase, targetDatabase, options);
2332

2433
// StoredProcedures
2534
differences.StoredProcedures.Should().HaveCount(3);
@@ -534,11 +543,11 @@ public async Task CompareAsync()
534543
differences.Tables[0].UniqueConstraints[0].Type.Should().Be(SqlObjectDifferenceType.Different);
535544

536545
// Missing tables
537-
differences.Tables[1].Columns.Should().BeNull();
538-
differences.Tables[1].Indexes.Should().BeNull();
546+
differences.Tables[1].Columns.Should().BeEmpty();
547+
differences.Tables[1].Indexes.Should().BeEmpty();
539548
differences.Tables[1].PrimaryKey.Should().BeNull();
540549
differences.Tables[1].Source.Should().BeNull();
541-
differences.Tables[1].UniqueConstraints.Should().BeNull();
550+
differences.Tables[1].UniqueConstraints.Should().BeEmpty();
542551
differences.Tables[1].Target.CheckConstraints.Should().HaveCount(1);
543552
differences.Tables[1].Target.CheckConstraints[0].Name.Should().Be("CheckConstraintTarget");
544553
differences.Tables[1].Target.CheckConstraints[0].Code.Should().Be("([Id]>(0))");
@@ -589,13 +598,13 @@ public async Task CompareAsync()
589598
differences.Tables[1].Target.UniqueConstraints[0].Columns[0].Position.Should().Be(1);
590599
differences.Tables[1].Target.UniqueConstraints[0].Name.Should().Be("UniqueConstraintTarget");
591600
differences.Tables[1].Target.UniqueConstraints[0].Type.Should().Be("NONCLUSTERED");
592-
differences.Tables[1].Triggers.Should().BeNull();
601+
differences.Tables[1].Triggers.Should().BeEmpty();
593602
differences.Tables[1].Type.Should().Be(SqlObjectDifferenceType.MissingInSource);
594603

595-
differences.Tables[2].Columns.Should().BeNull();
596-
differences.Tables[2].Indexes.Should().BeNull();
604+
differences.Tables[2].Columns.Should().BeEmpty();
605+
differences.Tables[2].Indexes.Should().BeEmpty();
597606
differences.Tables[2].PrimaryKey.Should().BeNull();
598-
differences.Tables[2].UniqueConstraints.Should().BeNull();
607+
differences.Tables[2].UniqueConstraints.Should().BeEmpty();
599608
differences.Tables[2].Source.CheckConstraints.Should().HaveCount(1);
600609
differences.Tables[2].Source.CheckConstraints[0].Name.Should().Be("CheckConstraintSource");
601610
differences.Tables[2].Source.CheckConstraints[0].Code.Should().Be("([Id]>(0))");
@@ -646,7 +655,7 @@ public async Task CompareAsync()
646655
differences.Tables[2].Source.UniqueConstraints[0].Columns[0].Position.Should().Be(1);
647656
differences.Tables[2].Source.UniqueConstraints[0].Name.Should().Be("UniqueConstraintSource");
648657
differences.Tables[2].Source.UniqueConstraints[0].Type.Should().Be("NONCLUSTERED");
649-
differences.Tables[2].Triggers.Should().BeNull();
658+
differences.Tables[2].Triggers.Should().BeEmpty();
650659
differences.Tables[2].Type.Should().Be(SqlObjectDifferenceType.MissingInTarget);
651660

652661
// UserTypes

0 commit comments

Comments
 (0)