1
1
using System ;
2
2
using System . Collections . Generic ;
3
3
using System . Data ;
4
+ using System . Globalization ;
4
5
using System . IO ;
5
6
using Moq ;
6
7
using Serilog . Events ;
@@ -17,9 +18,145 @@ public class StandardColumnDataGeneratorTests
17
18
{
18
19
private StandardColumnDataGenerator _sut ;
19
20
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
+
20
157
[ Trait ( "Bugfix" , "#187" ) ]
21
158
[ Fact ]
22
- public void GetStandardColumnNameAndValueCreatesTimeStampOfTypeDateTimeAccordingToColumnOptions ( )
159
+ public void GetStandardColumnNameAndValueForTimeStampCreatesTimeStampOfTypeDateTimeAccordingToColumnOptions ( )
23
160
{
24
161
// Arrange
25
162
var options = new Serilog . Sinks . MSSqlServer . ColumnOptions ( ) ;
@@ -37,7 +174,7 @@ public void GetStandardColumnNameAndValueCreatesTimeStampOfTypeDateTimeAccording
37
174
38
175
[ Trait ( "Bugfix" , "#187" ) ]
39
176
[ Fact ]
40
- public void GetStandardColumnNameAndValueCreatesUtcConvertedTimeStampOfTypeDateTimeAccordingToColumnOptions ( )
177
+ public void GetStandardColumnNameAndValueForTimeStampCreatesUtcConvertedTimeStampOfTypeDateTimeAccordingToColumnOptions ( )
41
178
{
42
179
// Arrange
43
180
var options = new Serilog . Sinks . MSSqlServer . ColumnOptions
@@ -58,7 +195,7 @@ public void GetStandardColumnNameAndValueCreatesUtcConvertedTimeStampOfTypeDateT
58
195
59
196
[ Trait ( "Bugfix" , "#187" ) ]
60
197
[ Fact ]
61
- public void GetStandardColumnNameAndValueCreatesTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions ( )
198
+ public void GetStandardColumnNameAndValueForTimeStampCreatesTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions ( )
62
199
{
63
200
// Arrange
64
201
var options = new Serilog . Sinks . MSSqlServer . ColumnOptions
@@ -81,7 +218,7 @@ public void GetStandardColumnNameAndValueCreatesTimeStampOfTypeDateTimeOffsetAcc
81
218
82
219
[ Trait ( "Bugfix" , "#187" ) ]
83
220
[ Fact ]
84
- public void GetStandardColumnNameAndValueCreatesUtcConvertedTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions ( )
221
+ public void GetStandardColumnNameAndValueForTimeStampCreatesUtcConvertedTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions ( )
85
222
{
86
223
// Arrange
87
224
var options = new Serilog . Sinks . MSSqlServer . ColumnOptions
@@ -103,7 +240,49 @@ public void GetStandardColumnNameAndValueCreatesUtcConvertedTimeStampOfTypeDateT
103
240
}
104
241
105
242
[ 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 ( )
107
286
{
108
287
// Arrange
109
288
const string testLogEventContent = "Content of LogEvent" ;
@@ -116,29 +295,74 @@ public void GetStandardColumnNameAndValueWhenCalledWithCustomFormatterRendersLog
116
295
SetupSut ( options , logEventFormatter : logEventFormatterMock . Object ) ;
117
296
118
297
// Act
119
- var column = _sut . GetStandardColumnNameAndValue ( StandardColumn . LogEvent , logEvent ) ;
298
+ var result = _sut . GetStandardColumnNameAndValue ( StandardColumn . LogEvent , logEvent ) ;
120
299
121
300
// Assert
122
- Assert . Equal ( testLogEventContent , column . Value ) ;
301
+ Assert . Equal ( testLogEventContent , result . Value ) ;
123
302
}
124
303
125
304
[ Fact ]
126
- public void GetStandardColumnNameAndValueWhenCalledWithoutFormatterRendersLogEventPropertyUsingInternalJsonFormatter ( )
305
+ public void GetStandardColumnNameAndValueForLogEventHandlesExcludeAdditionalPropertiesTrue ( )
127
306
{
128
307
// 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 ;
132
314
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 ) ;
136
321
137
322
// Act
138
- var column = _sut . GetStandardColumnNameAndValue ( StandardColumn . LogEvent , logEvent ) ;
323
+ _sut . GetStandardColumnNameAndValue ( StandardColumn . LogEvent , logEvent ) ;
139
324
140
325
// 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 ) ) ;
142
366
}
143
367
144
368
private static LogEvent CreateLogEvent ( DateTimeOffset testDateTimeOffset )
@@ -149,9 +373,10 @@ private static LogEvent CreateLogEvent(DateTimeOffset testDateTimeOffset)
149
373
150
374
private void SetupSut (
151
375
Serilog . Sinks . MSSqlServer . ColumnOptions options ,
376
+ IFormatProvider formatProvider = null ,
152
377
ITextFormatter logEventFormatter = null )
153
378
{
154
- _sut = new StandardColumnDataGenerator ( options , null , logEventFormatter ) ;
379
+ _sut = new StandardColumnDataGenerator ( options , formatProvider , logEventFormatter ) ;
155
380
}
156
381
}
157
382
}
0 commit comments