Skip to content

Commit 171c55d

Browse files
committed
Added all unit tests for LogEventDataGenerator and some for StandardColumnDataGenerator.
1 parent 94d1450 commit 171c55d

File tree

2 files changed

+207
-105
lines changed

2 files changed

+207
-105
lines changed
Lines changed: 50 additions & 105 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,8 @@
11
using System;
22
using System.Collections.Generic;
3-
using System.Data;
4-
using System.IO;
53
using System.Linq;
64
using Moq;
75
using Serilog.Events;
8-
using Serilog.Formatting;
96
using Serilog.Parsing;
107
using Serilog.Sinks.MSSqlServer.Output;
118
using Serilog.Sinks.MSSqlServer.Tests.TestUtils;
@@ -16,152 +13,100 @@ namespace Serilog.Sinks.MSSqlServer.Tests.Sinks.MSSqlServer.Output
1613
[Trait(TestCategory.TraitName, TestCategory.Unit)]
1714
public class LogEventDataGeneratorTests
1815
{
16+
private readonly Serilog.Sinks.MSSqlServer.ColumnOptions _columnOptions;
17+
private readonly Mock<IStandardColumnDataGenerator> _standardColumnDataGeneratorMock;
18+
private readonly Mock<IPropertiesColumnDataGenerator> _propertiesColumnDataGenerator;
1919
private LogEventDataGenerator _sut;
2020

21-
[Trait("Bugfix", "#187")]
22-
[Fact]
23-
public void GetColumnsAndValuesCreatesTimeStampOfTypeDateTimeAccordingToColumnOptions()
21+
public LogEventDataGeneratorTests()
2422
{
25-
// Arrange
26-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
27-
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00
28-
var logEvent = CreateLogEvent(testDateTimeOffset);
29-
SetupSut(options);
30-
31-
// Act
32-
var columns = _sut.GetColumnsAndValues(logEvent);
33-
34-
// Assert
35-
var timeStampColumn = columns.Single(c => c.Key == options.TimeStamp.ColumnName);
36-
Assert.IsType<DateTime>(timeStampColumn.Value);
37-
Assert.Equal(testDateTimeOffset.Hour, ((DateTime)timeStampColumn.Value).Hour);
23+
_columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions();
24+
_standardColumnDataGeneratorMock = new Mock<IStandardColumnDataGenerator>();
25+
_propertiesColumnDataGenerator = new Mock<IPropertiesColumnDataGenerator>();
26+
_sut = new LogEventDataGenerator(_columnOptions, _standardColumnDataGeneratorMock.Object, _propertiesColumnDataGenerator.Object);
3827
}
3928

40-
[Trait("Bugfix", "#187")]
4129
[Fact]
42-
public void GetColumnsAndValuesCreatesUtcConvertedTimeStampOfTypeDateTimeAccordingToColumnOptions()
30+
public void InitializedWithoutColumnOptionsThrows()
4331
{
44-
// Arrange
45-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
46-
{
47-
TimeStamp = { ConvertToUtc = true }
48-
};
49-
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00
50-
var logEvent = CreateLogEvent(testDateTimeOffset);
51-
SetupSut(options);
52-
53-
// Act
54-
var columns = _sut.GetColumnsAndValues(logEvent);
55-
56-
// Assert
57-
var timeStampColumn = columns.Single(c => c.Key == options.TimeStamp.ColumnName);
58-
Assert.IsType<DateTime>(timeStampColumn.Value);
59-
Assert.Equal(testDateTimeOffset.Hour - 1, ((DateTime)timeStampColumn.Value).Hour);
32+
// Act + assert
33+
Assert.Throws<ArgumentNullException>(() => new LogEventDataGenerator(null, _standardColumnDataGeneratorMock.Object, _propertiesColumnDataGenerator.Object));
6034
}
6135

62-
[Trait("Bugfix", "#187")]
6336
[Fact]
64-
public void GetColumnsAndValuesCreatesTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions()
37+
public void InitializedWithoutStandardColumnDataGeneratorThrows()
6538
{
66-
// Arrange
67-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
68-
{
69-
TimeStamp = { DataType = SqlDbType.DateTimeOffset }
70-
};
71-
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00
72-
var logEvent = CreateLogEvent(testDateTimeOffset);
73-
SetupSut(options);
74-
75-
// Act
76-
var columns = _sut.GetColumnsAndValues(logEvent);
39+
// Act + assert
40+
Assert.Throws<ArgumentNullException>(() => new LogEventDataGenerator(_columnOptions, null, _propertiesColumnDataGenerator.Object));
41+
}
7742

78-
// Assert
79-
var timeStampColumn = columns.Single(c => c.Key == options.TimeStamp.ColumnName);
80-
Assert.IsType<DateTimeOffset>(timeStampColumn.Value);
81-
var timeStampColumnOffset = (DateTimeOffset)timeStampColumn.Value;
82-
Assert.Equal(testDateTimeOffset.Hour, timeStampColumnOffset.Hour);
83-
Assert.Equal(testDateTimeOffset.Offset, timeStampColumnOffset.Offset);
43+
[Fact]
44+
public void InitializedWithoutPropertiesColumnDataGeneratorThrows()
45+
{
46+
// Act + assert
47+
Assert.Throws<ArgumentNullException>(() => new LogEventDataGenerator(_columnOptions, _standardColumnDataGeneratorMock.Object, null));
8448
}
8549

86-
[Trait("Bugfix", "#187")]
8750
[Fact]
88-
public void GetColumnsAndValuesCreatesUtcConvertedTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions()
51+
public void GetColumnsAndValuesReturnsResultForEveryStandardColumnExceptId()
8952
{
9053
// Arrange
91-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
54+
_columnOptions.Store.Clear();
55+
foreach (var standardColumnType in Enum.GetValues(typeof(StandardColumn)).Cast<StandardColumn>())
9256
{
93-
TimeStamp = { DataType = SqlDbType.DateTimeOffset, ConvertToUtc = true }
94-
};
95-
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00
96-
var logEvent = CreateLogEvent(testDateTimeOffset);
97-
SetupSut(options);
57+
_columnOptions.Store.Add(standardColumnType);
58+
}
59+
var logEvent = CreateLogEvent();
9860

9961
// Act
100-
var columns = _sut.GetColumnsAndValues(logEvent);
62+
var values = _sut.GetColumnsAndValues(logEvent).ToArray();
10163

10264
// Assert
103-
var timeStampColumn = columns.Single(c => c.Key == options.TimeStamp.ColumnName);
104-
Assert.IsType<DateTimeOffset>(timeStampColumn.Value);
105-
var timeStampColumnOffset = (DateTimeOffset)timeStampColumn.Value;
106-
Assert.Equal(testDateTimeOffset.Hour - 1, timeStampColumnOffset.Hour);
107-
Assert.Equal(new TimeSpan(0), timeStampColumnOffset.Offset);
65+
foreach (var standardColumn in _columnOptions.Store.Where(c => c != StandardColumn.Id))
66+
{
67+
_standardColumnDataGeneratorMock.Verify(s => s.GetStandardColumnNameAndValue(standardColumn, logEvent));
68+
}
10869
}
10970

11071
[Fact]
111-
public void GetColumnsAndValuesWhenCalledWithCustomFormatterRendersLogEventPropertyUsingCustomFormatter()
72+
public void GetColumnsAndValuesWithAdditionalColumnsCallsPropertiesColumnDataGenerator()
11273
{
11374
// Arrange
114-
const string testLogEventContent = "Content of LogEvent";
115-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
116-
options.Store.Add(StandardColumn.LogEvent);
117-
var logEventFormatterMock = new Mock<ITextFormatter>();
118-
logEventFormatterMock.Setup(f => f.Format(It.IsAny<LogEvent>(), It.IsAny<TextWriter>()))
119-
.Callback<LogEvent, TextWriter>((e, w) => w.Write(testLogEventContent));
120-
var logEvent = CreateLogEvent(DateTimeOffset.UtcNow);
121-
SetupSut(options, logEventFormatter: logEventFormatterMock.Object);
75+
_columnOptions.Store.Clear();
76+
_columnOptions.AdditionalColumns = new List<SqlColumn> { new SqlColumn() };
77+
var logEvent = CreateLogEvent();
78+
var expectedResult = new List<KeyValuePair<string, object>> { new KeyValuePair<string, object>("PropertyKey1", "PropertyValie1") };
79+
_propertiesColumnDataGenerator.Setup(p => p.ConvertPropertiesToColumn(It.IsAny<IReadOnlyDictionary<string, LogEventPropertyValue>>()))
80+
.Returns(expectedResult);
12281

12382
// Act
124-
var columns = _sut.GetColumnsAndValues(logEvent);
83+
var result = _sut.GetColumnsAndValues(logEvent).ToArray();
12584

12685
// Assert
127-
var logEventColumn = columns.Single(c => c.Key == options.LogEvent.ColumnName);
128-
Assert.Equal(testLogEventContent, logEventColumn.Value);
86+
Assert.Single(result);
87+
Assert.Equal(expectedResult[0].Key, result[0].Key);
88+
Assert.Equal(expectedResult[0].Value, result[0].Value);
89+
_propertiesColumnDataGenerator.Verify(p => p.ConvertPropertiesToColumn(logEvent.Properties), Times.Once);
12990
}
13091

13192
[Fact]
132-
public void GetColumnsAndValuesWhenCalledWithoutFormatterRendersLogEventPropertyUsingInternalJsonFormatter()
93+
public void GetColumnsAndValuesWithoutAdditionalColumnsDoesNotCallPropertiesColumnDataGenerator()
13394
{
13495
// Arrange
135-
const string expectedLogEventContent =
136-
"{\"TimeStamp\":\"2020-01-01T09:00:00.0000000\",\"Level\":\"Information\",\"Message\":\"\",\"MessageTemplate\":\"\"}";
137-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
138-
options.Store.Add(StandardColumn.LogEvent);
139-
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, TimeSpan.Zero);
140-
var logEvent = CreateLogEvent(testDateTimeOffset);
141-
SetupSut(options);
96+
var logEvent = CreateLogEvent();
14297

14398
// Act
144-
var columns = _sut.GetColumnsAndValues(logEvent);
99+
var result = _sut.GetColumnsAndValues(logEvent).ToArray();
145100

146101
// Assert
147-
var logEventColumn = columns.Single(c => c.Key == options.LogEvent.ColumnName);
148-
Assert.Equal(expectedLogEventContent, logEventColumn.Value);
102+
_propertiesColumnDataGenerator.Verify(p => p.ConvertPropertiesToColumn(logEvent.Properties), Times.Never);
149103
}
150104

151-
private static LogEvent CreateLogEvent(DateTimeOffset testDateTimeOffset)
105+
private static LogEvent CreateLogEvent()
152106
{
153-
return new LogEvent(testDateTimeOffset, LogEventLevel.Information, null,
107+
var timeStamp = new DateTimeOffset(2020, 1, 1, 0, 0, 0, TimeSpan.Zero);
108+
return new LogEvent(timeStamp, LogEventLevel.Information, null,
154109
new MessageTemplate(new List<MessageTemplateToken>()), new List<LogEventProperty>());
155110
}
156-
157-
private void SetupSut(
158-
Serilog.Sinks.MSSqlServer.ColumnOptions options,
159-
ITextFormatter logEventFormatter = null)
160-
{
161-
// TODO replace StandardColumnDataGenerator and with mocks and move tests to separate test classes
162-
_sut = new LogEventDataGenerator(options,
163-
new StandardColumnDataGenerator(options, null, logEventFormatter),
164-
new PropertiesColumnDataGenerator(options));
165-
}
166111
}
167112
}
Lines changed: 157 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,157 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Data;
4+
using System.IO;
5+
using Moq;
6+
using Serilog.Events;
7+
using Serilog.Formatting;
8+
using Serilog.Parsing;
9+
using Serilog.Sinks.MSSqlServer.Output;
10+
using Serilog.Sinks.MSSqlServer.Tests.TestUtils;
11+
using Xunit;
12+
13+
namespace Serilog.Sinks.MSSqlServer.Tests.Sinks.MSSqlServer.Output
14+
{
15+
[Trait(TestCategory.TraitName, TestCategory.Unit)]
16+
public class StandardColumnDataGeneratorTests
17+
{
18+
private StandardColumnDataGenerator _sut;
19+
20+
[Trait("Bugfix", "#187")]
21+
[Fact]
22+
public void GetStandardColumnNameAndValueCreatesTimeStampOfTypeDateTimeAccordingToColumnOptions()
23+
{
24+
// Arrange
25+
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
26+
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00
27+
var logEvent = CreateLogEvent(testDateTimeOffset);
28+
SetupSut(options);
29+
30+
// Act
31+
var column = _sut.GetStandardColumnNameAndValue(StandardColumn.TimeStamp, logEvent);
32+
33+
// Assert
34+
Assert.IsType<DateTime>(column.Value);
35+
Assert.Equal(testDateTimeOffset.Hour, ((DateTime)column.Value).Hour);
36+
}
37+
38+
[Trait("Bugfix", "#187")]
39+
[Fact]
40+
public void GetStandardColumnNameAndValueCreatesUtcConvertedTimeStampOfTypeDateTimeAccordingToColumnOptions()
41+
{
42+
// Arrange
43+
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
44+
{
45+
TimeStamp = { ConvertToUtc = true }
46+
};
47+
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00
48+
var logEvent = CreateLogEvent(testDateTimeOffset);
49+
SetupSut(options);
50+
51+
// Act
52+
var column = _sut.GetStandardColumnNameAndValue(StandardColumn.TimeStamp, logEvent);
53+
54+
// Assert
55+
Assert.IsType<DateTime>(column.Value);
56+
Assert.Equal(testDateTimeOffset.Hour - 1, ((DateTime)column.Value).Hour);
57+
}
58+
59+
[Trait("Bugfix", "#187")]
60+
[Fact]
61+
public void GetStandardColumnNameAndValueCreatesTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions()
62+
{
63+
// Arrange
64+
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
65+
{
66+
TimeStamp = { DataType = SqlDbType.DateTimeOffset }
67+
};
68+
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00
69+
var logEvent = CreateLogEvent(testDateTimeOffset);
70+
SetupSut(options);
71+
72+
// Act
73+
var column = _sut.GetStandardColumnNameAndValue(StandardColumn.TimeStamp, logEvent);
74+
75+
// Assert
76+
Assert.IsType<DateTimeOffset>(column.Value);
77+
var timeStampColumnOffset = (DateTimeOffset)column.Value;
78+
Assert.Equal(testDateTimeOffset.Hour, timeStampColumnOffset.Hour);
79+
Assert.Equal(testDateTimeOffset.Offset, timeStampColumnOffset.Offset);
80+
}
81+
82+
[Trait("Bugfix", "#187")]
83+
[Fact]
84+
public void GetStandardColumnNameAndValueCreatesUtcConvertedTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions()
85+
{
86+
// Arrange
87+
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions
88+
{
89+
TimeStamp = { DataType = SqlDbType.DateTimeOffset, ConvertToUtc = true }
90+
};
91+
var testDateTimeOffset = new DateTimeOffset(2020, 1, 1, 9, 0, 0, new TimeSpan(1, 0, 0)); // Timezone +1:00
92+
var logEvent = CreateLogEvent(testDateTimeOffset);
93+
SetupSut(options);
94+
95+
// Act
96+
var column = _sut.GetStandardColumnNameAndValue(StandardColumn.TimeStamp, logEvent);
97+
98+
// Assert
99+
Assert.IsType<DateTimeOffset>(column.Value);
100+
var timeStampColumnOffset = (DateTimeOffset)column.Value;
101+
Assert.Equal(testDateTimeOffset.Hour - 1, timeStampColumnOffset.Hour);
102+
Assert.Equal(new TimeSpan(0), timeStampColumnOffset.Offset);
103+
}
104+
105+
[Fact]
106+
public void GetStandardColumnNameAndValueWhenCalledWithCustomFormatterRendersLogEventPropertyUsingCustomFormatter()
107+
{
108+
// Arrange
109+
const string testLogEventContent = "Content of LogEvent";
110+
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
111+
options.Store.Add(StandardColumn.LogEvent);
112+
var logEventFormatterMock = new Mock<ITextFormatter>();
113+
logEventFormatterMock.Setup(f => f.Format(It.IsAny<LogEvent>(), It.IsAny<TextWriter>()))
114+
.Callback<LogEvent, TextWriter>((e, w) => w.Write(testLogEventContent));
115+
var logEvent = CreateLogEvent(DateTimeOffset.UtcNow);
116+
SetupSut(options, logEventFormatter: logEventFormatterMock.Object);
117+
118+
// Act
119+
var column = _sut.GetStandardColumnNameAndValue(StandardColumn.LogEvent, logEvent);
120+
121+
// Assert
122+
Assert.Equal(testLogEventContent, column.Value);
123+
}
124+
125+
[Fact]
126+
public void GetStandardColumnNameAndValueWhenCalledWithoutFormatterRendersLogEventPropertyUsingInternalJsonFormatter()
127+
{
128+
// 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();
132+
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);
136+
137+
// Act
138+
var column = _sut.GetStandardColumnNameAndValue(StandardColumn.LogEvent, logEvent);
139+
140+
// Assert
141+
Assert.Equal(expectedLogEventContent, column.Value);
142+
}
143+
144+
private static LogEvent CreateLogEvent(DateTimeOffset testDateTimeOffset)
145+
{
146+
return new LogEvent(testDateTimeOffset, LogEventLevel.Information, null,
147+
new MessageTemplate(new List<MessageTemplateToken>()), new List<LogEventProperty>());
148+
}
149+
150+
private void SetupSut(
151+
Serilog.Sinks.MSSqlServer.ColumnOptions options,
152+
ITextFormatter logEventFormatter = null)
153+
{
154+
_sut = new StandardColumnDataGenerator(options, null, logEventFormatter);
155+
}
156+
}
157+
}

0 commit comments

Comments
 (0)