|
| 1 | +using System; |
| 2 | +using System.Collections.Generic; |
| 3 | +using System.Data; |
| 4 | +using System.Linq; |
| 5 | +using Serilog.Sinks.MSSqlServer.Platform; |
| 6 | +using Serilog.Sinks.MSSqlServer.Tests.TestUtils; |
| 7 | +using Xunit; |
| 8 | + |
| 9 | +namespace Serilog.Sinks.MSSqlServer.Tests.Sinks.MSSqlServer.Platform |
| 10 | +{ |
| 11 | + [Trait(TestCategory.TraitName, TestCategory.Unit)] |
| 12 | + public class DataTableCreatorTests |
| 13 | + { |
| 14 | + private const string _tableName = "TestTableName"; |
| 15 | + private readonly Serilog.Sinks.MSSqlServer.ColumnOptions _columnOptions; |
| 16 | + private DataTableCreator _sut; |
| 17 | + |
| 18 | + public DataTableCreatorTests() |
| 19 | + { |
| 20 | + _columnOptions = new Serilog.Sinks.MSSqlServer.ColumnOptions(); |
| 21 | + } |
| 22 | + |
| 23 | + [Fact] |
| 24 | + public void InitializeThrowsIfTableNameIsNull() |
| 25 | + { |
| 26 | + Assert.Throws<ArgumentNullException>(() => new DataTableCreator(null, _columnOptions)); |
| 27 | + } |
| 28 | + |
| 29 | + [Fact] |
| 30 | + public void InitializeThrowsIfColumnOptionsIsNull() |
| 31 | + { |
| 32 | + Assert.Throws<ArgumentNullException>(() => new DataTableCreator(_tableName, null)); |
| 33 | + } |
| 34 | + |
| 35 | + [Fact] |
| 36 | + public void CreateDataTableAddsStandardColumns() |
| 37 | + { |
| 38 | + // Arrange |
| 39 | + _columnOptions.Store.Add(StandardColumn.LogEvent); |
| 40 | + SetupSut(); |
| 41 | + |
| 42 | + // Act |
| 43 | + var result = _sut.CreateDataTable(); |
| 44 | + |
| 45 | + // Assert |
| 46 | + Assert.Equal(_columnOptions.Store.Count, result.Columns.Count); |
| 47 | + CompareStandardColumn(result, StandardColumn.Id, nameof(StandardColumn.Id)); |
| 48 | + CompareStandardColumn(result, StandardColumn.Message, nameof(StandardColumn.Message)); |
| 49 | + CompareStandardColumn(result, StandardColumn.MessageTemplate, nameof(StandardColumn.MessageTemplate)); |
| 50 | + CompareStandardColumn(result, StandardColumn.Level, nameof(StandardColumn.Level)); |
| 51 | + CompareStandardColumn(result, StandardColumn.TimeStamp, nameof(StandardColumn.TimeStamp)); |
| 52 | + CompareStandardColumn(result, StandardColumn.Exception, nameof(StandardColumn.Exception)); |
| 53 | + CompareStandardColumn(result, StandardColumn.Properties, nameof(StandardColumn.Properties)); |
| 54 | + CompareStandardColumn(result, StandardColumn.LogEvent, nameof(StandardColumn.LogEvent)); |
| 55 | + } |
| 56 | + |
| 57 | + [Fact] |
| 58 | + public void CreateDataTableSetsCustomStandardColumnAsPrimaryKey() |
| 59 | + { |
| 60 | + // Arrange |
| 61 | + var messageColumn = _columnOptions.GetStandardColumnOptions(StandardColumn.Message); |
| 62 | + _columnOptions.PrimaryKey = messageColumn; |
| 63 | + SetupSut(); |
| 64 | + |
| 65 | + // Act |
| 66 | + var result = _sut.CreateDataTable(); |
| 67 | + |
| 68 | + // Assert |
| 69 | + messageColumn.AllowNull = false; // If column was made PK, AllowNulls was set to false. |
| 70 | + var messageDataColumn = messageColumn.AsDataColumn(); |
| 71 | + AssertColumnsEqual(messageDataColumn, result.PrimaryKey.Single()); |
| 72 | + } |
| 73 | + |
| 74 | + [Fact] |
| 75 | + public void CreateDataTableAddsAdditionalColumns() |
| 76 | + { |
| 77 | + // Arrange |
| 78 | + _columnOptions.Store.Remove(StandardColumn.Id); |
| 79 | + _columnOptions.Store.Remove(StandardColumn.Message); |
| 80 | + _columnOptions.Store.Remove(StandardColumn.MessageTemplate); |
| 81 | + _columnOptions.Store.Remove(StandardColumn.Level); |
| 82 | + _columnOptions.Store.Remove(StandardColumn.TimeStamp); |
| 83 | + _columnOptions.Store.Remove(StandardColumn.Exception); |
| 84 | + _columnOptions.Store.Remove(StandardColumn.Properties); |
| 85 | + var additionalColumn1 = new SqlColumn { ColumnName = "AdditionalColumn1", AllowNull = false, DataType = SqlDbType.BigInt }; |
| 86 | + var additionalColumn2 = new SqlColumn { ColumnName = "AdditionalColumn2", AllowNull = true, DataType = SqlDbType.NVarChar, DataLength = 10 }; |
| 87 | + _columnOptions.AdditionalColumns = new List<SqlColumn> { additionalColumn1, additionalColumn2 }; |
| 88 | + SetupSut(); |
| 89 | + |
| 90 | + // Act |
| 91 | + var result = _sut.CreateDataTable(); |
| 92 | + |
| 93 | + // Assert |
| 94 | + Assert.Equal(2, result.Columns.Count); |
| 95 | + AssertColumnsEqual(additionalColumn1.AsDataColumn(), result.Columns["AdditionalColumn1"]); |
| 96 | + AssertColumnsEqual(additionalColumn2.AsDataColumn(), result.Columns["AdditionalColumn2"]); |
| 97 | + } |
| 98 | + |
| 99 | + [Fact] |
| 100 | + public void CreateDataTableSetsCustomAdditionalColumnAsPrimaryKey() |
| 101 | + { |
| 102 | + // Arrange |
| 103 | + _columnOptions.Store.Remove(StandardColumn.Id); |
| 104 | + _columnOptions.Store.Remove(StandardColumn.Message); |
| 105 | + _columnOptions.Store.Remove(StandardColumn.MessageTemplate); |
| 106 | + _columnOptions.Store.Remove(StandardColumn.Level); |
| 107 | + _columnOptions.Store.Remove(StandardColumn.TimeStamp); |
| 108 | + _columnOptions.Store.Remove(StandardColumn.Exception); |
| 109 | + _columnOptions.Store.Remove(StandardColumn.Properties); |
| 110 | + var additionalColumn1 = new SqlColumn { ColumnName = "AdditionalColumn1", AllowNull = false, DataType = SqlDbType.BigInt }; |
| 111 | + var additionalColumn2 = new SqlColumn { ColumnName = "AdditionalColumn2", AllowNull = true, DataType = SqlDbType.NVarChar, DataLength = 10 }; |
| 112 | + _columnOptions.AdditionalColumns = new List<SqlColumn> { additionalColumn1, additionalColumn2 }; |
| 113 | + _columnOptions.PrimaryKey = additionalColumn1; |
| 114 | + SetupSut(); |
| 115 | + |
| 116 | + // Act |
| 117 | + var result = _sut.CreateDataTable(); |
| 118 | + |
| 119 | + // Assert |
| 120 | + var additionalColumn1DataColumn = additionalColumn1.AsDataColumn(); |
| 121 | + AssertColumnsEqual(additionalColumn1DataColumn, result.PrimaryKey.Single()); |
| 122 | + } |
| 123 | + |
| 124 | + private void SetupSut() |
| 125 | + { |
| 126 | + _sut = new DataTableCreator(_tableName, _columnOptions); |
| 127 | + } |
| 128 | + |
| 129 | + private static void AssertColumnsEqual(DataColumn column, DataColumn dataColumn) |
| 130 | + { |
| 131 | + Assert.Equal(column.ColumnName, dataColumn.ColumnName); |
| 132 | + Assert.Equal(column.DataType, dataColumn.DataType); |
| 133 | + Assert.Equal(column.MaxLength, dataColumn.MaxLength); |
| 134 | + Assert.Equal(column.AllowDBNull, dataColumn.AllowDBNull); |
| 135 | + } |
| 136 | + |
| 137 | + private void CompareStandardColumn(DataTable result, StandardColumn standardColumn, string standardColumnName) |
| 138 | + { |
| 139 | + var column = _columnOptions.GetStandardColumnOptions(standardColumn).AsDataColumn(); |
| 140 | + var dataColumn = result.Columns[standardColumnName]; |
| 141 | + AssertColumnsEqual(column, dataColumn); |
| 142 | + } |
| 143 | + } |
| 144 | +} |
0 commit comments