Skip to content

Commit 6620663

Browse files
Edge case fix - when we merge operationresults
and one class doesn't have a logger - we now log
1 parent 118bcf0 commit 6620663

3 files changed

Lines changed: 90 additions & 2 deletions

File tree

src/OneBitSoftware.Utilities.OperationResult/OperationResult.cs

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,18 @@ public OperationResult AppendErrors(OperationResult otherOperationResult)
9393
{
9494
if (otherOperationResult is null) return this;
9595

96-
// Append the error message without logging (presuming that there is already a log message).
97-
foreach (var error in otherOperationResult.Errors) this.AppendErrorInternal(error);
96+
foreach (var error in otherOperationResult.Errors)
97+
{
98+
this.AppendErrorInternal(error);
99+
100+
// Logs messages if the other operation result does not have a logger
101+
// BUG: We don't know the severity of the message and need to assume a level.
102+
// The task is to make IOperationError have info about the severity, so it can be used here
103+
if (this._logger is not null && otherOperationResult._logger is null)
104+
{
105+
this._logger.Log(LogLevel.Error, error.Message);
106+
}
107+
}
98108

99109
return this;
100110
}

tests/OneBitSoftware.Utilities.OperationResultTests/OperationResultAppendErrorsTests.cs

Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,4 +111,54 @@ public void AppendErrorsStringInt_ShouldListAllErrors()
111111
Assert.NotNull(operationResultBase.Errors.Single(r => r.Message.Equals(message2)));
112112
Assert.NotNull(operationResultBase.Errors.Single(r => r.Details is not null && r.Details.Equals(detail2)));
113113
}
114+
115+
[Fact]
116+
public void AppendErrors_ShouldLogWhenCreatedWithALogger()
117+
{
118+
// Arrange
119+
var testLogger = new TestLogger();
120+
var operationResultNoLogger = new OperationResult();
121+
var operationResultWithLogger = new OperationResult(testLogger);
122+
123+
// Act
124+
operationResultNoLogger.AppendError("test");
125+
operationResultWithLogger.AppendErrors(operationResultNoLogger);
126+
127+
// Assert
128+
Assert.Equal(1, testLogger.LogMessages.Count);
129+
}
130+
131+
[Fact]
132+
public void AppendErrors_ShouldLogOnceWhenCreatedWithALogger()
133+
{
134+
// Arrange
135+
var testLogger = new TestLogger();
136+
var operationResultWithLogger = new OperationResult(testLogger);
137+
var operationResultWithLogger2 = new OperationResult(testLogger);
138+
139+
// Act
140+
operationResultWithLogger2.AppendError("test");
141+
operationResultWithLogger.AppendErrors(operationResultWithLogger2);
142+
143+
// Assert
144+
Assert.Equal(1, testLogger.LogMessages.Count);
145+
}
146+
147+
148+
149+
[Fact]
150+
public void AppendErrors_ShouldLogWhenCreatedWithNoLogger()
151+
{
152+
// Arrange
153+
var testLogger = new TestLogger();
154+
var operationResultNoLogger = new OperationResult();
155+
var operationResultWithLogger = new OperationResult(testLogger);
156+
157+
// Act
158+
operationResultWithLogger.AppendError("test");
159+
operationResultNoLogger.AppendErrors(operationResultNoLogger);
160+
161+
// Assert
162+
Assert.Equal(1, testLogger.LogMessages.Count);
163+
}
114164
}
Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,28 @@
1+
using System;
2+
using System.Collections.Generic;
3+
using System.Linq;
4+
using System.Text;
5+
using System.Threading.Tasks;
6+
using Microsoft.Extensions.Logging;
7+
8+
namespace OneBitSoftware.Utilities.OperationResultTests
9+
{
10+
public class TestLogger : ILogger
11+
{
12+
private readonly List<string> _logMessages = new List<string>();
13+
14+
public IReadOnlyList<string> LogMessages => _logMessages.AsReadOnly();
15+
16+
public IDisposable BeginScope<TState>(TState state) => null;
17+
18+
public bool IsEnabled(LogLevel logLevel) => true;
19+
20+
public void Log<TState>(LogLevel logLevel, EventId eventId, TState state, Exception exception, Func<TState, Exception, string> formatter)
21+
{
22+
if (formatter != null)
23+
{
24+
_logMessages.Add(formatter(state, exception));
25+
}
26+
}
27+
}
28+
}

0 commit comments

Comments
 (0)