1
1
using System ;
2
2
using System . Collections . Generic ;
3
- using System . Data ;
4
- using System . IO ;
5
3
using System . Linq ;
6
4
using Moq ;
7
5
using Serilog . Events ;
8
- using Serilog . Formatting ;
9
6
using Serilog . Parsing ;
10
7
using Serilog . Sinks . MSSqlServer . Output ;
11
8
using Serilog . Sinks . MSSqlServer . Tests . TestUtils ;
@@ -16,152 +13,100 @@ namespace Serilog.Sinks.MSSqlServer.Tests.Sinks.MSSqlServer.Output
16
13
[ Trait ( TestCategory . TraitName , TestCategory . Unit ) ]
17
14
public class LogEventDataGeneratorTests
18
15
{
16
+ private readonly Serilog . Sinks . MSSqlServer . ColumnOptions _columnOptions ;
17
+ private readonly Mock < IStandardColumnDataGenerator > _standardColumnDataGeneratorMock ;
18
+ private readonly Mock < IPropertiesColumnDataGenerator > _propertiesColumnDataGenerator ;
19
19
private LogEventDataGenerator _sut ;
20
20
21
- [ Trait ( "Bugfix" , "#187" ) ]
22
- [ Fact ]
23
- public void GetColumnsAndValuesCreatesTimeStampOfTypeDateTimeAccordingToColumnOptions ( )
21
+ public LogEventDataGeneratorTests ( )
24
22
{
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 ) ;
38
27
}
39
28
40
- [ Trait ( "Bugfix" , "#187" ) ]
41
29
[ Fact ]
42
- public void GetColumnsAndValuesCreatesUtcConvertedTimeStampOfTypeDateTimeAccordingToColumnOptions ( )
30
+ public void InitializedWithoutColumnOptionsThrows ( )
43
31
{
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 ) ) ;
60
34
}
61
35
62
- [ Trait ( "Bugfix" , "#187" ) ]
63
36
[ Fact ]
64
- public void GetColumnsAndValuesCreatesTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions ( )
37
+ public void InitializedWithoutStandardColumnDataGeneratorThrows ( )
65
38
{
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
+ }
77
42
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 ) ) ;
84
48
}
85
49
86
- [ Trait ( "Bugfix" , "#187" ) ]
87
50
[ Fact ]
88
- public void GetColumnsAndValuesCreatesUtcConvertedTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions ( )
51
+ public void GetColumnsAndValuesReturnsResultForEveryStandardColumnExceptId ( )
89
52
{
90
53
// Arrange
91
- var options = new Serilog . Sinks . MSSqlServer . ColumnOptions
54
+ _columnOptions . Store . Clear ( ) ;
55
+ foreach ( var standardColumnType in Enum . GetValues ( typeof ( StandardColumn ) ) . Cast < StandardColumn > ( ) )
92
56
{
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 ( ) ;
98
60
99
61
// Act
100
- var columns = _sut . GetColumnsAndValues ( logEvent ) ;
62
+ var values = _sut . GetColumnsAndValues ( logEvent ) . ToArray ( ) ;
101
63
102
64
// 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
+ }
108
69
}
109
70
110
71
[ Fact ]
111
- public void GetColumnsAndValuesWhenCalledWithCustomFormatterRendersLogEventPropertyUsingCustomFormatter ( )
72
+ public void GetColumnsAndValuesWithAdditionalColumnsCallsPropertiesColumnDataGenerator ( )
112
73
{
113
74
// 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 ) ;
122
81
123
82
// Act
124
- var columns = _sut . GetColumnsAndValues ( logEvent ) ;
83
+ var result = _sut . GetColumnsAndValues ( logEvent ) . ToArray ( ) ;
125
84
126
85
// 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 ) ;
129
90
}
130
91
131
92
[ Fact ]
132
- public void GetColumnsAndValuesWhenCalledWithoutFormatterRendersLogEventPropertyUsingInternalJsonFormatter ( )
93
+ public void GetColumnsAndValuesWithoutAdditionalColumnsDoesNotCallPropertiesColumnDataGenerator ( )
133
94
{
134
95
// 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 ( ) ;
142
97
143
98
// Act
144
- var columns = _sut . GetColumnsAndValues ( logEvent ) ;
99
+ var result = _sut . GetColumnsAndValues ( logEvent ) . ToArray ( ) ;
145
100
146
101
// 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 ) ;
149
103
}
150
104
151
- private static LogEvent CreateLogEvent ( DateTimeOffset testDateTimeOffset )
105
+ private static LogEvent CreateLogEvent ( )
152
106
{
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 ,
154
109
new MessageTemplate ( new List < MessageTemplateToken > ( ) ) , new List < LogEventProperty > ( ) ) ;
155
110
}
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
- }
166
111
}
167
112
}
0 commit comments