Skip to content

Commit 432895b

Browse files
authored
Merge pull request #42 from colin-young/localdb-tests
Run tests via LocalDB
2 parents 37e5186 + 9b34aa9 commit 432895b

File tree

5 files changed

+1030
-330
lines changed

5 files changed

+1030
-330
lines changed
Lines changed: 161 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,161 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Data.SqlClient;
4+
using System.IO;
5+
using System.Linq;
6+
using System.Threading;
7+
using System.Threading.Tasks;
8+
using Dapper;
9+
using Xunit;
10+
using FluentAssertions;
11+
using Serilog.Events;
12+
13+
namespace Serilog.Sinks.MSSqlServer.Tests
14+
{
15+
public class CustomStandardColumnNames : IClassFixture<DatabaseFixture>
16+
{
17+
[Fact]
18+
public void CustomIdColumn()
19+
{
20+
// arrange
21+
var options = new ColumnOptions();
22+
var customIdName = "CustomIdName";
23+
options.Id.ColumnName = customIdName;
24+
25+
// act
26+
var logTableName = $"{DatabaseFixture.LogTableName}CustomId";
27+
var sink = new MSSqlServerSink(DatabaseFixture.LogEventsConnectionString, logTableName, 1, TimeSpan.FromSeconds(1), null, true, options);
28+
29+
// assert
30+
using (var conn = new SqlConnection(DatabaseFixture.MasterConnectionString))
31+
{
32+
conn.Execute($"use {DatabaseFixture.Database}");
33+
var logEvents = conn.Query<InfoSchema>($@"SELECT COLUMN_NAME AS ColumnName FROM {DatabaseFixture.Database}.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{logTableName}'");
34+
var infoSchema = logEvents as InfoSchema[] ?? logEvents.ToArray();
35+
36+
infoSchema.Should().Contain(columns => columns.ColumnName == customIdName);
37+
}
38+
}
39+
40+
[Fact]
41+
public void DefaultIdColumn()
42+
{
43+
// arrange
44+
var options = new ColumnOptions();
45+
46+
// act
47+
var logTableName = $"{DatabaseFixture.LogTableName}DefaultId";
48+
var sink = new MSSqlServerSink(DatabaseFixture.LogEventsConnectionString, logTableName, 1, TimeSpan.FromSeconds(1), null, true, options);
49+
50+
// assert
51+
using (var conn = new SqlConnection(DatabaseFixture.MasterConnectionString))
52+
{
53+
conn.Execute($"use {DatabaseFixture.Database}");
54+
var logEvents = conn.Query<InfoSchema>($@"SELECT COLUMN_NAME AS ColumnName FROM {DatabaseFixture.Database}.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{logTableName}'");
55+
var infoSchema = logEvents as InfoSchema[] ?? logEvents.ToArray();
56+
57+
infoSchema.Should().Contain(columns => columns.ColumnName == "Id");
58+
}
59+
}
60+
61+
[Fact]
62+
public void TableCreatedWithCustomNames()
63+
{
64+
// arrange
65+
var options = new ColumnOptions();
66+
var standardNames = new List<string> { "CustomMessage", "CustomMessageTemplate", "CustomLevel", "CustomTimeStamp", "CustomException", "CustomProperties" };
67+
68+
options.Message.ColumnName = "CustomMessage";
69+
options.MessageTemplate.ColumnName = "CustomMessageTemplate";
70+
options.Level.ColumnName = "CustomLevel";
71+
options.TimeStamp.ColumnName = "CustomTimeStamp";
72+
options.Exception.ColumnName = "CustomException";
73+
options.Properties.ColumnName = "CustomProperties";
74+
75+
// act
76+
var logTableName = $"{DatabaseFixture.LogTableName}Custom";
77+
var sink = new MSSqlServerSink(DatabaseFixture.LogEventsConnectionString, logTableName, 1, TimeSpan.FromSeconds(1), null, true, options);
78+
79+
// assert
80+
using (var conn = new SqlConnection(DatabaseFixture.MasterConnectionString))
81+
{
82+
conn.Execute($"use {DatabaseFixture.Database}");
83+
var logEvents = conn.Query<InfoSchema>($@"SELECT COLUMN_NAME AS ColumnName FROM {DatabaseFixture.Database}.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{logTableName}'");
84+
var infoSchema = logEvents as InfoSchema[] ?? logEvents.ToArray();
85+
86+
foreach (var column in standardNames)
87+
{
88+
infoSchema.Should().Contain(columns => columns.ColumnName == column);
89+
}
90+
91+
infoSchema.Should().Contain(columns => columns.ColumnName == "Id");
92+
}
93+
}
94+
95+
[Fact]
96+
public void TableCreatedWithDefaultNames()
97+
{
98+
// arrange
99+
var options = new ColumnOptions();
100+
var standardNames = new List<string> { "Message", "MessageTemplate", "Level", "TimeStamp", "Exception", "Properties" };
101+
102+
// act
103+
var logTableName = $"{DatabaseFixture.LogTableName}DefaultStandard";
104+
var sink = new MSSqlServerSink(DatabaseFixture.LogEventsConnectionString, logTableName, 1, TimeSpan.FromSeconds(1), null, true, options);
105+
106+
// assert
107+
using (var conn = new SqlConnection(DatabaseFixture.MasterConnectionString))
108+
{
109+
conn.Execute($"use {DatabaseFixture.Database}");
110+
var logEvents = conn.Query<InfoSchema>($@"SELECT COLUMN_NAME AS ColumnName FROM {DatabaseFixture.Database}.INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = '{logTableName}'");
111+
var infoSchema = logEvents as InfoSchema[] ?? logEvents.ToArray();
112+
113+
foreach (var column in standardNames)
114+
{
115+
infoSchema.Should().Contain(columns => columns.ColumnName == column);
116+
}
117+
}
118+
}
119+
120+
[Fact]
121+
public void WriteEventToDefaultStandardColumns()
122+
{
123+
// arrange
124+
var loggerConfiguration = new LoggerConfiguration();
125+
Log.Logger = loggerConfiguration.WriteTo.MSSqlServer(
126+
connectionString: DatabaseFixture.LogEventsConnectionString,
127+
tableName: DatabaseFixture.LogTableName,
128+
autoCreateSqlTable: true,
129+
batchPostingLimit: 1,
130+
period: TimeSpan.FromSeconds(10),
131+
columnOptions: new ColumnOptions())
132+
.CreateLogger();
133+
134+
var file = File.CreateText("Self.log");
135+
Serilog.Debugging.SelfLog.Enable(TextWriter.Synchronized(file));
136+
137+
// act
138+
const string loggingInformationMessage = "Logging Information message";
139+
Log.Information(loggingInformationMessage);
140+
141+
//Thread.Sleep(50);
142+
143+
Log.CloseAndFlush();
144+
145+
// assert
146+
using (var conn = new SqlConnection(DatabaseFixture.LogEventsConnectionString))
147+
{
148+
var logEvents = conn.Query<DefaultStandardLogColumns>($"SELECT Message, Level FROM {DatabaseFixture.LogTableName}");
149+
150+
logEvents.Should().Contain(e => e.Message.Contains(loggingInformationMessage));
151+
}
152+
}
153+
}
154+
155+
public class DefaultStandardLogColumns
156+
{
157+
public string Message { get; set; }
158+
159+
public LogEventLevel Level { get; set; }
160+
}
161+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
using System;
2+
using System.Data.SqlClient;
3+
using System.Linq;
4+
using Dapper;
5+
6+
namespace Serilog.Sinks.MSSqlServer.Tests
7+
{
8+
public class DatabaseFixture : IDisposable
9+
{
10+
public static string Database => "LogTest";
11+
public static string LogTableName => "LogEvents";
12+
13+
private const string CreateLogEventsDatabase = @"
14+
EXEC ('CREATE DATABASE [{0}] ON PRIMARY
15+
(NAME = [{0}],
16+
FILENAME =''{1}'',
17+
SIZE = 25MB,
18+
MAXSIZE = 50MB,
19+
FILEGROWTH = 5MB )')";
20+
21+
private static readonly string DatabaseFileNameQuery = $@"SELECT CONVERT(VARCHAR(255), SERVERPROPERTY('instancedefaultdatapath')) + '{Database}.mdf' AS Name";
22+
private static readonly string DropLogEventsDatabase = $@"
23+
ALTER DATABASE [{Database}]
24+
SET SINGLE_USER
25+
WITH ROLLBACK IMMEDIATE
26+
DROP DATABASE [{Database}]
27+
";
28+
29+
public static string MasterConnectionString => @"Data Source=(LocalDb)\v11.0;Initial Catalog=Master;Integrated Security=True";
30+
public static string LogEventsConnectionString => $@"Data Source=(LocalDb)\v11.0;Initial Catalog={Database};Integrated Security=True";
31+
32+
public class FileName
33+
{
34+
public string Name { get; set; }
35+
}
36+
37+
public DatabaseFixture()
38+
{
39+
CreateDatabase();
40+
}
41+
42+
public void Dispose()
43+
{
44+
DeleteDatabase();
45+
}
46+
47+
private static void DeleteDatabase()
48+
{
49+
using (var conn = new SqlConnection(MasterConnectionString))
50+
{
51+
conn.Open();
52+
var databases = conn.Query("select name from sys.databases");
53+
54+
if (databases.Any(d => d.name == Database)) conn.Execute(DropLogEventsDatabase);
55+
}
56+
}
57+
58+
private static void CreateDatabase()
59+
{
60+
DeleteDatabase();
61+
62+
using (var conn = new SqlConnection(MasterConnectionString))
63+
{
64+
conn.Open();
65+
// ReSharper disable once PossibleNullReferenceException
66+
var filename = conn.Query<FileName>(DatabaseFileNameQuery).FirstOrDefault().Name;
67+
var createDatabase = string.Format(CreateLogEventsDatabase, Database, filename);
68+
69+
conn.Execute(createDatabase);
70+
}
71+
}
72+
}
73+
}
Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
namespace Serilog.Sinks.MSSqlServer.Tests
2+
{
3+
public class InfoSchema
4+
{
5+
public string ColumnName { get; set; }
6+
}
7+
}

test/Serilog.Sinks.MSSqlServer.Tests/project.json

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,10 +3,11 @@
33

44
"dependencies": {
55
"Serilog.Sinks.MSSqlServer": { "target": "project" },
6-
"xunit": "2.1.0",
7-
"dotnet-test-xunit": "1.0.0-rc2-build10025"
6+
"xunit": "2.2.0-beta2-build3300",
7+
"dotnet-test-xunit": "2.2.0-preview2-build1029",
8+
"FluentAssertions": "4.13.0",
9+
"Dapper.StrongName": "1.50.2"
810
},
9-
1011
"buildOptions": {
1112
"keyFile": "../../assets/Serilog.snk"
1213
},

0 commit comments

Comments
 (0)