Skip to content

Commit 8e8507e

Browse files
(#140) Verify properties
1 parent 0e1aef8 commit 8e8507e

File tree

5 files changed

+93
-5
lines changed

5 files changed

+93
-5
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
[
2+
{
3+
FormattedMessage: A message with 2 properties.,
4+
Properties: {
5+
{OriginalFormat}: A {TypeOfThing} with {PropertyCount} properties.,
6+
PropertyCount: 2,
7+
TypeOfThing: message
8+
}
9+
}
10+
]
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
using System.Threading.Tasks;
2+
using Microsoft.Extensions.Logging;
3+
using NUnit.Framework;
4+
using Stravaig.Extensions.Logging.Diagnostics.Verify;
5+
using VerifyNUnit;
6+
using VerifyTests;
7+
8+
namespace Stravaig.Extensions.Logging.Diagnostics.Tests.Verify;
9+
10+
[TestFixture]
11+
public class VerifyLogConverterSettingsTests
12+
{
13+
[Test]
14+
public async Task TestPropertiesAsync()
15+
{
16+
var logger = new TestCaptureLogger<VerifyLogConverterSettingsTests>();
17+
logger.LogInformation("A {TypeOfThing} with {PropertyCount} properties.", "message", 2);
18+
var settings = new VerifySettings()
19+
.AddStravaigTests(Settings.FormattedMessage | Settings.Properties);
20+
await Verifier.Verify(logger.GetLogs(), settings);
21+
}
22+
}

src/Stravaig.Extensions.Logging.Diagnostics.Verify/LogEntryConverter.cs

Lines changed: 46 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,27 +1,34 @@
11
using System;
22
using System.Collections.Generic;
3+
using System.Collections.Immutable;
4+
using System.Linq;
35
using VerifyTests;
46

57
namespace Stravaig.Extensions.Logging.Diagnostics.Verify;
68

79
internal class LogEntryConverter : WriteOnlyJsonConverter<IEnumerable<LogEntry>>
810
{
11+
internal const string DefaultNonDeterministicPropertyValueSubstitute = "*** NONDETERMINISTIC ***";
912
private readonly Settings _settings;
13+
private readonly IReadOnlySet<string> _nonDeterministicPropertyNames;
14+
private readonly string _nonDeterministicPropertyValueSubstitute;
1015

1116
public LogEntryConverter()
12-
: this(Settings.Default)
17+
: this(Settings.Default, ImmutableHashSet<string>.Empty, DefaultNonDeterministicPropertyValueSubstitute)
1318
{
1419

1520
}
1621

17-
public LogEntryConverter(Settings settings)
22+
public LogEntryConverter(Settings settings, IReadOnlySet<string> nonDeterministicPropertyNames, string nonDeterministicPropertyValueSubstitute)
1823
{
1924
_settings = settings;
25+
_nonDeterministicPropertyNames = nonDeterministicPropertyNames;
26+
_nonDeterministicPropertyValueSubstitute = nonDeterministicPropertyValueSubstitute;
2027
}
2128

2229
private class Context
2330
{
24-
internal Settings Settings { get; }
31+
private Settings Settings { get; }
2532
internal VerifyJsonWriter Writer { get; }
2633
private int _sequence;
2734
internal int CadenceOffset { get; set; }
@@ -35,6 +42,9 @@ private class Context
3542
internal bool IsWritingExceptionType => Using(Settings.ExceptionType);
3643
internal bool IsWritingInnerException => Using(Settings.InnerException);
3744
internal bool IsWritingStackTrace => Using(Settings.StackTrace);
45+
internal bool IsWritingProperties => Using(Settings.Properties);
46+
internal bool IsWritingMessageTemplate => Using(Settings.MessageTemplate);
47+
internal bool HideNonDeterministicProperties => Using(Settings.HideNonDeterministicProperties);
3848

3949
internal int CurrentSequence(LogEntry logEntry) =>
4050
Using(Settings.KeepSequenceCadence)
@@ -75,7 +85,9 @@ public override void Write(VerifyJsonWriter writer, IEnumerable<LogEntry> logEnt
7585
WriteSequence(ctx, logEntry);
7686
WriteLogLevel(ctx, logEntry);
7787
WriteCategoryName(ctx, logEntry);
88+
WriteMessageTemplate(ctx, logEntry);
7889
WriteFormattedMessage(ctx, logEntry);
90+
WriteProperties(ctx, logEntry);
7991
WriteException(ctx, logEntry);
8092

8193
writer.WriteEndObject();
@@ -85,6 +97,37 @@ public override void Write(VerifyJsonWriter writer, IEnumerable<LogEntry> logEnt
8597
writer.WriteEndArray();
8698
}
8799

100+
private void WriteProperties(Context ctx, LogEntry logEntry)
101+
{
102+
if (ctx.IsWritingProperties)
103+
{
104+
ctx.Writer.WritePropertyName(nameof(Settings.Properties));
105+
ctx.Writer.WriteStartObject();
106+
foreach (var property in logEntry.Properties.OrderBy(p => p.Key))
107+
{
108+
bool isNonDeterministic = _nonDeterministicPropertyNames.Contains(property.Key);
109+
if (isNonDeterministic && ctx.HideNonDeterministicProperties)
110+
continue;
111+
ctx.Writer.WritePropertyName(property.Key);
112+
113+
if (isNonDeterministic)
114+
ctx.Writer.WriteValue(_nonDeterministicPropertyValueSubstitute);
115+
else
116+
ctx.Writer.WriteValue(property.Value);
117+
}
118+
ctx.Writer.WriteEndObject();
119+
}
120+
}
121+
122+
private void WriteMessageTemplate(Context ctx, LogEntry logEntry)
123+
{
124+
if (ctx.IsWritingMessageTemplate)
125+
{
126+
ctx.Writer.WritePropertyName(nameof(Settings.MessageTemplate));
127+
ctx.Writer.WriteValue(logEntry.OriginalMessage);
128+
}
129+
}
130+
88131
private static void WriteException(Context ctx, LogEntry logEntry)
89132
{
90133
var ex = logEntry.Exception;

src/Stravaig.Extensions.Logging.Diagnostics.Verify/Settings.cs

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,12 @@ public enum Settings
6363

6464
StackTrace = 0x0000_0200,
6565

66+
MessageTemplate = 0x0000_0400,
67+
68+
Properties = 0x0000_0800,
69+
70+
HideNonDeterministicProperties = 0x0000_1000,
71+
6672
/// <summary>
6773
/// Indicates the default settings are to be used.
6874
/// </summary>

src/Stravaig.Extensions.Logging.Diagnostics.Verify/VerifySettingsExtensions.cs

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,7 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Collections.Immutable;
4+
using System.Linq;
15
using VerifyTests;
26

37
namespace Stravaig.Extensions.Logging.Diagnostics.Verify;
@@ -9,16 +13,19 @@ public static class VerifySettingsExtensions
913
/// </summary>
1014
/// <param name="verifySettings">The verify settings object to modify.</param>
1115
/// <param name="settings">The settings for verifying the tests.</param>
16+
/// <param name="nonDeterministicPropertyNames">A collection of property names to exclude from the output because their values are non-deterministic</param>
1217
/// <returns>The verify Settings object.</returns>
13-
public static VerifySettings AddStravaigTests(this VerifySettings verifySettings, Settings settings = Settings.Default)
18+
19+
public static VerifySettings AddStravaigTests(this VerifySettings verifySettings, Settings settings = Settings.Default, IEnumerable<string>? nonDeterministicPropertyNames = null, string nonDeterministicPropertyValueSubstitute = LogEntryConverter.DefaultNonDeterministicPropertyValueSubstitute)
1420
{
21+
var nonDeterministicPropertySet = ImmutableHashSet.Create(StringComparer.Ordinal, nonDeterministicPropertyNames?.ToArray() ?? Array.Empty<string>());
1522
verifySettings.AddExtraSettings(jsonSettings =>
1623
{
1724
// Remove the default version if it exists.
1825
jsonSettings.Converters.RemoveAll(c => c is LogEntryConverter);
1926

2027
// Create replacement converter.
21-
var logEntryConverter = new LogEntryConverter(settings);
28+
var logEntryConverter = new LogEntryConverter(settings, nonDeterministicPropertySet, nonDeterministicPropertyValueSubstitute);
2229
jsonSettings.Converters.Add(logEntryConverter);
2330
});
2431
return verifySettings;

0 commit comments

Comments
 (0)