Skip to content

Commit cc8b764

Browse files
committed
Added all unit tests and integration test for legacy- and SinkOptions based-interface wherever reasonable.
1 parent 56f624b commit cc8b764

File tree

13 files changed

+760
-128
lines changed

13 files changed

+760
-128
lines changed

src/Serilog.Sinks.MSSqlServer/Configuration/Implementations/Microsoft.Extensions.Configuration/MicrosoftExtensionsSinkOptionsProvider.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System;
2+
using System.Globalization;
23
using Microsoft.Extensions.Configuration;
34
using Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Options;
45

@@ -30,7 +31,7 @@ private void ReadTableOptions(IConfigurationSection config, SinkOptions sinkOpti
3031
private void ReadBatchSettings(IConfigurationSection config, SinkOptions sinkOptions)
3132
{
3233
SetProperty.IfNotNull<int>(config["batchPostingLimit"], val => sinkOptions.BatchPostingLimit = val);
33-
SetProperty.IfNotNull<TimeSpan>(config["batchPeriod"], val => sinkOptions.BatchPeriod = val);
34+
SetProperty.IfNotNull<string>(config["batchPeriod"], val => sinkOptions.BatchPeriod = TimeSpan.Parse(val, CultureInfo.InvariantCulture));
3435
}
3536

3637
private void ReadAzureManagedIdentitiesOptions(IConfigurationSection config, SinkOptions sinkOptions)

test/Serilog.Sinks.MSSqlServer.Tests/Configuration/Extensions/Hybrid/ConfigurationExtensionsTests.cs

Lines changed: 12 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
using System.Collections.Generic;
2-
using System.Data.SqlClient;
3-
using System.Linq;
4-
using Dapper;
5-
using FluentAssertions;
62
using Microsoft.Extensions.Configuration;
73
using Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Options;
84
using Serilog.Sinks.MSSqlServer.Tests.TestUtils;
@@ -63,10 +59,11 @@ public void ConnectionStringByNameFromConfigSinkOptionsInterface()
6359
[Fact]
6460
public void ColumnOptionsFromConfigSectionLegacyInterface()
6561
{
62+
// Arrange
6663
var standardNames = new List<string> { "CustomMessage", "CustomMessageTemplate", "CustomLevel", "CustomTimeStamp", "CustomException", "CustomProperties" };
67-
6864
var columnOptionsSection = TestConfiguration().GetSection(_columnOptionsSection);
6965

66+
// Act
7067
var loggerConfiguration = new LoggerConfiguration();
7168
Log.Logger = loggerConfiguration.WriteTo.MSSqlServer(
7269
connectionString: DatabaseFixture.LogEventsConnectionString,
@@ -76,16 +73,18 @@ public void ColumnOptionsFromConfigSectionLegacyInterface()
7673
.CreateLogger();
7774
Log.CloseAndFlush();
7875

79-
VerifyDatabaseSchema(standardNames);
76+
// Assert
77+
VerifyDatabaseColumnsWereCreated(standardNames);
8078
}
8179

8280
[Fact]
8381
public void ColumnOptionsFromConfigSectionSinkOptionsInterface()
8482
{
83+
// Arrange
8584
var standardNames = new List<string> { "CustomMessage", "CustomMessageTemplate", "CustomLevel", "CustomTimeStamp", "CustomException", "CustomProperties" };
86-
8785
var columnOptionsSection = TestConfiguration().GetSection(_columnOptionsSection);
8886

87+
// Act
8988
var loggerConfiguration = new LoggerConfiguration();
9089
Log.Logger = loggerConfiguration.WriteTo.MSSqlServer(
9190
connectionString: DatabaseFixture.LogEventsConnectionString,
@@ -98,17 +97,19 @@ public void ColumnOptionsFromConfigSectionSinkOptionsInterface()
9897
.CreateLogger();
9998
Log.CloseAndFlush();
10099

101-
VerifyDatabaseSchema(standardNames);
100+
// Assert
101+
VerifyDatabaseColumnsWereCreated(standardNames);
102102
}
103103

104104
[Fact]
105105
public void SinkOptionsFromConfigSection()
106106
{
107+
// Arrange
107108
var standardNames = new List<string> { "CustomMessage", "CustomMessageTemplate", "CustomLevel", "CustomTimeStamp", "CustomException", "CustomProperties" };
108-
109109
var columnOptionsSection = TestConfiguration().GetSection(_columnOptionsSection);
110110
var sinkOptionsSection = TestConfiguration().GetSection(_sinkOptionsSection);
111111

112+
// Act
112113
var loggerConfiguration = new LoggerConfiguration();
113114
Log.Logger = loggerConfiguration.WriteTo.MSSqlServer(
114115
connectionString: DatabaseFixture.LogEventsConnectionString,
@@ -117,23 +118,8 @@ public void SinkOptionsFromConfigSection()
117118
.CreateLogger();
118119
Log.CloseAndFlush();
119120

120-
VerifyDatabaseSchema(standardNames);
121-
}
122-
123-
private static void VerifyDatabaseSchema(List<string> standardNames)
124-
{
125-
using (var conn = new SqlConnection(DatabaseFixture.LogEventsConnectionString))
126-
{
127-
var logEvents = conn.Query<InfoSchema>($@"SELECT COLUMN_NAME AS ColumnName FROM {DatabaseFixture.Database}.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{DatabaseFixture.LogTableName}'");
128-
var infoSchema = logEvents as InfoSchema[] ?? logEvents.ToArray();
129-
130-
foreach (var column in standardNames)
131-
{
132-
infoSchema.Should().Contain(columns => columns.ColumnName == column);
133-
}
134-
135-
infoSchema.Should().Contain(columns => columns.ColumnName == "Id");
136-
}
121+
// Assert
122+
VerifyDatabaseColumnsWereCreated(standardNames);
137123
}
138124

139125
private IConfiguration TestConfiguration() =>

test/Serilog.Sinks.MSSqlServer.Tests/Configuration/Extensions/Hybrid/LoggerConfigurationMSSqlServerExtensionsTests.cs

Lines changed: 136 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -353,6 +353,74 @@ public void MSSqlServerDoesNotCallApplySystemConfigurationGetColumnOptionsWhenNo
353353
Times.Never);
354354
}
355355

356+
[Fact]
357+
public void MSSqlServerCallsApplySystemConfigurationGetSinkOptions()
358+
{
359+
// Arrange
360+
var sinnkOptions = new SinkOptions();
361+
var systemConfigSection = new MSSqlServerConfigurationSection();
362+
_applySystemConfigurationMock.Setup(c => c.GetSinkConfigurationSection(It.IsAny<string>()))
363+
.Returns(systemConfigSection);
364+
var sinkFactoryMock = new Mock<IMSSqlServerSinkFactory>();
365+
366+
// Act
367+
_loggerConfiguration.WriteTo.MSSqlServerInternal(
368+
connectionString: "TestConnectionString",
369+
sinkOptions: sinnkOptions,
370+
columnOptions: new ColumnOptions(),
371+
applySystemConfiguration: _applySystemConfigurationMock.Object,
372+
applyMicrosoftExtensionsConfiguration: _applyMicrosoftExtensionsConfigurationMock.Object,
373+
sinkFactory: sinkFactoryMock.Object);
374+
375+
// Assert
376+
_applySystemConfigurationMock.Verify(c => c.ConfigureSinkOptions(systemConfigSection, sinnkOptions),
377+
Times.Once);
378+
}
379+
380+
[Fact]
381+
public void MSSqlServerCallsSinkFactoryWithSinkOptionsFromSystemConfig()
382+
{
383+
// Arrange
384+
var configSinkOptions = new SinkOptions();
385+
_applySystemConfigurationMock.Setup(c => c.GetSinkConfigurationSection(It.IsAny<string>()))
386+
.Returns(new MSSqlServerConfigurationSection());
387+
_applySystemConfigurationMock.Setup(c => c.ConfigureSinkOptions(It.IsAny<MSSqlServerConfigurationSection>(), It.IsAny<SinkOptions>()))
388+
.Returns(configSinkOptions);
389+
var sinkFactoryMock = new Mock<IMSSqlServerSinkFactory>();
390+
391+
// Act
392+
_loggerConfiguration.WriteTo.MSSqlServerInternal(
393+
connectionString: "TestConnectionString",
394+
sinkOptions: new SinkOptions { TableName = "TestTableName" },
395+
columnOptions: new ColumnOptions(),
396+
applySystemConfiguration: _applySystemConfigurationMock.Object,
397+
applyMicrosoftExtensionsConfiguration: _applyMicrosoftExtensionsConfigurationMock.Object,
398+
sinkFactory: sinkFactoryMock.Object);
399+
400+
// Assert
401+
sinkFactoryMock.Verify(f => f.Create(It.IsAny<string>(), It.IsAny<SinkOptions>(), It.IsAny<IFormatProvider>(),
402+
It.IsAny<ColumnOptions>(), It.IsAny<ITextFormatter>()), Times.Once);
403+
}
404+
405+
[Fact]
406+
public void MSSqlServerDoesNotCallApplySystemConfigurationGetSinkOptionsWhenNotUsingSystemConfig()
407+
{
408+
// Arrange
409+
var sinkFactoryMock = new Mock<IMSSqlServerSinkFactory>();
410+
411+
// Act
412+
_loggerConfiguration.WriteTo.MSSqlServerInternal(
413+
connectionString: "TestConnectionString",
414+
sinkOptions: new SinkOptions { TableName = "TestTableName" },
415+
applySystemConfiguration: _applySystemConfigurationMock.Object,
416+
applyMicrosoftExtensionsConfiguration: _applyMicrosoftExtensionsConfigurationMock.Object,
417+
sinkFactory: sinkFactoryMock.Object);
418+
419+
// Assert
420+
_applySystemConfigurationMock.Verify(c => c.ConfigureSinkOptions(It.IsAny<MSSqlServerConfigurationSection>(), It.IsAny<SinkOptions>()),
421+
Times.Never);
422+
}
423+
356424
[Fact]
357425
public void MSSqlServerCallsSinkFactoryWithSuppliedParameters()
358426
{
@@ -712,6 +780,74 @@ public void MSSqlServerAuditDoesNotCallApplySystemConfigurationGetColumnOptionsW
712780
Times.Never);
713781
}
714782

783+
[Fact]
784+
public void MSSqlServerAuditCallsApplySystemConfigurationGetSinkOptions()
785+
{
786+
// Arrange
787+
var sinkOptions = new SinkOptions();
788+
var systemConfigSection = new MSSqlServerConfigurationSection();
789+
_applySystemConfigurationMock.Setup(c => c.GetSinkConfigurationSection(It.IsAny<string>()))
790+
.Returns(systemConfigSection);
791+
var auditSinkFactoryMock = new Mock<IMSSqlServerAuditSinkFactory>();
792+
793+
// Act
794+
_loggerConfiguration.AuditTo.MSSqlServerInternal(
795+
connectionString: "TestConnectionString",
796+
sinkOptions: sinkOptions,
797+
columnOptions: new ColumnOptions(),
798+
applySystemConfiguration: _applySystemConfigurationMock.Object,
799+
applyMicrosoftExtensionsConfiguration: _applyMicrosoftExtensionsConfigurationMock.Object,
800+
auditSinkFactory: auditSinkFactoryMock.Object);
801+
802+
// Assert
803+
_applySystemConfigurationMock.Verify(c => c.ConfigureSinkOptions(systemConfigSection, sinkOptions),
804+
Times.Once);
805+
}
806+
807+
[Fact]
808+
public void MSSqlServerAuditCallsSinkFactoryWithSinkOptionsFromSystemConfig()
809+
{
810+
// Arrange
811+
var configSinkOptions = new SinkOptions();
812+
_applySystemConfigurationMock.Setup(c => c.GetSinkConfigurationSection(It.IsAny<string>()))
813+
.Returns(new MSSqlServerConfigurationSection());
814+
_applySystemConfigurationMock.Setup(c => c.ConfigureSinkOptions(It.IsAny<MSSqlServerConfigurationSection>(), It.IsAny<SinkOptions>()))
815+
.Returns(configSinkOptions);
816+
var auditSinkFactoryMock = new Mock<IMSSqlServerAuditSinkFactory>();
817+
818+
// Act
819+
_loggerConfiguration.AuditTo.MSSqlServerInternal(
820+
connectionString: "TestConnectionString",
821+
sinkOptions: new SinkOptions { TableName = "TestTableName" },
822+
columnOptions: new ColumnOptions(),
823+
applySystemConfiguration: _applySystemConfigurationMock.Object,
824+
applyMicrosoftExtensionsConfiguration: _applyMicrosoftExtensionsConfigurationMock.Object,
825+
auditSinkFactory: auditSinkFactoryMock.Object);
826+
827+
// Assert
828+
auditSinkFactoryMock.Verify(f => f.Create(It.IsAny<string>(), configSinkOptions, It.IsAny<IFormatProvider>(),
829+
It.IsAny<ColumnOptions>(), It.IsAny<ITextFormatter>()), Times.Once);
830+
}
831+
832+
[Fact]
833+
public void MSSqlServerAuditDoesNotCallApplySystemConfigurationGetSinkOptionsWhenNotUsingSystemConfig()
834+
{
835+
// Arrange
836+
var auditSinkFactoryMock = new Mock<IMSSqlServerAuditSinkFactory>();
837+
838+
// Act
839+
_loggerConfiguration.AuditTo.MSSqlServerInternal(
840+
connectionString: "TestConnectionString",
841+
sinkOptions: new SinkOptions { TableName = "TestTableName" },
842+
applySystemConfiguration: _applySystemConfigurationMock.Object,
843+
applyMicrosoftExtensionsConfiguration: _applyMicrosoftExtensionsConfigurationMock.Object,
844+
auditSinkFactory: auditSinkFactoryMock.Object);
845+
846+
// Assert
847+
_applySystemConfigurationMock.Verify(c => c.ConfigureSinkOptions(It.IsAny<MSSqlServerConfigurationSection>(), It.IsAny<SinkOptions>()),
848+
Times.Never);
849+
}
850+
715851
[Fact]
716852
public void MSSqlServerAuditCallsSinkFactoryWithSuppliedParameters()
717853
{

test/Serilog.Sinks.MSSqlServer.Tests/Configuration/Extensions/System.Configuration/ConfigurationExtensionsTests.cs

Lines changed: 4 additions & 30 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,4 @@
11
using System.Collections.Generic;
2-
using System.Data.SqlClient;
3-
using System.Linq;
4-
using Dapper;
5-
using FluentAssertions;
62
using Serilog.Sinks.MSSqlServer.Configuration.Factories;
73
using Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Options;
84
using Serilog.Sinks.MSSqlServer.Tests.TestUtils;
@@ -76,7 +72,7 @@ public void CustomStandardColumnNames()
7672
.CreateLogger();
7773
Log.CloseAndFlush();
7874

79-
VerifyDatabaseSchema(standardNames);
75+
VerifyDatabaseColumnsWereCreated(standardNames);
8076
}
8177

8278
[Fact]
@@ -93,7 +89,7 @@ public void SinkOptionsFromConfig()
9389
.CreateLogger();
9490
Log.CloseAndFlush();
9591

96-
VerifyDatabaseSchema(standardNames);
92+
VerifyDatabaseColumnsWereCreated(standardNames);
9793
}
9894

9995
[Fact]
@@ -109,30 +105,8 @@ public void CustomizedColumnListFromConfig()
109105
.CreateLogger();
110106
Log.CloseAndFlush();
111107

112-
using (var conn = new SqlConnection(DatabaseFixture.LogEventsConnectionString))
113-
{
114-
var logEvents = conn.Query<InfoSchema>($@"SELECT COLUMN_NAME AS ColumnName FROM {DatabaseFixture.Database}.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{DatabaseFixture.LogTableName}'");
115-
var infoSchema = logEvents as InfoSchema[] ?? logEvents.ToArray();
116-
117-
infoSchema.Should().Contain(columns => columns.ColumnName == "LogEvent");
118-
infoSchema.Should().Contain(columns => columns.ColumnName == "CustomColumn");
119-
}
120-
}
121-
122-
private static void VerifyDatabaseSchema(List<string> standardNames)
123-
{
124-
using (var conn = new SqlConnection(DatabaseFixture.LogEventsConnectionString))
125-
{
126-
var logEvents = conn.Query<InfoSchema>($@"SELECT COLUMN_NAME AS ColumnName FROM {DatabaseFixture.Database}.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{DatabaseFixture.LogTableName}'");
127-
var infoSchema = logEvents as InfoSchema[] ?? logEvents.ToArray();
128-
129-
foreach (var column in standardNames)
130-
{
131-
infoSchema.Should().Contain(columns => columns.ColumnName == column);
132-
}
133-
134-
infoSchema.Should().Contain(columns => columns.ColumnName == "Id");
135-
}
108+
// Assert
109+
VerifyDatabaseColumnsWereCreated(new List<string> { "LogEvent", "CustomColumn" });
136110
}
137111
}
138112
}

0 commit comments

Comments
 (0)