Skip to content

Commit 0cf3ff0

Browse files
committed
* Added integration and unit tests for AdditionalColumn/PropertyName
* Read AdditionalColumn/PropertyName from M.E.C configurations
1 parent d51a49e commit 0cf3ff0

File tree

5 files changed

+156
-14
lines changed

5 files changed

+156
-14
lines changed

src/Serilog.Sinks.MSSqlServer/Configuration/Implementations/Microsoft.Extensions.Configuration/MicrosoftExtensionsColumnOptionsProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,7 @@ private static void SetCommonColumnOptions(IConfigurationSection section, SqlCol
2929
{
3030
// Standard Columns are subclasses of the SqlColumn class
3131
SetProperty.IfNotNullOrEmpty<string>(section["columnName"], (val) => target.ColumnName = val);
32+
SetProperty.IfNotNullOrEmpty<string>(section["propertyName"], (val) => target.PropertyName = val);
3233
SetProperty.IfNotNull<string>(section["dataType"], (val) => target.SetDataTypeFromConfigString(val));
3334
SetProperty.IfNotNull<bool>(section["allowNull"], (val) => target.AllowNull = val);
3435
SetProperty.IfNotNull<int>(section["dataLength"], (val) => target.DataLength = val);

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

Lines changed: 89 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,7 @@ public AdditionalPropertiesTests(ITestOutputHelper output) : base(output)
1515
}
1616

1717
[Fact]
18-
public void CreatesTableWithTwoAdditionalProperties()
18+
public void WritesLogEventWithColumnNamedProperties()
1919
{
2020
// Arrange
2121
const string additionalColumnName1 = "AdditionalColumn1";
@@ -24,24 +24,102 @@ public void CreatesTableWithTwoAdditionalProperties()
2424
{
2525
AdditionalColumns = new List<SqlColumn>
2626
{
27-
new SqlColumn(additionalColumnName1, SqlDbType.NVarChar, true, dataLength: 100),
28-
new SqlColumn(additionalColumnName2, SqlDbType.Int, true)
27+
new SqlColumn
28+
{
29+
ColumnName = additionalColumnName1,
30+
DataType = SqlDbType.NVarChar,
31+
AllowNull = true,
32+
DataLength = 100
33+
},
34+
new SqlColumn
35+
{
36+
ColumnName = additionalColumnName2,
37+
DataType = SqlDbType.Int,
38+
AllowNull = true
39+
}
2940
}
3041
};
3142

43+
var messageTemplate = $"Hello {{{additionalColumnName1}}} from thread {{{additionalColumnName2}}}";
44+
var property1Value = "PropertyValue1";
45+
var property2Value = 2;
46+
var expectedMessage = $"Hello \"{property1Value}\" from thread {property2Value}";
47+
3248
// Act
33-
using (var sink = new MSSqlServerSink(DatabaseFixture.LogEventsConnectionString,
34-
sinkOptions: new SinkOptions
49+
Log.Logger = new LoggerConfiguration()
50+
.WriteTo.MSSqlServer(
51+
DatabaseFixture.LogEventsConnectionString,
52+
sinkOptions: new SinkOptions
53+
{
54+
TableName = DatabaseFixture.LogTableName,
55+
AutoCreateSqlTable = true
56+
},
57+
columnOptions: columnOptions)
58+
.CreateLogger();
59+
Log.Information(messageTemplate, property1Value, property2Value);
60+
Log.CloseAndFlush();
61+
62+
// Assert
63+
VerifyDatabaseColumnsWereCreated(columnOptions.AdditionalColumns);
64+
VerifyLogMessageWasWritten(expectedMessage);
65+
VerifyStringColumnWritten(additionalColumnName1, property1Value);
66+
VerifyIntegerColumnWritten(additionalColumnName2, property2Value);
67+
}
68+
69+
[Fact]
70+
public void WritesLogEventWithCustomNamedProperties()
71+
{
72+
// Arrange
73+
const string additionalColumn1Name = "AdditionalColumn1";
74+
const string additionalProperty1Name = "AdditionalProperty1";
75+
const string additionalColumn2Name = "AdditionalColumn2";
76+
const string additionalProperty2Name = "AdditionalProperty2";
77+
var columnOptions = new ColumnOptions
78+
{
79+
AdditionalColumns = new List<SqlColumn>
3580
{
36-
TableName = DatabaseFixture.LogTableName,
37-
AutoCreateSqlTable = true
38-
},
39-
columnOptions: columnOptions,
40-
formatProvider: null))
41-
{ }
81+
new SqlColumn
82+
{
83+
ColumnName = additionalColumn1Name,
84+
PropertyName = additionalProperty1Name,
85+
DataType = SqlDbType.NVarChar,
86+
AllowNull = true,
87+
DataLength = 100
88+
},
89+
new SqlColumn
90+
{
91+
ColumnName = additionalColumn2Name,
92+
PropertyName = additionalProperty2Name,
93+
DataType = SqlDbType.Int,
94+
AllowNull = true
95+
}
96+
}
97+
};
98+
99+
var messageTemplate = $"Hello {{{additionalProperty1Name}}} from thread {{{additionalProperty2Name}}}";
100+
var property1Value = "PropertyValue1";
101+
var property2Value = 2;
102+
var expectedMessage = $"Hello \"{property1Value}\" from thread {property2Value}";
103+
104+
// Act
105+
Log.Logger = new LoggerConfiguration()
106+
.WriteTo.MSSqlServer(
107+
DatabaseFixture.LogEventsConnectionString,
108+
sinkOptions: new SinkOptions
109+
{
110+
TableName = DatabaseFixture.LogTableName,
111+
AutoCreateSqlTable = true
112+
},
113+
columnOptions: columnOptions)
114+
.CreateLogger();
115+
Log.Information(messageTemplate, property1Value, property2Value);
116+
Log.CloseAndFlush();
42117

43118
// Assert
44119
VerifyDatabaseColumnsWereCreated(columnOptions.AdditionalColumns);
120+
VerifyLogMessageWasWritten(expectedMessage);
121+
VerifyStringColumnWritten(additionalColumn1Name, property1Value);
122+
VerifyIntegerColumnWritten(additionalColumn2Name, property2Value);
45123
}
46124
}
47125
}

test/Serilog.Sinks.MSSqlServer.Tests/Configuration/Implementations/Microsoft.Extensions.Configuration/MicrosoftExtensionsColumnOptionsProviderTests.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -659,6 +659,12 @@ public void ConfigureColumnOptionsThrowsWhenSettingPrimaryKeyColumnNameToUndefin
659659
Assert.Throws<ArgumentException>(() => sut.ConfigureColumnOptions(columnOptions, _configurationSectionMock.Object));
660660
}
661661

662+
[Fact]
663+
public void ConfigureColumnOptionsSetsPropertyNameForAdditionalColumn()
664+
{
665+
// TODO Implement test
666+
}
667+
662668
private static void AssertColumnSqlOptions(string expectedColumnName, SqlDbType expectedDataType, bool expectedAllowNull, bool expectedNonClusteredIndex, SqlColumn actualColumn)
663669
{
664670
Assert.Equal(expectedColumnName, actualColumn.ColumnName);
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
using System.Data;
2+
using Serilog.Sinks.MSSqlServer.Tests.TestUtils;
3+
using Xunit;
4+
5+
namespace Serilog.Sinks.MSSqlServer.Tests.Sinks.MSSqlServer
6+
{
7+
[Trait(TestCategory.TraitName, TestCategory.Unit)]
8+
public class SqlServerColumnTests
9+
{
10+
[Fact]
11+
public void DefaultsPropertyNameToColumnName()
12+
{
13+
// Arrange + act
14+
const string columnName = "TestColumnName";
15+
var sut = new SqlColumn(columnName, SqlDbType.Int);
16+
17+
// Assert
18+
Assert.Equal(columnName, sut.PropertyName);
19+
}
20+
21+
[Fact]
22+
public void StoresPropertyName()
23+
{
24+
// Arrange
25+
const string propertyName = "TestPropertyName";
26+
var sut = new SqlColumn("TestColumnName", SqlDbType.Int);
27+
28+
// Act
29+
sut.PropertyName = propertyName;
30+
31+
// Assert
32+
Assert.Equal(propertyName, sut.PropertyName);
33+
}
34+
}
35+
}

test/Serilog.Sinks.MSSqlServer.Tests/TestUtils/DatabaseTestsBase.cs

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -94,13 +94,35 @@ protected static void VerifyIdColumnWasCreatedAndHasIdentity(string idColumnName
9494
}
9595
}
9696

97-
protected static void VerifyLogMessageWasWritten(string message)
97+
protected static void VerifyLogMessageWasWritten(string expectedMessage)
98+
{
99+
//using (var conn = new SqlConnection(DatabaseFixture.LogEventsConnectionString))
100+
//{
101+
// var logEvents = conn.Query<DefaultStandardLogColumns>($"SELECT * FROM {DatabaseFixture.LogTableName}");
102+
103+
// logEvents.Should().Contain(e => e.Message.Contains(message));
104+
//}
105+
106+
VerifyStringColumnWritten("Message", expectedMessage);
107+
}
108+
109+
protected static void VerifyStringColumnWritten(string columnName, string expectedValue)
110+
{
111+
using (var conn = new SqlConnection(DatabaseFixture.LogEventsConnectionString))
112+
{
113+
var logEvents = conn.Query<string>($"SELECT {columnName} FROM {DatabaseFixture.LogTableName}");
114+
115+
logEvents.Should().Contain(c => c == expectedValue);
116+
}
117+
}
118+
119+
protected static void VerifyIntegerColumnWritten(string columnName, int expectedValue)
98120
{
99121
using (var conn = new SqlConnection(DatabaseFixture.LogEventsConnectionString))
100122
{
101-
var logEvents = conn.Query<DefaultStandardLogColumns>($"SELECT * FROM {DatabaseFixture.LogTableName}");
123+
var logEvents = conn.Query<int>($"SELECT {columnName} FROM {DatabaseFixture.LogTableName}");
102124

103-
logEvents.Should().Contain(e => e.Message.Contains(message));
125+
logEvents.Should().Contain(c => c == expectedValue);
104126
}
105127
}
106128

0 commit comments

Comments
 (0)