2
2
using Serilog . Events ;
3
3
using Serilog . Formatting ;
4
4
using Serilog . Parsing ;
5
+ using Serilog . Sinks . MSSqlServer . Platform ;
5
6
using System ;
6
7
using System . Collections . Generic ;
7
8
using System . Data ;
@@ -15,22 +16,25 @@ namespace Serilog.Sinks.MSSqlServer.Tests.Sinks.MSSqlServer
15
16
[ Collection ( "LogTest" ) ]
16
17
public class MSSqlServerSinkTraitsTests
17
18
{
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 ;
20
23
21
24
[ Trait ( "Bugfix" , "#187" ) ]
22
25
[ Fact ]
23
26
public void GetColumnsAndValuesCreatesTimeStampOfTypeDateTimeAccordingToColumnOptions ( )
24
27
{
25
- // arrange
28
+ // Arrange
26
29
var options = new Serilog . Sinks . MSSqlServer . ColumnOptions ( ) ;
27
30
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 ) ;
29
33
30
- // act
31
- var columns = traits . GetColumnsAndValues ( logEvent ) ;
34
+ // Act
35
+ var columns = _sut . GetColumnsAndValues ( logEvent ) ;
32
36
33
- // assert
37
+ // Assert
34
38
var timeStampColumn = columns . Single ( c => c . Key == options . TimeStamp . ColumnName ) ;
35
39
Assert . IsType < DateTime > ( timeStampColumn . Value ) ;
36
40
Assert . Equal ( testDateTimeOffset . Hour , ( ( DateTime ) timeStampColumn . Value ) . Hour ) ;
@@ -40,18 +44,19 @@ public void GetColumnsAndValuesCreatesTimeStampOfTypeDateTimeAccordingToColumnOp
40
44
[ Fact ]
41
45
public void GetColumnsAndValuesCreatesUtcConvertedTimeStampOfTypeDateTimeAccordingToColumnOptions ( )
42
46
{
43
- // arrange
47
+ // Arrange
44
48
var options = new Serilog . Sinks . MSSqlServer . ColumnOptions
45
49
{
46
50
TimeStamp = { ConvertToUtc = true }
47
51
} ;
48
52
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 ) ;
50
55
51
- // act
52
- var columns = traits . GetColumnsAndValues ( logEvent ) ;
56
+ // Act
57
+ var columns = _sut . GetColumnsAndValues ( logEvent ) ;
53
58
54
- // assert
59
+ // Assert
55
60
var timeStampColumn = columns . Single ( c => c . Key == options . TimeStamp . ColumnName ) ;
56
61
Assert . IsType < DateTime > ( timeStampColumn . Value ) ;
57
62
Assert . Equal ( testDateTimeOffset . Hour - 1 , ( ( DateTime ) timeStampColumn . Value ) . Hour ) ;
@@ -61,18 +66,19 @@ public void GetColumnsAndValuesCreatesUtcConvertedTimeStampOfTypeDateTimeAccordi
61
66
[ Fact ]
62
67
public void GetColumnsAndValuesCreatesTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions ( )
63
68
{
64
- // arrange
69
+ // Arrange
65
70
var options = new Serilog . Sinks . MSSqlServer . ColumnOptions
66
71
{
67
72
TimeStamp = { DataType = SqlDbType . DateTimeOffset }
68
73
} ;
69
74
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 ) ;
71
77
72
- // act
73
- var columns = traits . GetColumnsAndValues ( logEvent ) ;
78
+ // Act
79
+ var columns = _sut . GetColumnsAndValues ( logEvent ) ;
74
80
75
- // assert
81
+ // Assert
76
82
var timeStampColumn = columns . Single ( c => c . Key == options . TimeStamp . ColumnName ) ;
77
83
Assert . IsType < DateTimeOffset > ( timeStampColumn . Value ) ;
78
84
var timeStampColumnOffset = ( DateTimeOffset ) timeStampColumn . Value ;
@@ -84,18 +90,19 @@ public void GetColumnsAndValuesCreatesTimeStampOfTypeDateTimeOffsetAccordingToCo
84
90
[ Fact ]
85
91
public void GetColumnsAndValuesCreatesUtcConvertedTimeStampOfTypeDateTimeOffsetAccordingToColumnOptions ( )
86
92
{
87
- // arrange
93
+ // Arrange
88
94
var options = new Serilog . Sinks . MSSqlServer . ColumnOptions
89
95
{
90
96
TimeStamp = { DataType = SqlDbType . DateTimeOffset , ConvertToUtc = true }
91
97
} ;
92
98
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 ) ;
94
101
95
- // act
96
- var columns = traits . GetColumnsAndValues ( logEvent ) ;
102
+ // Act
103
+ var columns = _sut . GetColumnsAndValues ( logEvent ) ;
97
104
98
- // assert
105
+ // Assert
99
106
var timeStampColumn = columns . Single ( c => c . Key == options . TimeStamp . ColumnName ) ;
100
107
Assert . IsType < DateTimeOffset > ( timeStampColumn . Value ) ;
101
108
var timeStampColumnOffset = ( DateTimeOffset ) timeStampColumn . Value ;
@@ -106,51 +113,99 @@ public void GetColumnsAndValuesCreatesUtcConvertedTimeStampOfTypeDateTimeOffsetA
106
113
[ Fact ]
107
114
public void GetColumnsAndValuesWhenCalledWithCustomFormatterRendersLogEventPropertyUsingCustomFormatter ( )
108
115
{
109
- // arrange
116
+ // Arrange
110
117
const string testLogEventContent = "Content of LogEvent" ;
111
118
var options = new Serilog . Sinks . MSSqlServer . ColumnOptions ( ) ;
112
119
options . Store . Add ( StandardColumn . LogEvent ) ;
113
120
var logEventFormatterMock = new Mock < ITextFormatter > ( ) ;
114
121
logEventFormatterMock . Setup ( f => f . Format ( It . IsAny < LogEvent > ( ) , It . IsAny < TextWriter > ( ) ) )
115
122
. 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 ) ;
117
125
118
- // act
119
- var columns = traits . GetColumnsAndValues ( logEvent ) ;
126
+ // Act
127
+ var columns = _sut . GetColumnsAndValues ( logEvent ) ;
120
128
121
- // assert
129
+ // Assert
122
130
var logEventColumn = columns . Single ( c => c . Key == options . LogEvent . ColumnName ) ;
123
131
Assert . Equal ( testLogEventContent , logEventColumn . Value ) ;
124
132
}
125
133
126
134
[ Fact ]
127
135
public void GetColumnsAndValuesWhenCalledWithoutFormatterRendersLogEventPropertyUsingInternalJsonFormatter ( )
128
136
{
129
- // arrange
137
+ // Arrange
130
138
const string expectedLogEventContent =
131
139
"{\" TimeStamp\" :\" 2020-01-01T09:00:00.0000000\" ,\" Level\" :\" Information\" ,\" Message\" :\" \" ,\" MessageTemplate\" :\" \" }" ;
132
140
var options = new Serilog . Sinks . MSSqlServer . ColumnOptions ( ) ;
133
141
options . Store . Add ( StandardColumn . LogEvent ) ;
134
142
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 ) ;
136
145
137
- // act
138
- var columns = traits . GetColumnsAndValues ( logEvent ) ;
146
+ // Act
147
+ var columns = _sut . GetColumnsAndValues ( logEvent ) ;
139
148
140
- // assert
149
+ // Assert
141
150
var logEventColumn = columns . Single ( c => c . Key == options . LogEvent . ColumnName ) ;
142
151
Assert . Equal ( expectedLogEventContent , logEventColumn . Value ) ;
143
152
}
144
153
145
- private void SetupTest (
146
- Serilog . Sinks . MSSqlServer . ColumnOptions options ,
147
- DateTimeOffset testDateTimeOffset ,
148
- ITextFormatter logEventFormatter = null )
154
+ [ Fact ]
155
+ public void InitializeWithAutoCreateSqlTableCallsSqlTableCreator ( )
149
156
{
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 ,
153
189
new MessageTemplate ( new List < MessageTemplateToken > ( ) ) , new List < LogEventProperty > ( ) ) ;
154
190
}
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
+ }
155
210
}
156
211
}
0 commit comments