Skip to content

Commit 2f7c2b9

Browse files
committed
Added all unit tests for sink, audit sink and SinkDependenciesFactory.
1 parent ff4fbe1 commit 2f7c2b9

File tree

4 files changed

+213
-45
lines changed

4 files changed

+213
-45
lines changed

src/Serilog.Sinks.MSSqlServer/Sinks/MSSqlServer/Platform/SqlCreateTableWriter.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ public string GetSqlFromDataTable(string schemaName, string tableName, DataTable
1010
{
1111
var sql = new StringBuilder();
1212
var ix = new StringBuilder();
13-
int indexCount = 1;
13+
var indexCount = 1;
1414

1515
// start schema check and DDL (wrap in EXEC to make a separate batch)
1616
sql.AppendLine($"IF(NOT EXISTS(SELECT * FROM sys.schemas WHERE name = '{schemaName}'))");
@@ -24,7 +24,7 @@ public string GetSqlFromDataTable(string schemaName, string tableName, DataTable
2424
sql.AppendLine($"CREATE TABLE [{schemaName}].[{tableName}] ( ");
2525

2626
// build column list
27-
int i = 1;
27+
var i = 1;
2828
foreach (DataColumn column in dataTable.Columns)
2929
{
3030
var common = (SqlColumn)column.ExtendedProperties["SqlColumn"];
Lines changed: 74 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,74 @@
1+
using Serilog.Sinks.MSSqlServer.Platform;
2+
using Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Dependencies;
3+
using Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Options;
4+
using Serilog.Sinks.MSSqlServer.Sinks.MSSqlServer.Platform;
5+
using Serilog.Sinks.MSSqlServer.Tests.TestUtils;
6+
using Xunit;
7+
8+
namespace Serilog.Sinks.MSSqlServer.Tests.Sinks.MSSqlServer.Dependencies
9+
{
10+
[Trait(TestCategory.TraitName, TestCategory.Unit)]
11+
public class SinkDependenciesFactoryTests
12+
{
13+
private const string _connectionString = "Server=localhost;Database=LogTest;Integrated Security=SSPI;";
14+
private readonly SinkOptions _sinkOptions;
15+
private readonly Serilog.Sinks.MSSqlServer.ColumnOptions _columnOptions;
16+
17+
public SinkDependenciesFactoryTests()
18+
{
19+
_sinkOptions = new SinkOptions { TableName = "LogEvents" };
20+
_columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions();
21+
}
22+
23+
[Fact]
24+
public void CreatesSinkDependenciesWithSqlTableCreator()
25+
{
26+
// Act
27+
var result = SinkDependenciesFactory.Create(_connectionString, _sinkOptions, null, _columnOptions, null);
28+
29+
// Assert
30+
Assert.NotNull(result.SqlTableCreator);
31+
Assert.IsType<SqlTableCreator>(result.SqlTableCreator);
32+
}
33+
34+
[Fact]
35+
public void CreatesSinkDependenciesWithDataTableCreator()
36+
{
37+
// Act
38+
var result = SinkDependenciesFactory.Create(_connectionString, _sinkOptions, null, _columnOptions, null);
39+
40+
// Assert
41+
Assert.NotNull(result.DataTableCreator);
42+
Assert.IsType<DataTableCreator>(result.DataTableCreator);
43+
}
44+
45+
[Fact]
46+
public void CreatesSinkDependenciesWithSqlBulkBatchWriter()
47+
{
48+
// Act
49+
var result = SinkDependenciesFactory.Create(_connectionString, _sinkOptions, null, _columnOptions, null);
50+
51+
// Assert
52+
Assert.NotNull(result.SqlBulkBatchWriter);
53+
Assert.IsType<SqlBulkBatchWriter>(result.SqlBulkBatchWriter);
54+
}
55+
56+
[Fact]
57+
public void CreatesSinkDependenciesWithSqlLogEventWriter()
58+
{
59+
// Act
60+
var result = SinkDependenciesFactory.Create(_connectionString, _sinkOptions, null, _columnOptions, null);
61+
62+
// Assert
63+
Assert.NotNull(result.SqlLogEventWriter);
64+
Assert.IsType<SqlLogEventWriter>(result.SqlLogEventWriter);
65+
}
66+
67+
[Fact]
68+
public void DefaultsColumnOptionsIfNull()
69+
{
70+
// Act (should not throw)
71+
SinkDependenciesFactory.Create(_connectionString, _sinkOptions, null, null, null);
72+
}
73+
}
74+
}

test/Serilog.Sinks.MSSqlServer.Tests/Sinks/MSSqlServer/MSSqlServerAuditSinkTests.cs

Lines changed: 80 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ namespace Serilog.Sinks.MSSqlServer.Tests.Sinks.MSSqlServer
1313
[Trait(TestCategory.TraitName, TestCategory.Unit)]
1414
public class MSSqlServerAuditSinkTests : IDisposable
1515
{
16+
private readonly SinkOptions _sinkOptions;
17+
private readonly Serilog.Sinks.MSSqlServer.ColumnOptions _columnOptions;
1618
private readonly SinkDependencies _sinkDependencies;
1719
private readonly Mock<IDataTableCreator> _dataTableCreatorMock;
1820
private readonly Mock<ISqlTableCreator> _sqlTableCreatorMock;
@@ -25,6 +27,14 @@ public class MSSqlServerAuditSinkTests : IDisposable
2527

2628
public MSSqlServerAuditSinkTests()
2729
{
30+
_sinkOptions = new SinkOptions
31+
{
32+
TableName = _tableName,
33+
SchemaName = _schemaName
34+
};
35+
36+
_columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions();
37+
2838
_dataTable = new DataTable(_tableName);
2939
_dataTableCreatorMock = new Mock<IDataTableCreator>();
3040
_dataTableCreatorMock.Setup(d => d.CreateDataTable())
@@ -42,13 +52,72 @@ public MSSqlServerAuditSinkTests()
4252
}
4353

4454
[Fact]
45-
public void InitializeWithAutoCreateSqlTableCallsDataTableCreator()
55+
public void InitializeWithoutTableNameThrows()
56+
{
57+
Assert.Throws<InvalidOperationException>(() =>
58+
new MSSqlServerAuditSink(
59+
new SinkOptions(),
60+
new Serilog.Sinks.MSSqlServer.ColumnOptions(),
61+
_sinkDependencies));
62+
}
63+
64+
[Fact]
65+
public void InitializeWithoutSinkDependenciesThrows()
66+
{
67+
Assert.Throws<ArgumentNullException>(() =>
68+
new MSSqlServerSink(_sinkOptions, null));
69+
}
70+
71+
[Fact]
72+
public void InitializeWithoutDataTableCreatorThrows()
4673
{
4774
// Arrange
48-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
75+
_sinkDependencies.DataTableCreator = null;
76+
77+
// Act + assert
78+
Assert.Throws<InvalidOperationException>(() =>
79+
new MSSqlServerSink(_sinkOptions, _sinkDependencies));
80+
}
4981

82+
[Fact]
83+
public void InitializeWithoutSqlTableCreatorThrows()
84+
{
85+
// Arrange
86+
_sinkDependencies.SqlTableCreator = null;
87+
88+
// Act + assert
89+
Assert.Throws<InvalidOperationException>(() =>
90+
new MSSqlServerSink(_sinkOptions, _sinkDependencies));
91+
}
92+
93+
[Fact]
94+
public void InitializeWithoutSqlLogEventWriterThrows()
95+
{
96+
// Arrange
97+
_sinkDependencies.SqlLogEventWriter = null;
98+
99+
// Act + assert
100+
Assert.Throws<InvalidOperationException>(() =>
101+
new MSSqlServerSink(_sinkOptions, _sinkDependencies));
102+
}
103+
104+
[Fact]
105+
public void InitializeWithDisableTriggersThrows()
106+
{
107+
// Arrange
108+
var sinkOptions = new SinkOptions { TableName = "TestTableName" };
109+
var columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions { DisableTriggers = true };
110+
111+
// Act + assert
112+
Assert.Throws<NotSupportedException>(() =>
113+
new MSSqlServerAuditSink(sinkOptions, columnOptions, _sinkDependencies));
114+
}
115+
116+
[Fact]
117+
public void InitializeWithAutoCreateSqlTableCallsDataTableCreator()
118+
{
50119
// Act
51-
SetupSut(options, autoCreateSqlTable: true);
120+
SetupSut(autoCreateSqlTable: true);
52121

53122
// Assert
54123
_dataTableCreatorMock.Verify(c => c.CreateDataTable(), Times.Once);
@@ -57,11 +126,8 @@ public void InitializeWithAutoCreateSqlTableCallsDataTableCreator()
57126
[Fact]
58127
public void InitializeWithoutAutoCreateSqlTableDoesNotCallDataTableCreator()
59128
{
60-
// Arrange
61-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
62-
63129
// Act
64-
SetupSut(options, autoCreateSqlTable: false);
130+
SetupSut(autoCreateSqlTable: false);
65131

66132
// Assert
67133
_dataTableCreatorMock.Verify(c => c.CreateDataTable(), Times.Never);
@@ -70,10 +136,8 @@ public void InitializeWithoutAutoCreateSqlTableDoesNotCallDataTableCreator()
70136
[Fact]
71137
public void InitializeWithAutoCreateSqlTableCallsSqlTableCreator()
72138
{
73-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
74-
75139
// Act
76-
SetupSut(options, autoCreateSqlTable: true);
140+
SetupSut(autoCreateSqlTable: true);
77141

78142
// Assert
79143
_sqlTableCreatorMock.Verify(c => c.CreateTable(_dataTable), Times.Once);
@@ -82,35 +146,25 @@ public void InitializeWithAutoCreateSqlTableCallsSqlTableCreator()
82146
[Fact]
83147
public void InitializeWithoutAutoCreateSqlTableDoesNotCallSqlTableCreator()
84148
{
85-
// Arrange
86-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
87-
88149
// Act
89-
SetupSut(options, autoCreateSqlTable: false);
150+
SetupSut(autoCreateSqlTable: false);
90151

91152
// Assert
92153
_sqlTableCreatorMock.Verify(c => c.CreateTable(It.IsAny<DataTable>()), Times.Never);
93154
}
94155

95-
private void SetupSut(
96-
Serilog.Sinks.MSSqlServer.ColumnOptions options,
97-
bool autoCreateSqlTable = false)
156+
private void SetupSut(bool autoCreateSqlTable = false)
98157
{
99-
var sinkOptions = new SinkOptions
100-
{
101-
TableName = _tableName,
102-
SchemaName = _schemaName,
103-
AutoCreateSqlTable = autoCreateSqlTable
104-
};
105-
_sut = new MSSqlServerAuditSink(sinkOptions, options, _sinkDependencies);
158+
_sinkOptions.AutoCreateSqlTable = autoCreateSqlTable;
159+
_sut = new MSSqlServerAuditSink(_sinkOptions, _columnOptions, _sinkDependencies);
106160
}
107161

108162
protected virtual void Dispose(bool disposing)
109163
{
110164
if (!_disposedValue)
111165
{
112-
_sut.Dispose();
113-
_dataTable.Dispose();
166+
_sut?.Dispose();
167+
_dataTable?.Dispose();
114168
_disposedValue = true;
115169
}
116170
}

test/Serilog.Sinks.MSSqlServer.Tests/Sinks/MSSqlServer/MSSqlServerSinkTests.cs

Lines changed: 57 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ namespace Serilog.Sinks.MSSqlServer.Tests.Sinks.MSSqlServer
1313
[Trait(TestCategory.TraitName, TestCategory.Unit)]
1414
public class MSSqlServerSinkTests : IDisposable
1515
{
16+
private readonly SinkOptions _sinkOptions;
1617
private readonly SinkDependencies _sinkDependencies;
1718
private readonly Mock<IDataTableCreator> _dataTableCreatorMock;
1819
private readonly Mock<ISqlTableCreator> _sqlTableCreatorMock;
@@ -25,6 +26,12 @@ public class MSSqlServerSinkTests : IDisposable
2526

2627
public MSSqlServerSinkTests()
2728
{
29+
_sinkOptions = new SinkOptions
30+
{
31+
TableName = _tableName,
32+
SchemaName = _schemaName
33+
};
34+
2835
_dataTable = new DataTable(_tableName);
2936
_dataTableCreatorMock = new Mock<IDataTableCreator>();
3037
_dataTableCreatorMock.Setup(d => d.CreateDataTable())
@@ -42,11 +49,55 @@ public MSSqlServerSinkTests()
4249
}
4350

4451
[Fact]
45-
public void InitializeCallsDataTableCreator()
52+
public void InitializeWithoutTableNameThrows()
53+
{
54+
Assert.Throws<InvalidOperationException>(() =>
55+
new MSSqlServerSink(new SinkOptions(), _sinkDependencies));
56+
}
57+
58+
[Fact]
59+
public void InitializeWithoutSinkDependenciesThrows()
60+
{
61+
Assert.Throws<ArgumentNullException>(() =>
62+
new MSSqlServerSink(_sinkOptions, null));
63+
}
64+
65+
[Fact]
66+
public void InitializeWithoutDataTableCreatorThrows()
67+
{
68+
// Arrange
69+
_sinkDependencies.DataTableCreator = null;
70+
71+
// Act + assert
72+
Assert.Throws<InvalidOperationException>(() =>
73+
new MSSqlServerSink(_sinkOptions, _sinkDependencies));
74+
}
75+
76+
[Fact]
77+
public void InitializeWithoutSqlTableCreatorThrows()
4678
{
4779
// Arrange
48-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
80+
_sinkDependencies.SqlTableCreator = null;
4981

82+
// Act + assert
83+
Assert.Throws<InvalidOperationException>(() =>
84+
new MSSqlServerSink(_sinkOptions, _sinkDependencies));
85+
}
86+
87+
[Fact]
88+
public void InitializeWithoutSqlBulkBatchWriterThrows()
89+
{
90+
// Arrange
91+
_sinkDependencies.SqlBulkBatchWriter = null;
92+
93+
// Act + assert
94+
Assert.Throws<InvalidOperationException>(() =>
95+
new MSSqlServerSink(_sinkOptions, _sinkDependencies));
96+
}
97+
98+
[Fact]
99+
public void InitializeCallsDataTableCreator()
100+
{
50101
// Act
51102
SetupSut(autoCreateSqlTable: false);
52103

@@ -57,9 +108,6 @@ public void InitializeCallsDataTableCreator()
57108
[Fact]
58109
public void InitializeWithAutoCreateSqlTableCallsSqlTableCreator()
59110
{
60-
// Arrange
61-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
62-
63111
// Act
64112
SetupSut(autoCreateSqlTable: true);
65113

@@ -70,9 +118,6 @@ public void InitializeWithAutoCreateSqlTableCallsSqlTableCreator()
70118
[Fact]
71119
public void InitializeWithoutAutoCreateSqlTableDoesNotCallSqlTableCreator()
72120
{
73-
// Arrange
74-
var options = new Serilog.Sinks.MSSqlServer.ColumnOptions();
75-
76121
// Act
77122
SetupSut(autoCreateSqlTable: false);
78123

@@ -82,21 +127,16 @@ public void InitializeWithoutAutoCreateSqlTableDoesNotCallSqlTableCreator()
82127

83128
private void SetupSut(bool autoCreateSqlTable = false)
84129
{
85-
var sinkOptions = new SinkOptions
86-
{
87-
TableName = _tableName,
88-
SchemaName = _schemaName,
89-
AutoCreateSqlTable = autoCreateSqlTable
90-
};
91-
_sut = new MSSqlServerSink(sinkOptions, _sinkDependencies);
130+
_sinkOptions.AutoCreateSqlTable = autoCreateSqlTable;
131+
_sut = new MSSqlServerSink(_sinkOptions, _sinkDependencies);
92132
}
93133

94134
protected virtual void Dispose(bool disposing)
95135
{
96136
if (!_disposedValue)
97137
{
98-
_sut.Dispose();
99-
_dataTable.Dispose();
138+
_sut?.Dispose();
139+
_dataTable?.Dispose();
100140
_disposedValue = true;
101141
}
102142
}

0 commit comments

Comments
 (0)