Skip to content

Commit 5dd84a7

Browse files
committed
* Added two tests for MSSqlServerSinkTraits to check if SqlTableCreator is called correctly.
* Fixed an extra empty line in MSSqlServerSinkTraits and a warning in AppConfigDemo sample.
1 parent eb04a97 commit 5dd84a7

File tree

4 files changed

+97
-77
lines changed

4 files changed

+97
-77
lines changed

sample/AppConfigDemo/AppConfigDemo.csproj

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,6 @@
6767
</ItemGroup>
6868
<ItemGroup>
6969
<Compile Include="Program.cs" />
70-
<Compile Include="Properties\AssemblyInfo.cs" />
7170
</ItemGroup>
7271
<ItemGroup>
7372
<None Include="App.config" />
@@ -79,5 +78,8 @@
7978
<Name>Serilog.Sinks.MSSqlServer</Name>
8079
</ProjectReference>
8180
</ItemGroup>
81+
<ItemGroup>
82+
<Folder Include="Properties\" />
83+
</ItemGroup>
8284
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
8385
</Project>

sample/AppConfigDemo/Properties/AssemblyInfo.cs

Lines changed: 0 additions & 36 deletions
This file was deleted.

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/MSSqlServerSinkTraits.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,6 +308,5 @@ private DataTable CreateDataTable()
308308

309309
return eventsTable;
310310
}
311-
312311
}
313312
}

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

Lines changed: 94 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@
22
using Serilog.Events;
33
using Serilog.Formatting;
44
using Serilog.Parsing;
5+
using Serilog.Sinks.MSSqlServer.Platform;
56
using System;
67
using System.Collections.Generic;
78
using System.Data;
@@ -15,22 +16,25 @@ namespace Serilog.Sinks.MSSqlServer.Tests.Sinks.MSSqlServer
1516
[Collection("LogTest")]
1617
public class MSSqlServerSinkTraitsTests
1718
{
18-
private MSSqlServerSinkTraits traits;
19-
private LogEvent logEvent;
19+
private string _connectionString = "connectionString";
20+
private string _tableName = "tableName";
21+
private string _schemaName = "schemaName";
22+
private MSSqlServerSinkTraits _sut;
2023

2124
[Trait("Bugfix", "#187")]
2225
[Fact]
2326
public void GetColumnsAndValuesCreatesTimeStampOfTypeDateTimeAccordingToColumnOptions()
2427
{
25-
// arrange
28+
// Arrange
2629
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
2730
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00
28-
SetupTest(options, testDateTimeOffset);
31+
var logEvent = CreateLogEvent(testDateTimeOffset);
32+
SetupSut(options);
2933

30-
// act
31-
var columns = traits.GetColumnsAndValues(logEvent);
34+
// Act
35+
var columns = _sut.GetColumnsAndValues(logEvent);
3236

33-
// assert
37+
// Assert
3438
var timeStampColumn = columns.Single(c => c.Key == options.TimeStamp.ColumnName);
3539
Assert.IsType<DateTime>(timeStampColumn.Value);
3640
Assert.Equal(testDateTimeOffset.Hour, ((DateTime)timeStampColumn.Value).Hour);
@@ -40,18 +44,19 @@ public void GetColumnsAndValuesCreatesTimeStampOfTypeDateTimeAccordingToColumnOp
4044
[Fact]
4145
public void GetColumnsAndValuesCreatesUtcConvertedTimeStampOfTypeDateTimeAccordingToColumnOptions()
4246
{
43-
// arrange
47+
// Arrange
4448
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
4549
{
4650
TimeStamp = { ConvertToUtc = true }
4751
};
4852
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00
49-
SetupTest(options, testDateTimeOffset);
53+
var logEvent = CreateLogEvent(testDateTimeOffset);
54+
SetupSut(options);
5055

51-
// act
52-
var columns = traits.GetColumnsAndValues(logEvent);
56+
// Act
57+
var columns = _sut.GetColumnsAndValues(logEvent);
5358

54-
// assert
59+
// Assert
5560
var timeStampColumn = columns.Single(c => c.Key == options.TimeStamp.ColumnName);
5661
Assert.IsType<DateTime>(timeStampColumn.Value);
5762
Assert.Equal(testDateTimeOffset.Hour - 1, ((DateTime)timeStampColumn.Value).Hour);
@@ -61,18 +66,19 @@ public void GetColumnsAndValuesCreatesUtcConvertedTimeStampOfTypeDateTimeAccordi
6166
[Fact]
6267
public void GetColumnsAndValuesCreatesTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions()
6368
{
64-
// arrange
69+
// Arrange
6570
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
6671
{
6772
TimeStamp = { DataType = SqlDbType.DateTimeOffset }
6873
};
6974
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00
70-
SetupTest(options, testDateTimeOffset);
75+
var logEvent = CreateLogEvent(testDateTimeOffset);
76+
SetupSut(options);
7177

72-
// act
73-
var columns = traits.GetColumnsAndValues(logEvent);
78+
// Act
79+
var columns = _sut.GetColumnsAndValues(logEvent);
7480

75-
// assert
81+
// Assert
7682
var timeStampColumn = columns.Single(c => c.Key == options.TimeStamp.ColumnName);
7783
Assert.IsType<DateTimeOffset>(timeStampColumn.Value);
7884
var timeStampColumnOffset = (DateTimeOffset)timeStampColumn.Value;
@@ -84,18 +90,19 @@ public void GetColumnsAndValuesCreatesTimeStampOfTypeDateTimeOffsetAccordingToCo
8490
[Fact]
8591
public void GetColumnsAndValuesCreatesUtcConvertedTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions()
8692
{
87-
// arrange
93+
// Arrange
8894
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
8995
{
9096
TimeStamp = { DataType = SqlDbType.DateTimeOffset, ConvertToUtc = true }
9197
};
9298
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00
93-
SetupTest(options, testDateTimeOffset);
99+
var logEvent = CreateLogEvent(testDateTimeOffset);
100+
SetupSut(options);
94101

95-
// act
96-
var columns = traits.GetColumnsAndValues(logEvent);
102+
// Act
103+
var columns = _sut.GetColumnsAndValues(logEvent);
97104

98-
// assert
105+
// Assert
99106
var timeStampColumn = columns.Single(c => c.Key == options.TimeStamp.ColumnName);
100107
Assert.IsType<DateTimeOffset>(timeStampColumn.Value);
101108
var timeStampColumnOffset = (DateTimeOffset)timeStampColumn.Value;
@@ -106,51 +113,99 @@ public void GetColumnsAndValuesCreatesUtcConvertedTimeStampOfTypeDateTimeOffsetA
106113
[Fact]
107114
public void GetColumnsAndValuesWhenCalledWithCustomFormatterRendersLogEventPropertyUsingCustomFormatter()
108115
{
109-
// arrange
116+
// Arrange
110117
const string testLogEventContent = "Content of LogEvent";
111118
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
112119
options.Store.Add(StandardColumn.LogEvent);
113120
var logEventFormatterMock = new Mock<ITextFormatter>();
114121
logEventFormatterMock.Setup(f => f.Format(It.IsAny<LogEvent>(), It.IsAny<TextWriter>()))
115122
.Callback<LogEvent, TextWriter>((e, w) => w.Write(testLogEventContent));
116-
SetupTest(options, DateTimeOffset.UtcNow, logEventFormatterMock.Object);
123+
var logEvent = CreateLogEvent(DateTimeOffset.UtcNow);
124+
SetupSut(options, logEventFormatter: logEventFormatterMock.Object);
117125

118-
// act
119-
var columns = traits.GetColumnsAndValues(logEvent);
126+
// Act
127+
var columns = _sut.GetColumnsAndValues(logEvent);
120128

121-
// assert
129+
// Assert
122130
var logEventColumn = columns.Single(c => c.Key == options.LogEvent.ColumnName);
123131
Assert.Equal(testLogEventContent, logEventColumn.Value);
124132
}
125133

126134
[Fact]
127135
public void GetColumnsAndValuesWhenCalledWithoutFormatterRendersLogEventPropertyUsingInternalJsonFormatter()
128136
{
129-
// arrange
137+
// Arrange
130138
const string expectedLogEventContent =
131139
"{\"TimeStamp\":\"2020-01-01T09:00:00.0000000\",\"Level\":\"Information\",\"Message\":\"\",\"MessageTemplate\":\"\"}";
132140
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
133141
options.Store.Add(StandardColumn.LogEvent);
134142
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, TimeSpan.Zero);
135-
SetupTest(options, testDateTimeOffset, null);
143+
var logEvent = CreateLogEvent(testDateTimeOffset);
144+
SetupSut(options);
136145

137-
// act
138-
var columns = traits.GetColumnsAndValues(logEvent);
146+
// Act
147+
var columns = _sut.GetColumnsAndValues(logEvent);
139148

140-
// assert
149+
// Assert
141150
var logEventColumn = columns.Single(c => c.Key == options.LogEvent.ColumnName);
142151
Assert.Equal(expectedLogEventContent, logEventColumn.Value);
143152
}
144153

145-
private void SetupTest(
146-
Serilog.Sinks.MSSqlServer.ColumnOptions options,
147-
DateTimeOffset testDateTimeOffset,
148-
ITextFormatter logEventFormatter = null)
154+
[Fact]
155+
public void InitializeWithAutoCreateSqlTableCallsSqlTableCreator()
149156
{
150-
this.traits = new MSSqlServerSinkTraits("connectionString", "tableName", "schemaName",
151-
options, CultureInfo.InvariantCulture, false, logEventFormatter);
152-
this.logEvent = new LogEvent(testDateTimeOffset, LogEventLevel.Information, null,
157+
// Arrange
158+
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
159+
var sqlTableCreatorMock = new Mock<ISqlTableCreator>();
160+
161+
// Act
162+
SetupSut(options, autoCreateSqlTable: true, sqlTableCreator: sqlTableCreatorMock.Object);
163+
164+
// Assert
165+
sqlTableCreatorMock.Verify(c => c.CreateTable(_connectionString, _schemaName, _tableName,
166+
It.IsAny<DataTable>(), options),
167+
Times.Once);
168+
}
169+
170+
[Fact]
171+
public void InitializeWithoutAutoCreateSqlTableDoesNotCallsSqlTableCreator()
172+
{
173+
// Arrange
174+
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
175+
var sqlTableCreatorMock = new Mock<ISqlTableCreator>();
176+
177+
// Act
178+
SetupSut(options, autoCreateSqlTable: false, sqlTableCreator: sqlTableCreatorMock.Object);
179+
180+
// Assert
181+
sqlTableCreatorMock.Verify(c => c.CreateTable(It.IsAny<string>(), It.IsAny<string>(), It.IsAny<string>(),
182+
It.IsAny<DataTable>(), It.IsAny<Serilog.Sinks.MSSqlServer.ColumnOptions>()),
183+
Times.Never);
184+
}
185+
186+
private static LogEvent CreateLogEvent(DateTimeOffset testDateTimeOffset)
187+
{
188+
return new LogEvent(testDateTimeOffset, LogEventLevel.Information, null,
153189
new MessageTemplate(new List<MessageTemplateToken>()), new List<LogEventProperty>());
154190
}
191+
192+
private void SetupSut(
193+
Serilog.Sinks.MSSqlServer.ColumnOptions options,
194+
bool autoCreateSqlTable = false,
195+
ITextFormatter logEventFormatter = null,
196+
ISqlTableCreator sqlTableCreator = null)
197+
{
198+
if (sqlTableCreator == null)
199+
{
200+
_sut = new MSSqlServerSinkTraits(_connectionString, _tableName, _schemaName,
201+
options, CultureInfo.InvariantCulture, autoCreateSqlTable, logEventFormatter);
202+
}
203+
else
204+
{
205+
// Internal constructor to use ISqlTableCreator mock
206+
_sut = new MSSqlServerSinkTraits(_connectionString, _tableName, _schemaName,
207+
options, CultureInfo.InvariantCulture, autoCreateSqlTable, logEventFormatter, sqlTableCreator);
208+
}
209+
}
155210
}
156211
}

0 commit comments

Comments
 (0)