Skip to content

Commit 9804ed7

Browse files
Improve code coverage and unit tests.
1 parent 5c24f3b commit 9804ed7

6 files changed

Lines changed: 136 additions & 45 deletions

File tree

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

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -102,5 +102,6 @@
102102
<Build Include="Views\ViewDifference.sql" />
103103
<Build Include="Tables\__EFMigrationsHistorySource.sql" />
104104
<Build Include="Tables\TableWithDifferentPrimaryKey.sql" />
105+
<Build Include="Tables\TableWithNoPrimaryKey.sql" />
105106
</ItemGroup>
106107
</Project>
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
CREATE TABLE [dbo].[TableWithNoPrimaryKey]
2+
(
3+
[Id] INT IDENTITY (10, 30) NOT NULL,
4+
)

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

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,5 +116,6 @@
116116
<Build Include="Tables\Triggers\TriggerIdentical.sql" />
117117
<Build Include="Tables\__EFMigrationsHistoryTarget.sql" />
118118
<Build Include="Tables\TableWithDifferentPrimaryKey.sql" />
119+
<Build Include="Tables\TableWithNoPrimaryKey.sql" />
119120
</ItemGroup>
120121
</Project>

tests/Testing.Databases.SqlServer.Tests/SqlServerDatabaseComparerTest.CompareAsync.txt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -179,6 +179,12 @@
179179
* Name:
180180
Source: PK_TableWithDifferentPrimaryKey_Source
181181
Target: PK_TableWithDifferentPrimaryKey_Target
182+
- dbo.TableWithNoPrimaryKey
183+
------ Columns ------
184+
- Id
185+
* Identity:
186+
Source: (Seed: 10, Increment: 20)
187+
Target: (Seed: 10, Increment: 30)
182188
- dbo.TableSource (Missing in the target)
183189
------ Stored procedures ------
184190
- dbo.StoredProcedureDifference

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

Lines changed: 120 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,7 @@ public async Task CompareAsync()
5252
differences.StoredProcedures[2].Target.Should().BeNull();
5353

5454
// Tables
55-
differences.Tables.Should().HaveCount(4);
55+
differences.Tables.Should().HaveCount(5);
5656

5757
differences.Tables[0].Source.Name.Should().Be("TableDifference");
5858
differences.Tables[0].Source.Schema.Should().Be("dbo");
@@ -915,65 +915,140 @@ public async Task CompareAsync()
915915
differences.Tables[2].Triggers.Should().BeEmpty();
916916
differences.Tables[2].Type.Should().Be(SqlObjectDifferenceType.Different);
917917

918-
differences.Tables[3].Columns.Should().BeEmpty();
918+
differences.Tables[3].Columns.Should().HaveCount(1);
919+
differences.Tables[3].Columns[0].Properties.Should().HaveCount(1);
920+
differences.Tables[3].Columns[0].Properties[0].Name.Should().Be("Identity");
921+
differences.Tables[3].Columns[0].Properties[0].Source.Should().BeSameAs(differences.Tables[3].Source.Columns[0].Identity);
922+
differences.Tables[3].Columns[0].Properties[0].Target.Should().BeSameAs(differences.Tables[3].Target.Columns[0].Identity);
919923
differences.Tables[3].Indexes.Should().BeEmpty();
920924
differences.Tables[3].PrimaryKey.Should().BeNull();
921925
differences.Tables[3].UniqueConstraints.Should().BeEmpty();
922-
differences.Tables[3].Source.CheckConstraints.Should().HaveCount(1);
923-
differences.Tables[3].Source.CheckConstraints[0].Name.Should().Be("CheckConstraintSource");
924-
differences.Tables[3].Source.CheckConstraints[0].Code.Should().Be("([Id]>(0))");
925-
differences.Tables[3].Source.Columns.Should().HaveCount(3);
926+
differences.Tables[3].Source.CheckConstraints.Should().BeEmpty();
927+
differences.Tables[3].Source.Columns.Should().HaveCount(1);
926928
differences.Tables[3].Source.Columns[0].CollationName.Should().BeNull();
927929
differences.Tables[3].Source.Columns[0].ComputedExpression.Should().BeNull();
928930
differences.Tables[3].Source.Columns[0].IsComputed.Should().BeFalse();
929-
differences.Tables[3].Source.Columns[0].Identity.Should().BeNull();
931+
differences.Tables[3].Source.Columns[0].Identity.Increment.Should().Be(20);
932+
differences.Tables[3].Source.Columns[0].Identity.Seed.Should().Be(10);
930933
differences.Tables[3].Source.Columns[0].IsNullable.Should().BeFalse();
931934
differences.Tables[3].Source.Columns[0].MaxLength.Should().Be(4);
932935
differences.Tables[3].Source.Columns[0].Name.Should().Be("Id");
933936
differences.Tables[3].Source.Columns[0].Position.Should().Be(1);
934937
differences.Tables[3].Source.Columns[0].Precision.Should().Be(10);
935938
differences.Tables[3].Source.Columns[0].Scale.Should().Be(0);
936939
differences.Tables[3].Source.Columns[0].TypeName.Should().Be("int");
937-
differences.Tables[3].Source.Indexes.Should().HaveCount(2);
938-
differences.Tables[3].Source.Indexes[0].Columns.Should().HaveCount(1);
939-
differences.Tables[3].Source.Indexes[0].Columns[0].Name.Should().Be("SourceName");
940-
differences.Tables[3].Source.Indexes[0].Columns[0].Position.Should().Be(1);
941-
differences.Tables[3].Source.Indexes[0].Filter.Should().Be("([SourceName]='')");
942-
differences.Tables[3].Source.Indexes[0].IncludedColumns.Should().HaveCount(1);
943-
differences.Tables[3].Source.Indexes[0].IncludedColumns[0].Name.Should().Be("SourceForeignKeyId");
944-
differences.Tables[3].Source.Indexes[0].IncludedColumns[0].Position.Should().Be(1);
945-
differences.Tables[3].Source.Indexes[0].IsUnique.Should().BeFalse();
946-
differences.Tables[3].Source.Indexes[0].Name.Should().Be("IndexSource");
947-
differences.Tables[3].Source.Indexes[1].Columns.Should().HaveCount(1);
948-
differences.Tables[3].Source.Indexes[1].Columns[0].Name.Should().Be("Id");
949-
differences.Tables[3].Source.Indexes[1].Columns[0].Position.Should().Be(1);
950-
differences.Tables[3].Source.Indexes[1].Filter.Should().BeNull();
951-
differences.Tables[3].Source.Indexes[1].IncludedColumns.Should().HaveCount(0);
952-
differences.Tables[3].Source.ForeignKeys.Should().HaveCount(1);
953-
differences.Tables[3].Source.ForeignKeys[0].Columns.Should().HaveCount(1);
954-
differences.Tables[3].Source.ForeignKeys[0].Columns[0].Name.Should().Be("SourceForeignKeyId");
955-
differences.Tables[3].Source.ForeignKeys[0].Columns[0].Position.Should().Be(1);
956-
differences.Tables[3].Source.ForeignKeys[0].DeleteAction.Should().Be("NO_ACTION");
957-
differences.Tables[3].Source.ForeignKeys[0].Name.Should().Be("ForeignKeySource");
958-
differences.Tables[3].Source.ForeignKeys[0].ReferencedTable.Should().Be("ReferencedTable");
959-
differences.Tables[3].Source.ForeignKeys[0].UpdateAction.Should().Be("NO_ACTION");
960-
differences.Tables[3].Source.Name.Should().Be("TableSource");
940+
differences.Tables[3].Source.Indexes.Should().BeEmpty();
941+
differences.Tables[3].Source.ForeignKeys.Should().BeEmpty();
942+
differences.Tables[3].Source.Name.Should().Be("TableWithNoPrimaryKey");
961943
differences.Tables[3].Source.Schema.Should().Be("dbo");
962-
differences.Tables[3].Source.PrimaryKey.Name.Should().Be("PrimaryKeySource");
963-
differences.Tables[3].Source.PrimaryKey.Type.Should().Be("CLUSTERED");
964-
differences.Tables[3].Source.Triggers.Should().HaveCount(1);
965-
differences.Tables[3].Source.Triggers[0].Name.Should().Be("TriggerSource");
966-
differences.Tables[3].Source.Triggers[0].Code.Should().Be("CREATE TRIGGER [TriggerSource]\r\n\tON [dbo].[TableSource]\r\n\tFOR DELETE, INSERT, UPDATE\r\n\tAS\r\n\tBEGIN\r\n\t\tSET NOCOUNT ON\r\n\tEND");
967-
differences.Tables[3].Source.Triggers[0].IsInsteadOfTrigger.Should().BeFalse();
968-
differences.Tables[3].Source.UniqueConstraints.Should().HaveCount(1);
969-
differences.Tables[3].Source.UniqueConstraints[0].Columns.Should().HaveCount(1);
970-
differences.Tables[3].Source.UniqueConstraints[0].Columns[0].Name.Should().Be("Id");
971-
differences.Tables[3].Source.UniqueConstraints[0].Columns[0].Position.Should().Be(1);
972-
differences.Tables[3].Source.UniqueConstraints[0].Name.Should().Be("UniqueConstraintSource");
973-
differences.Tables[3].Source.UniqueConstraints[0].Type.Should().Be("NONCLUSTERED");
974-
differences.Tables[3].Target.Should().BeNull();
944+
differences.Tables[3].Source.PrimaryKey.Should().BeNull();
945+
differences.Tables[3].Source.Triggers.Should().BeEmpty();
946+
differences.Tables[3].Source.UniqueConstraints.Should().BeEmpty();
947+
differences.Tables[3].Target.CheckConstraints.Should().BeEmpty();
948+
differences.Tables[3].Target.Columns.Should().HaveCount(1);
949+
differences.Tables[3].Target.Columns[0].CollationName.Should().BeNull();
950+
differences.Tables[3].Target.Columns[0].ComputedExpression.Should().BeNull();
951+
differences.Tables[3].Target.Columns[0].IsComputed.Should().BeFalse();
952+
differences.Tables[3].Target.Columns[0].Identity.Increment.Should().Be(30);
953+
differences.Tables[3].Target.Columns[0].Identity.Seed.Should().Be(10);
954+
differences.Tables[3].Target.Columns[0].IsNullable.Should().BeFalse();
955+
differences.Tables[3].Target.Columns[0].MaxLength.Should().Be(4);
956+
differences.Tables[3].Target.Columns[0].Name.Should().Be("Id");
957+
differences.Tables[3].Target.Columns[0].Position.Should().Be(1);
958+
differences.Tables[3].Target.Columns[0].Precision.Should().Be(10);
959+
differences.Tables[3].Target.Columns[0].Scale.Should().Be(0);
960+
differences.Tables[3].Target.Columns[0].TypeName.Should().Be("int");
961+
differences.Tables[3].Target.Indexes.Should().BeEmpty();
962+
differences.Tables[3].Target.ForeignKeys.Should().BeEmpty();
963+
differences.Tables[3].Target.Name.Should().Be("TableWithNoPrimaryKey");
964+
differences.Tables[3].Target.Schema.Should().Be("dbo");
965+
differences.Tables[3].Target.PrimaryKey.Should().BeNull();
966+
differences.Tables[3].Target.Triggers.Should().BeEmpty();
967+
differences.Tables[3].Target.UniqueConstraints.Should().BeEmpty();
975968
differences.Tables[3].Triggers.Should().BeEmpty();
976-
differences.Tables[3].Type.Should().Be(SqlObjectDifferenceType.MissingInTarget);
969+
differences.Tables[3].Type.Should().Be(SqlObjectDifferenceType.Different);
970+
971+
differences.Tables[4].Columns.Should().BeEmpty();
972+
differences.Tables[4].Indexes.Should().BeEmpty();
973+
differences.Tables[4].PrimaryKey.Should().BeNull();
974+
differences.Tables[4].UniqueConstraints.Should().BeEmpty();
975+
differences.Tables[4].Source.CheckConstraints.Should().HaveCount(1);
976+
differences.Tables[4].Source.CheckConstraints[0].Name.Should().Be("CheckConstraintSource");
977+
differences.Tables[4].Source.CheckConstraints[0].Code.Should().Be("([Id]>(0))");
978+
differences.Tables[4].Source.Columns.Should().HaveCount(3);
979+
differences.Tables[4].Source.Columns[0].CollationName.Should().BeNull();
980+
differences.Tables[4].Source.Columns[0].ComputedExpression.Should().BeNull();
981+
differences.Tables[4].Source.Columns[0].IsComputed.Should().BeFalse();
982+
differences.Tables[4].Source.Columns[0].Identity.Should().BeNull();
983+
differences.Tables[4].Source.Columns[0].IsNullable.Should().BeFalse();
984+
differences.Tables[4].Source.Columns[0].MaxLength.Should().Be(4);
985+
differences.Tables[4].Source.Columns[0].Name.Should().Be("Id");
986+
differences.Tables[4].Source.Columns[0].Position.Should().Be(1);
987+
differences.Tables[4].Source.Columns[0].Precision.Should().Be(10);
988+
differences.Tables[4].Source.Columns[0].Scale.Should().Be(0);
989+
differences.Tables[4].Source.Columns[0].TypeName.Should().Be("int");
990+
differences.Tables[4].Source.Columns[1].CollationName.Should().Be("SQL_Latin1_General_CP1_CI_AS");
991+
differences.Tables[4].Source.Columns[1].ComputedExpression.Should().BeNull();
992+
differences.Tables[4].Source.Columns[1].IsComputed.Should().BeFalse();
993+
differences.Tables[4].Source.Columns[1].Identity.Should().BeNull();
994+
differences.Tables[4].Source.Columns[1].IsNullable.Should().BeTrue();
995+
differences.Tables[4].Source.Columns[1].MaxLength.Should().Be(50);
996+
differences.Tables[4].Source.Columns[1].Name.Should().Be("SourceName");
997+
differences.Tables[4].Source.Columns[1].Position.Should().Be(2);
998+
differences.Tables[4].Source.Columns[1].Precision.Should().Be(0);
999+
differences.Tables[4].Source.Columns[1].Scale.Should().Be(0);
1000+
differences.Tables[4].Source.Columns[1].TypeName.Should().Be("varchar");
1001+
differences.Tables[4].Source.Columns[2].CollationName.Should().BeNull();
1002+
differences.Tables[4].Source.Columns[2].ComputedExpression.Should().BeNull();
1003+
differences.Tables[4].Source.Columns[2].IsComputed.Should().BeFalse();
1004+
differences.Tables[4].Source.Columns[2].Identity.Should().BeNull();
1005+
differences.Tables[4].Source.Columns[2].IsNullable.Should().BeFalse();
1006+
differences.Tables[4].Source.Columns[2].MaxLength.Should().Be(4);
1007+
differences.Tables[4].Source.Columns[2].Name.Should().Be("SourceForeignKeyId");
1008+
differences.Tables[4].Source.Columns[2].Position.Should().Be(3);
1009+
differences.Tables[4].Source.Columns[2].Precision.Should().Be(10);
1010+
differences.Tables[4].Source.Columns[2].Scale.Should().Be(0);
1011+
differences.Tables[4].Source.Columns[2].TypeName.Should().Be("int");
1012+
differences.Tables[4].Source.Indexes.Should().HaveCount(2);
1013+
differences.Tables[4].Source.Indexes[0].Columns.Should().HaveCount(1);
1014+
differences.Tables[4].Source.Indexes[0].Columns[0].Name.Should().Be("SourceName");
1015+
differences.Tables[4].Source.Indexes[0].Columns[0].Position.Should().Be(1);
1016+
differences.Tables[4].Source.Indexes[0].Filter.Should().Be("([SourceName]='')");
1017+
differences.Tables[4].Source.Indexes[0].IncludedColumns.Should().HaveCount(1);
1018+
differences.Tables[4].Source.Indexes[0].IncludedColumns[0].Name.Should().Be("SourceForeignKeyId");
1019+
differences.Tables[4].Source.Indexes[0].IncludedColumns[0].Position.Should().Be(1);
1020+
differences.Tables[4].Source.Indexes[0].IsUnique.Should().BeFalse();
1021+
differences.Tables[4].Source.Indexes[0].Name.Should().Be("IndexSource");
1022+
differences.Tables[4].Source.Indexes[1].Columns.Should().HaveCount(1);
1023+
differences.Tables[4].Source.Indexes[1].Columns[0].Name.Should().Be("Id");
1024+
differences.Tables[4].Source.Indexes[1].Columns[0].Position.Should().Be(1);
1025+
differences.Tables[4].Source.Indexes[1].Filter.Should().BeNull();
1026+
differences.Tables[4].Source.Indexes[1].IncludedColumns.Should().HaveCount(0);
1027+
differences.Tables[4].Source.ForeignKeys.Should().HaveCount(1);
1028+
differences.Tables[4].Source.ForeignKeys[0].Columns.Should().HaveCount(1);
1029+
differences.Tables[4].Source.ForeignKeys[0].Columns[0].Name.Should().Be("SourceForeignKeyId");
1030+
differences.Tables[4].Source.ForeignKeys[0].Columns[0].Position.Should().Be(1);
1031+
differences.Tables[4].Source.ForeignKeys[0].DeleteAction.Should().Be("NO_ACTION");
1032+
differences.Tables[4].Source.ForeignKeys[0].Name.Should().Be("ForeignKeySource");
1033+
differences.Tables[4].Source.ForeignKeys[0].ReferencedTable.Should().Be("ReferencedTable");
1034+
differences.Tables[4].Source.ForeignKeys[0].UpdateAction.Should().Be("NO_ACTION");
1035+
differences.Tables[4].Source.Name.Should().Be("TableSource");
1036+
differences.Tables[4].Source.Schema.Should().Be("dbo");
1037+
differences.Tables[4].Source.PrimaryKey.Name.Should().Be("PrimaryKeySource");
1038+
differences.Tables[4].Source.PrimaryKey.Type.Should().Be("CLUSTERED");
1039+
differences.Tables[4].Source.Triggers.Should().HaveCount(1);
1040+
differences.Tables[4].Source.Triggers[0].Name.Should().Be("TriggerSource");
1041+
differences.Tables[4].Source.Triggers[0].Code.Should().Be("CREATE TRIGGER [TriggerSource]\r\n\tON [dbo].[TableSource]\r\n\tFOR DELETE, INSERT, UPDATE\r\n\tAS\r\n\tBEGIN\r\n\t\tSET NOCOUNT ON\r\n\tEND");
1042+
differences.Tables[4].Source.Triggers[0].IsInsteadOfTrigger.Should().BeFalse();
1043+
differences.Tables[4].Source.UniqueConstraints.Should().HaveCount(1);
1044+
differences.Tables[4].Source.UniqueConstraints[0].Columns.Should().HaveCount(1);
1045+
differences.Tables[4].Source.UniqueConstraints[0].Columns[0].Name.Should().Be("Id");
1046+
differences.Tables[4].Source.UniqueConstraints[0].Columns[0].Position.Should().Be(1);
1047+
differences.Tables[4].Source.UniqueConstraints[0].Name.Should().Be("UniqueConstraintSource");
1048+
differences.Tables[4].Source.UniqueConstraints[0].Type.Should().Be("NONCLUSTERED");
1049+
differences.Tables[4].Target.Should().BeNull();
1050+
differences.Tables[4].Triggers.Should().BeEmpty();
1051+
differences.Tables[4].Type.Should().Be(SqlObjectDifferenceType.MissingInTarget);
9771052

9781053
// UserTypes
9791054
differences.UserTypes.Should().HaveCount(3);

0 commit comments

Comments
 (0)