Skip to content

Commit 6d9c2ac

Browse files
committed
Added almost all unit for StandardColumnDataGenerator.
1 parent c90b9e0 commit 6d9c2ac

File tree

3 files changed

+251
-20
lines changed

3 files changed

+251
-20
lines changed

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Output/StandardColumnDataGenerator.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -70,15 +70,21 @@ private KeyValuePair<string, object> GetTimeStampStandardColumnNameAndValue(LogE
7070

7171
private string RenderLogEventColumn(LogEvent logEvent)
7272
{
73+
LogEvent preparedLogEvent;
7374
if (_columnOptions.LogEvent.ExcludeAdditionalProperties)
7475
{
7576
var filteredProperties = logEvent.Properties.Where(p => !_additionalColumnPropertyNames.Contains(p.Key));
76-
logEvent = new LogEvent(logEvent.Timestamp, logEvent.Level, logEvent.Exception, logEvent.MessageTemplate, filteredProperties.Select(x => new LogEventProperty(x.Key, x.Value)));
77+
preparedLogEvent = new LogEvent(logEvent.Timestamp, logEvent.Level, logEvent.Exception, logEvent.MessageTemplate,
78+
filteredProperties.Select(x => new LogEventProperty(x.Key, x.Value)));
79+
}
80+
else
81+
{
82+
preparedLogEvent = logEvent;
7783
}
7884

7985
var sb = new StringBuilder();
8086
using (var writer = new System.IO.StringWriter(sb))
81-
_logEventFormatter.Format(logEvent, writer);
87+
_logEventFormatter.Format(preparedLogEvent, writer);
8288
return sb.ToString();
8389
}
8490

test/Serilog.Sinks.MSSqlServer.Tests/Sinks/MSSqlServer/Output/LogEventDataGeneratorTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public class LogEventDataGeneratorTests
1616
private readonly Serilog.Sinks.MSSqlServer.ColumnOptions _columnOptions;
1717
private readonly Mock<IStandardColumnDataGenerator> _standardColumnDataGeneratorMock;
1818
private readonly Mock<IPropertiesColumnDataGenerator> _propertiesColumnDataGenerator;
19-
private LogEventDataGenerator _sut;
19+
private readonly LogEventDataGenerator _sut;
2020

2121
public LogEventDataGeneratorTests()
2222
{

test/Serilog.Sinks.MSSqlServer.Tests/Sinks/MSSqlServer/Output/StandardColumnDataGeneratorTests.cs

Lines changed: 242 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Data;
4+
using System.Globalization;
45
using System.IO;
56
using Moq;
67
using Serilog.Events;
@@ -17,9 +18,145 @@ public class StandardColumnDataGeneratorTests
1718
{
1819
private StandardColumnDataGenerator _sut;
1920

21+
[Fact]
22+
public void GetStandardColumnNameAndValueWhenCalledWithoutFormatterRendersLogEventPropertyUsingInternalJsonFormatter()
23+
{
24+
// Arrange
25+
const string expectedLogEventContent =
26+
"{\"TimeStamp\":\"2020-01-01T09:00:00.0000000\",\"Level\":\"Information\",\"Message\":\"\",\"MessageTemplate\":\"\"}";
27+
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
28+
options.Store.Add(StandardColumn.LogEvent);
29+
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, TimeSpan.Zero);
30+
var logEvent = CreateLogEvent(testDateTimeOffset);
31+
SetupSut(options);
32+
33+
// Act
34+
var column = _sut.GetStandardColumnNameAndValue(StandardColumn.LogEvent, logEvent);
35+
36+
// Assert
37+
Assert.Equal(expectedLogEventContent, column.Value);
38+
}
39+
40+
[Fact]
41+
public void GetStandardColumnNameAndValueForMessageReturnsSimpleTextMessageKeyValue()
42+
{
43+
// Arrange
44+
const string messageText = "Test message";
45+
var logEvent = new LogEvent(
46+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
47+
LogEventLevel.Debug, null, new MessageTemplate(new List<MessageTemplateToken>() { new TextToken(messageText) }),
48+
new List<LogEventProperty>());
49+
SetupSut(new Serilog.Sinks.MSSqlServer.ColumnOptions());
50+
51+
// Act
52+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.Message, logEvent);
53+
54+
// Assert
55+
Assert.Equal("Message", result.Key);
56+
Assert.Equal(messageText, result.Value);
57+
}
58+
59+
[Fact]
60+
public void GetStandardColumnNameAndValueForMessageReturnsMessageKeyValueWithDefaultFormatting()
61+
{
62+
// Arrange
63+
const string expectedText = "2.4";
64+
var logEvent = new LogEvent(
65+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
66+
LogEventLevel.Debug, null, new MessageTemplate(new List<MessageTemplateToken>() { new PropertyToken("NumberProperty", "{NumberProperty}") }),
67+
new List<LogEventProperty> { new LogEventProperty("NumberProperty", new ScalarValue(2.4)) });
68+
SetupSut(new Serilog.Sinks.MSSqlServer.ColumnOptions(), CultureInfo.InvariantCulture);
69+
70+
// Act
71+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.Message, logEvent);
72+
73+
// Assert
74+
Assert.Equal("Message", result.Key);
75+
Assert.Equal(expectedText, result.Value);
76+
}
77+
78+
[Fact]
79+
public void GetStandardColumnNameAndValueForMessageReturnsMessageKeyValueWithCustomFormatting()
80+
{
81+
// Arrange
82+
const string expectedText = "2,4";
83+
var logEvent = new LogEvent(
84+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
85+
LogEventLevel.Debug, null, new MessageTemplate(new List<MessageTemplateToken>() { new PropertyToken("NumberProperty", "{NumberProperty}") }),
86+
new List<LogEventProperty> { new LogEventProperty("NumberProperty", new ScalarValue(2.4)) });
87+
SetupSut(new Serilog.Sinks.MSSqlServer.ColumnOptions(), new CultureInfo("de-AT"));
88+
89+
// Act
90+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.Message, logEvent);
91+
92+
// Assert
93+
Assert.Equal("Message", result.Key);
94+
Assert.Equal(expectedText, result.Value);
95+
}
96+
97+
[Fact]
98+
public void GetStandardColumnNameAndValueForMessageTemplateReturnsMessageTemplateKeyValue()
99+
{
100+
// Arrange
101+
var messageTemplate = new MessageTemplate(new List<MessageTemplateToken>() { new PropertyToken("NumberProperty", "{NumberProperty}") });
102+
var logEvent = new LogEvent(
103+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
104+
LogEventLevel.Debug, null, messageTemplate,
105+
new List<LogEventProperty> { new LogEventProperty("NumberProperty", new ScalarValue(2.4)) });
106+
SetupSut(new Serilog.Sinks.MSSqlServer.ColumnOptions(), CultureInfo.InvariantCulture);
107+
108+
// Act
109+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.MessageTemplate, logEvent);
110+
111+
// Assert
112+
Assert.Equal("MessageTemplate", result.Key);
113+
Assert.Equal(messageTemplate.Text, result.Value);
114+
}
115+
116+
[Fact]
117+
public void GetStandardColumnNameAndValueForLogLevelReturnsLogLevelKeyValue()
118+
{
119+
// Arrange
120+
var logLevel = LogEventLevel.Debug;
121+
var expectedValue = logLevel.ToString();
122+
var logEvent = new LogEvent(
123+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
124+
logLevel, null, new MessageTemplate(new List<MessageTemplateToken>() { new TextToken("Test message") }),
125+
new List<LogEventProperty>());
126+
SetupSut(new Serilog.Sinks.MSSqlServer.ColumnOptions());
127+
128+
// Act
129+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.Level, logEvent);
130+
131+
// Assert
132+
Assert.Equal("Level", result.Key);
133+
Assert.Equal(expectedValue, result.Value);
134+
}
135+
136+
[Fact]
137+
public void GetStandardColumnNameAndValueForLogLevelReturnsLogLevelKeyValueAsEnum()
138+
{
139+
// Arrange
140+
var logLevel = LogEventLevel.Debug;
141+
var logEvent = new LogEvent(
142+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
143+
logLevel, null, new MessageTemplate(new List<MessageTemplateToken>() { new TextToken("Test message") }),
144+
new List<LogEventProperty>());
145+
var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions();
146+
columnOptions.Level.StoreAsEnum = true;
147+
SetupSut(columnOptions);
148+
149+
// Act
150+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.Level, logEvent);
151+
152+
// Assert
153+
Assert.Equal("Level", result.Key);
154+
Assert.Equal(logLevel, result.Value);
155+
}
156+
20157
[Trait("Bugfix", "#187")]
21158
[Fact]
22-
public void GetStandardColumnNameAndValueCreatesTimeStampOfTypeDateTimeAccordingToColumnOptions()
159+
public void GetStandardColumnNameAndValueForTimeStampCreatesTimeStampOfTypeDateTimeAccordingToColumnOptions()
23160
{
24161
// Arrange
25162
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
@@ -37,7 +174,7 @@ public void GetStandardColumnNameAndValueCreatesTimeStampOfTypeDateTimeAccording
37174

38175
[Trait("Bugfix", "#187")]
39176
[Fact]
40-
public void GetStandardColumnNameAndValueCreatesUtcConvertedTimeStampOfTypeDateTimeAccordingToColumnOptions()
177+
public void GetStandardColumnNameAndValueForTimeStampCreatesUtcConvertedTimeStampOfTypeDateTimeAccordingToColumnOptions()
41178
{
42179
// Arrange
43180
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
@@ -58,7 +195,7 @@ public void GetStandardColumnNameAndValueCreatesUtcConvertedTimeStampOfTypeDateT
58195

59196
[Trait("Bugfix", "#187")]
60197
[Fact]
61-
public void GetStandardColumnNameAndValueCreatesTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions()
198+
public void GetStandardColumnNameAndValueForTimeStampCreatesTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions()
62199
{
63200
// Arrange
64201
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
@@ -81,7 +218,7 @@ public void GetStandardColumnNameAndValueCreatesTimeStampOfTypeDateTimeOffsetAcc
81218

82219
[Trait("Bugfix", "#187")]
83220
[Fact]
84-
public void GetStandardColumnNameAndValueCreatesUtcConvertedTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions()
221+
public void GetStandardColumnNameAndValueForTimeStampCreatesUtcConvertedTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions()
85222
{
86223
// Arrange
87224
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
@@ -103,7 +240,49 @@ public void GetStandardColumnNameAndValueCreatesUtcConvertedTimeStampOfTypeDateT
103240
}
104241

105242
[Fact]
106-
public void GetStandardColumnNameAndValueWhenCalledWithCustomFormatterRendersLogEventPropertyUsingCustomFormatter()
243+
public void GetStandardColumnNameAndValueForExceptionReturnsExceptionKeyValue()
244+
{
245+
// Arrange
246+
var exception = new InvalidOperationException("Something went wrong");
247+
var expectedValue = exception.ToString();
248+
var logEvent = new LogEvent(
249+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
250+
LogEventLevel.Debug, exception, new MessageTemplate(new List<MessageTemplateToken>() { new TextToken("Test message") }),
251+
new List<LogEventProperty>());
252+
var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions();
253+
columnOptions.Level.StoreAsEnum = true;
254+
SetupSut(columnOptions);
255+
256+
// Act
257+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.Exception, logEvent);
258+
259+
// Assert
260+
Assert.Equal("Exception", result.Key);
261+
Assert.Equal(expectedValue, result.Value);
262+
}
263+
264+
[Fact]
265+
public void GetStandardColumnNameAndValueForExceptionWhenCalledWithoutExceptionReturnsNullValue()
266+
{
267+
// Arrange
268+
var logEvent = new LogEvent(
269+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
270+
LogEventLevel.Debug, null, new MessageTemplate(new List<MessageTemplateToken>() { new TextToken("Test message") }),
271+
new List<LogEventProperty>());
272+
var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions();
273+
columnOptions.Level.StoreAsEnum = true;
274+
SetupSut(columnOptions);
275+
276+
// Act
277+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.Exception, logEvent);
278+
279+
// Assert
280+
Assert.Equal("Exception", result.Key);
281+
Assert.Null(result.Value);
282+
}
283+
284+
[Fact]
285+
public void GetStandardColumnNameAndValueForLogEventRendersLogEventPropertyUsingCustomFormatter()
107286
{
108287
// Arrange
109288
const string testLogEventContent = "Content of LogEvent";
@@ -116,29 +295,74 @@ public void GetStandardColumnNameAndValueWhenCalledWithCustomFormatterRendersLog
116295
SetupSut(options, logEventFormatter: logEventFormatterMock.Object);
117296

118297
// Act
119-
var column = _sut.GetStandardColumnNameAndValue(StandardColumn.LogEvent, logEvent);
298+
var result = _sut.GetStandardColumnNameAndValue(StandardColumn.LogEvent, logEvent);
120299

121300
// Assert
122-
Assert.Equal(testLogEventContent, column.Value);
301+
Assert.Equal(testLogEventContent, result.Value);
123302
}
124303

125304
[Fact]
126-
public void GetStandardColumnNameAndValueWhenCalledWithoutFormatterRendersLogEventPropertyUsingInternalJsonFormatter()
305+
public void GetStandardColumnNameAndValueForLogEventHandlesExcludeAdditionalPropertiesTrue()
127306
{
128307
// Arrange
129-
const string expectedLogEventContent =
130-
"{\"TimeStamp\":\"2020-01-01T09:00:00.0000000\",\"Level\":\"Information\",\"Message\":\"\",\"MessageTemplate\":\"\"}";
131-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
308+
const string additionalColumnName = "AdditionalColumn1";
309+
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
310+
{
311+
AdditionalColumns = new List<SqlColumn> { new SqlColumn(additionalColumnName, SqlDbType.NVarChar) }
312+
};
313+
options.LogEvent.ExcludeAdditionalProperties = true;
132314
options.Store.Add(StandardColumn.LogEvent);
133-
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, TimeSpan.Zero);
134-
var logEvent = CreateLogEvent(testDateTimeOffset);
135-
SetupSut(options);
315+
var logEventFormatterMock = new Mock<ITextFormatter>();
316+
var logEvent = new LogEvent(
317+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
318+
LogEventLevel.Debug, null, new MessageTemplate(new List<MessageTemplateToken>()),
319+
new List<LogEventProperty> { new LogEventProperty(additionalColumnName, new ScalarValue("1234")) });
320+
SetupSut(options, logEventFormatter: logEventFormatterMock.Object);
136321

137322
// Act
138-
var column = _sut.GetStandardColumnNameAndValue(StandardColumn.LogEvent, logEvent);
323+
_sut.GetStandardColumnNameAndValue(StandardColumn.LogEvent, logEvent);
139324

140325
// Assert
141-
Assert.Equal(expectedLogEventContent, column.Value);
326+
logEventFormatterMock.Verify(f => f.Format(
327+
It.Is<LogEvent>(e => !e.Properties.ContainsKey(additionalColumnName)),
328+
It.IsAny<StringWriter>()));
329+
}
330+
331+
[Fact]
332+
public void GetStandardColumnNameAndValueForLogEventHandlesExcludeAdditionalPropertiesFalse()
333+
{
334+
// Arrange
335+
const string additionalColumnName = "AdditionalColumn1";
336+
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
337+
{
338+
AdditionalColumns = new List<SqlColumn> { new SqlColumn(additionalColumnName, SqlDbType.NVarChar) }
339+
};
340+
options.Store.Add(StandardColumn.LogEvent);
341+
var logEventFormatterMock = new Mock<ITextFormatter>();
342+
var logEvent = new LogEvent(
343+
new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero),
344+
LogEventLevel.Debug, null, new MessageTemplate(new List<MessageTemplateToken>()),
345+
new List<LogEventProperty> { new LogEventProperty(additionalColumnName, new ScalarValue("1234")) });
346+
SetupSut(options, logEventFormatter: logEventFormatterMock.Object);
347+
348+
// Act
349+
_sut.GetStandardColumnNameAndValue(StandardColumn.LogEvent, logEvent);
350+
351+
// Assert
352+
logEventFormatterMock.Verify(f => f.Format(
353+
It.Is<LogEvent>(e => e.Properties.ContainsKey(additionalColumnName)),
354+
It.IsAny<StringWriter>()));
355+
}
356+
357+
[Fact]
358+
public void GetStandardColumnNameAndValueForUnsupportedColumnThrows()
359+
{
360+
// Arrange
361+
var logEvent = CreateLogEvent(new DateTimeOffset(2020, 1, 1, 0, 0, 0, 0, TimeSpan.Zero));
362+
SetupSut(new Serilog.Sinks.MSSqlServer.ColumnOptions());
363+
364+
// Act + assert
365+
Assert.Throws<ArgumentOutOfRangeException>(() => _sut.GetStandardColumnNameAndValue(StandardColumn.Id, logEvent));
142366
}
143367

144368
private static LogEvent CreateLogEvent(DateTimeOffset testDateTimeOffset)
@@ -149,9 +373,10 @@ private static LogEvent CreateLogEvent(DateTimeOffset testDateTimeOffset)
149373

150374
private void SetupSut(
151375
Serilog.Sinks.MSSqlServer.ColumnOptions options,
376+
IFormatProvider formatProvider = null,
152377
ITextFormatter logEventFormatter = null)
153378
{
154-
_sut = new StandardColumnDataGenerator(options, null, logEventFormatter);
379+
_sut = new StandardColumnDataGenerator(options, formatProvider, logEventFormatter);
155380
}
156381
}
157382
}

0 commit comments

Comments
 (0)