Skip to content

Commit acddcdd

Browse files
authored
Merge pull request #147 from MV10/id_unit_tests
added unit tests for Id column options
2 parents 0fb2dff + 4b34631 commit acddcdd

File tree

9 files changed

+130
-41
lines changed

9 files changed

+130
-41
lines changed

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/SqlTableCreator.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -76,9 +76,9 @@ private static string GetSqlFromDataTable(string tableName, DataTable table, str
7676

7777
i++;
7878
}
79-
sql.Append("))");
79+
sql.Append(")");
8080
}
81-
sql.AppendLine(" END");
81+
sql.AppendLine(") END");
8282
return sql.ToString();
8383
}
8484

test/Serilog.Sinks.MSSqlServer.Tests/Configuration/Microsoft.Extensions.Configuration/ConfigurationExtensions.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,12 @@
55
using Xunit;
66
using FluentAssertions;
77
using Microsoft.Extensions.Configuration;
8+
using System;
89

910
namespace Serilog.Sinks.MSSqlServer.Tests
1011
{
1112
[Collection("LogTest")]
12-
public class ConfigurationExtensions
13+
public class ConfigurationExtensions : IDisposable
1314
{
1415
static string ConnectionStringName = "NamedConnection";
1516
static string ColumnOptionsSection = "CustomColumnNames";
@@ -45,7 +46,6 @@ public void ConnectionStringByName()
4546
// should not throw
4647

4748
Log.CloseAndFlush();
48-
DatabaseFixture.DropTable();
4949
}
5050

5151
[Fact]
@@ -78,7 +78,10 @@ public void ColumnOptionsFromConfigSection()
7878

7979
infoSchema.Should().Contain(columns => columns.ColumnName == "Id");
8080
}
81+
}
8182

83+
public void Dispose()
84+
{
8285
DatabaseFixture.DropTable();
8386
}
8487
}

test/Serilog.Sinks.MSSqlServer.Tests/CustomStandardColumnNames.cs

Lines changed: 4 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Data.SqlClient;
4-
using System.Data.SqlTypes;
5-
using System.Diagnostics;
64
using System.IO;
75
using System.Linq;
86
using Dapper;
@@ -12,7 +10,7 @@
1210
namespace Serilog.Sinks.MSSqlServer.Tests
1311
{
1412
[Collection("LogTest")]
15-
public class CustomStandardColumnNames
13+
public class CustomStandardColumnNames : IDisposable
1614
{
1715
[Fact]
1816
public void CustomIdColumn()
@@ -41,8 +39,6 @@ public void CustomIdColumn()
4139
var isIdentity = conn.Query<IdentityQuery>($"SELECT COLUMNPROPERTY(object_id('{DatabaseFixture.LogTableName}'), '{customIdName}', 'IsIdentity') AS IsIdentity");
4240
isIdentity.Should().Contain(i => i.IsIdentity == 1);
4341
}
44-
45-
DatabaseFixture.DropTable();
4642
}
4743

4844
internal class IdentityQuery
@@ -76,8 +72,6 @@ public void DefaultIdColumn()
7672
var isIdentity = conn.Query<IdentityQuery>($"SELECT COLUMNPROPERTY(object_id('{DatabaseFixture.LogTableName}'), '{idColumnName}', 'IsIdentity') AS IsIdentity");
7773
isIdentity.Should().Contain(i => i.IsIdentity == 1);
7874
}
79-
80-
DatabaseFixture.DropTable();
8175
}
8276

8377
[Fact]
@@ -111,8 +105,6 @@ public void TableCreatedWithCustomNames()
111105

112106
infoSchema.Should().Contain(columns => columns.ColumnName == "Id");
113107
}
114-
115-
DatabaseFixture.DropTable();
116108
}
117109

118110
[Fact]
@@ -137,8 +129,6 @@ public void TableCreatedWithDefaultNames()
137129
infoSchema.Should().Contain(columns => columns.ColumnName == column);
138130
}
139131
}
140-
141-
DatabaseFixture.DropTable();
142132
}
143133

144134
[Fact]
@@ -178,8 +168,6 @@ public void WriteEventToCustomStandardColumns()
178168

179169
logEvents.Should().Contain(e => e.CustomMessage.Contains(loggingInformationMessage));
180170
}
181-
182-
DatabaseFixture.DropTable();
183171
}
184172

185173
[Fact]
@@ -212,8 +200,6 @@ public void WriteEventToDefaultStandardColumns()
212200

213201
logEvents.Should().Contain(e => e.Message.Contains(loggingInformationMessage));
214202
}
215-
216-
DatabaseFixture.DropTable();
217203
}
218204

219205
[Fact]
@@ -253,8 +239,6 @@ public void AuditEventToCustomStandardColumns()
253239

254240
logEvents.Should().Contain(e => e.CustomMessage.Contains(loggingInformationMessage));
255241
}
256-
257-
DatabaseFixture.DropTable();
258242
}
259243

260244
[Fact]
@@ -285,7 +269,10 @@ public void AuditEventToDefaultStandardColumns()
285269

286270
logEvents.Should().Contain(e => e.Message.Contains(loggingInformationMessage));
287271
}
272+
}
288273

274+
public void Dispose()
275+
{
289276
DatabaseFixture.DropTable();
290277
}
291278
}

test/Serilog.Sinks.MSSqlServer.Tests/DatabaseFixture.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,6 @@ private static void CreateDatabase()
8484
}
8585
}
8686

87-
[CollectionDefinition("LogTest")]
87+
[CollectionDefinition("LogTest", DisableParallelization = true)]
8888
public class PatientSecureFixtureCollection : ICollectionFixture<DatabaseFixture> { }
8989
}

test/Serilog.Sinks.MSSqlServer.Tests/InfoSchema.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3,5 +3,6 @@ namespace Serilog.Sinks.MSSqlServer.Tests
33
public class InfoSchema
44
{
55
public string ColumnName { get; set; }
6+
public string DataType { get; set; }
67
}
7-
}
8+
}

test/Serilog.Sinks.MSSqlServer.Tests/LevelAsEnum.cs

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System;
22
using System.Data.SqlClient;
3-
using System.Diagnostics;
43
using System.IO;
54
using Dapper;
65
using FluentAssertions;
@@ -10,7 +9,7 @@
109
namespace Serilog.Sinks.MSSqlServer.Tests
1110
{
1211
[Collection("LogTest")]
13-
public class LevelAsEnum
12+
public class LevelAsEnum : IDisposable
1413
{
1514
[Fact]
1615
public void CanStoreLevelAsEnum()
@@ -41,8 +40,6 @@ public void CanStoreLevelAsEnum()
4140

4241
logEvents.Should().Contain(e => e.Message.Contains(loggingInformationMessage) && e.Level == 2);
4342
}
44-
45-
DatabaseFixture.DropTable();
4643
}
4744

4845
[Fact]
@@ -105,8 +102,6 @@ public void AuditCanStoreLevelAsEnum()
105102

106103
logEvents.Should().Contain(e => e.Message.Contains(loggingInformationMessage) && e.Level == 2);
107104
}
108-
109-
DatabaseFixture.DropTable();
110105
}
111106

112107
[Fact]
@@ -136,7 +131,10 @@ public void AuditCanStoreLevelAsString()
136131

137132
logEvents.Should().Contain(e => e.Message.Contains(loggingInformationMessage) && e.Level == LogEventLevel.Information.ToString());
138133
}
134+
}
139135

136+
public void Dispose()
137+
{
140138
DatabaseFixture.DropTable();
141139
}
142140
}

test/Serilog.Sinks.MSSqlServer.Tests/TestMiscFeatures.cs

Lines changed: 105 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,14 +2,15 @@
22
using System.Collections.Generic;
33
using System.Data;
44
using System.Data.SqlClient;
5+
using System.Linq;
56
using Dapper;
67
using FluentAssertions;
78
using Xunit;
89

910
namespace Serilog.Sinks.MSSqlServer.Tests
1011
{
1112
[Collection("LogTest")]
12-
public class TestMiscFeatures
13+
public class TestMiscFeatures : IDisposable
1314
{
1415
internal class LogEventColumns
1516
{
@@ -59,7 +60,110 @@ public void LogEventExcludeAdditionalProperties()
5960
logEvents.Should().Contain(e => e.LogEvent.Contains("AValue"));
6061
logEvents.Should().NotContain(e => e.LogEvent.Contains("BValue"));
6162
}
63+
}
64+
65+
[Fact]
66+
public void ExcludeIdColumn()
67+
{
68+
// arrange
69+
var columnOptions = new ColumnOptions();
70+
columnOptions.Store.Remove(StandardColumn.Id);
71+
72+
Log.Logger = new LoggerConfiguration()
73+
.WriteTo.MSSqlServer
74+
(
75+
connectionString: DatabaseFixture.LogEventsConnectionString,
76+
tableName: DatabaseFixture.LogTableName,
77+
columnOptions: columnOptions,
78+
autoCreateSqlTable: true,
79+
batchPostingLimit: 1,
80+
period: TimeSpan.FromSeconds(10)
81+
)
82+
.CreateLogger();
83+
Log.CloseAndFlush();
84+
85+
// assert
86+
using (var conn = new SqlConnection(DatabaseFixture.MasterConnectionString))
87+
{
88+
conn.Execute($"use {DatabaseFixture.Database}");
89+
var query = conn.Query<InfoSchema>($@"SELECT COLUMN_NAME AS ColumnName FROM {DatabaseFixture.Database}.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{DatabaseFixture.LogTableName}'");
90+
var results = query as InfoSchema[] ?? query.ToArray();
91+
92+
results.Should().Contain(x => x.ColumnName == StandardColumn.Properties.ToString());
93+
results.Should().NotContain(x => x.ColumnName == StandardColumn.Id.ToString());
94+
}
95+
}
6296

97+
[Fact]
98+
public void BigIntIdColumn()
99+
{
100+
// arrange
101+
var columnOptions = new ColumnOptions();
102+
columnOptions.Id.BigInt = true;
103+
104+
Log.Logger = new LoggerConfiguration()
105+
.WriteTo.MSSqlServer
106+
(
107+
connectionString: DatabaseFixture.LogEventsConnectionString,
108+
tableName: DatabaseFixture.LogTableName,
109+
columnOptions: columnOptions,
110+
autoCreateSqlTable: true,
111+
batchPostingLimit: 1,
112+
period: TimeSpan.FromSeconds(10)
113+
)
114+
.CreateLogger();
115+
Log.CloseAndFlush();
116+
117+
// assert
118+
using (var conn = new SqlConnection(DatabaseFixture.MasterConnectionString))
119+
{
120+
conn.Execute($"use {DatabaseFixture.Database}");
121+
var query = conn.Query<InfoSchema>($@"SELECT DATA_TYPE AS DataType FROM {DatabaseFixture.Database}.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{DatabaseFixture.LogTableName}' AND COLUMN_NAME = '{StandardColumn.Id.ToString()}'");
122+
var results = query as InfoSchema[] ?? query.ToArray();
123+
124+
results.Should().Contain(x => x.DataType == "bigint");
125+
}
126+
}
127+
128+
internal class SysObjectQuery
129+
{
130+
public int IndexType { get; set; }
131+
}
132+
133+
[Fact]
134+
public void NonClusteredPrimaryKey()
135+
{
136+
// arrange
137+
var columnOptions = new ColumnOptions();
138+
columnOptions.Id.NonClusteredIndex = true;
139+
140+
Log.Logger = new LoggerConfiguration()
141+
.WriteTo.MSSqlServer
142+
(
143+
connectionString: DatabaseFixture.LogEventsConnectionString,
144+
tableName: DatabaseFixture.LogTableName,
145+
columnOptions: columnOptions,
146+
autoCreateSqlTable: true,
147+
batchPostingLimit: 1,
148+
period: TimeSpan.FromSeconds(10)
149+
)
150+
.CreateLogger();
151+
Log.CloseAndFlush();
152+
153+
// assert
154+
using (var conn = new SqlConnection(DatabaseFixture.LogEventsConnectionString))
155+
{
156+
conn.Execute($"use {DatabaseFixture.Database}");
157+
var query = conn.Query<SysObjectQuery>($@"SELECT P.OBJECT_ID AS IndexType FROM SYS.OBJECTS O INNER JOIN SYS.PARTITIONS P ON P.OBJECT_ID = O.OBJECT_ID WHERE NAME = '{DatabaseFixture.LogTableName}'");
158+
var results = query as SysObjectQuery[] ?? query.ToArray();
159+
160+
// https://stackoverflow.com/a/25503189/152997
161+
results.Should().Contain(x => x.IndexType > 1);
162+
}
163+
}
164+
165+
public void Dispose()
166+
{
63167
DatabaseFixture.DropTable();
64168
}
65169
}

test/Serilog.Sinks.MSSqlServer.Tests/TestPropertiesColumnFiltering.cs

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,13 @@
11
using Dapper;
22
using FluentAssertions;
3+
using System;
34
using System.Data.SqlClient;
45
using Xunit;
56

67
namespace Serilog.Sinks.MSSqlServer.Tests
78
{
89
[Collection("LogTest")]
9-
public class TestPropertiesColumnFiltering
10+
public class TestPropertiesColumnFiltering : IDisposable
1011
{
1112
internal class PropertiesColumns
1213
{
@@ -46,8 +47,6 @@ public void FilteredProperties()
4647
logEvents.Should().Contain(e => e.Properties.Contains("AValue"));
4748
logEvents.Should().NotContain(e => e.Properties.Contains("BValue"));
4849
}
49-
50-
DatabaseFixture.DropTable();
5150
}
5251

5352
[Fact]
@@ -83,7 +82,10 @@ public void FilteredPropertiesWhenAuditing()
8382
logEvents.Should().Contain(e => e.Properties.Contains("AValue"));
8483
logEvents.Should().NotContain(e => e.Properties.Contains("BValue"));
8584
}
85+
}
8686

87+
public void Dispose()
88+
{
8789
DatabaseFixture.DropTable();
8890
}
8991
}

0 commit comments

Comments
 (0)