Skip to content

Commit 61d74fb

Browse files
Added FromError / FromException methods and various tests
1 parent 6a5c62e commit 61d74fb

4 files changed

Lines changed: 200 additions & 32 deletions

File tree

src/OneBitSoftware.Utilities.OperationResult/OneBitSoftware.Utilities.OperationResult.csproj

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
<PackageRequireLicenseAcceptance>False</PackageRequireLicenseAcceptance>
3232
<PackageReadmeFile>README.md</PackageReadmeFile>
3333
<PackageTags>OneBitSoftware; OperationResult;</PackageTags>
34-
<Version>1.1.5</Version>
34+
<Version>1.1.6</Version>
3535
</PropertyGroup>
3636

3737
</Project>

src/OneBitSoftware.Utilities.OperationResult/OperationResult.cs

Lines changed: 33 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,11 +59,14 @@ public OperationResult()
5959
/// <summary>
6060
/// Initializes a new instance of the <see cref="OperationResult"/> class.
6161
/// </summary>
62-
/// <param name="loggerService">An instance of <see cref="ILogger"/> to use for automatic logging.</param>
62+
/// <param name="logger">An instance of <see cref="ILogger"/> to use for automatic logging.</param>
6363
/// <remarks>If the operation is a get operation, an empty result (no results) must return a truthy Success value.</remarks>
64-
public OperationResult(ILogger loggerService)
64+
public OperationResult(ILogger? logger)
6565
{
66-
this._logger = loggerService;
66+
if (logger is not null)
67+
{
68+
this._logger = logger;
69+
}
6770
}
6871

6972
/// <summary>
@@ -157,6 +160,33 @@ public OperationResult AppendException(Exception exception, int errorCode = 0, L
157160
/// <returns>All error messages, joined with a new line character.</returns>
158161
public override string ToString() => string.Join(Environment.NewLine, this.Errors);
159162

163+
/// <summary>
164+
/// Creates an instance of <see cref="OperationResult"/> and appends the passed exception to it's error collection.
165+
/// </summary>
166+
/// <param name="exception">The <see cref="Exception"/> to append.</param>
167+
/// <param name="logger">An optional instance of <see cref="ILogger"/>.</param>
168+
/// <returns>An <see cref="OperationResult"/> containing the passed exception.</returns>
169+
public static OperationResult FromException(Exception exception, ILogger? logger = null)
170+
{
171+
var result = new OperationResult(logger);
172+
return result.AppendException(exception);
173+
}
174+
175+
/// <summary>
176+
/// Creates an instance of <see cref="OperationResult"/> and appends the passed error message details to it's internal error collection.
177+
/// </summary>
178+
/// <param name="message">A message to append to the internal errors collection.</param>
179+
/// <param name="code">An optional code to include in the error.</param>
180+
/// <param name="logLevel">A log event level. Defaults to Error.</param>
181+
/// <param name="details">An optional detail message to add to the error.</param>
182+
/// <param name="logger">An optional instance of <see cref="ILogger"/>.</param>
183+
/// <returns>An <see cref="OperationResult"/> containing the passed exception.</returns>
184+
public static OperationResult FromError(string message, int? code = null, LogLevel logLevel = LogLevel.Error, string? details = null, ILogger? logger = null)
185+
{
186+
var result = new OperationResult(logger);
187+
return result.AppendError(message, code, logLevel, details);
188+
}
189+
160190
// TODO: this method needs completing.
161191
private static LogLevel GetLogLevel(LogLevel? optionalLevel) => optionalLevel ?? LogLevel.Error;
162192

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
namespace OneBitSoftware.Utilities.OperationResultTests;
2+
3+
using System;
4+
using System.Collections.Generic;
5+
using System.Linq;
6+
using System.Text;
7+
using System.Threading.Tasks;
8+
using Microsoft.Extensions.Logging;
9+
using Xunit;
10+
11+
public class OperationResultAppendErrorsTests
12+
{
13+
[Fact]
14+
public void AppendErrors_ShouldListAllErrors()
15+
{
16+
// Arrange
17+
var errorCode1 = 666;
18+
var message1 = "Error";
19+
var detail1 = "Detail";
20+
var operationResultTarget = new OperationResult();
21+
operationResultTarget.AppendError(message1, errorCode1, LogLevel.Debug, detail1);
22+
operationResultTarget.AppendException(new Exception(message1));
23+
24+
var errorCode2 = 669;
25+
var message2 = "Error2";
26+
var detail2 = "Detail2";
27+
var operationResultBase = new OperationResult();
28+
operationResultBase.AppendError(message2, errorCode2, LogLevel.Debug, detail2);
29+
30+
// Act
31+
operationResultBase.AppendErrors(operationResultTarget);
32+
33+
// Assert
34+
Assert.False(operationResultBase.Success);
35+
Assert.False(operationResultTarget.Success);
36+
Assert.True(operationResultBase.Fail);
37+
Assert.True(operationResultTarget.Fail);
38+
39+
Assert.Equal(3, operationResultBase.Errors.Count);
40+
Assert.Equal(2, operationResultTarget.Errors.Count);
41+
42+
Assert.NotNull(operationResultBase.Errors.Single(r => r.Code.Equals(errorCode2)));
43+
Assert.NotNull(operationResultBase.Errors.Single(r => r.Message.Equals(message2)));
44+
Assert.NotNull(operationResultBase.Errors.Single(r => r.Details is not null && r.Details.Equals(detail2)));
45+
}
46+
47+
[Fact]
48+
public void AppendErrorsT_ShouldListAllErrors()
49+
{
50+
// Arrange
51+
var errorCode1 = 666;
52+
var message1 = "Error";
53+
var detail1 = "Detail";
54+
var operationResultTarget = new OperationResult<object>();
55+
operationResultTarget.AppendError(message1, errorCode1, LogLevel.Debug, detail1);
56+
operationResultTarget.AppendException(new Exception(message1));
57+
58+
var errorCode2 = 669;
59+
var message2 = "Error2";
60+
var detail2 = "Detail2";
61+
var operationResultBase = new OperationResult<object>();
62+
operationResultBase.AppendError(message2, errorCode2, LogLevel.Debug, detail2);
63+
64+
// Act
65+
operationResultBase.AppendErrors(operationResultTarget);
66+
67+
// Assert
68+
Assert.False(operationResultBase.Success);
69+
Assert.False(operationResultTarget.Success);
70+
Assert.True(operationResultBase.Fail);
71+
Assert.True(operationResultTarget.Fail);
72+
73+
Assert.Equal(3, operationResultBase.Errors.Count);
74+
Assert.Equal(2, operationResultTarget.Errors.Count);
75+
76+
Assert.NotNull(operationResultBase.Errors.Single(r => r.Code.Equals(errorCode2)));
77+
Assert.NotNull(operationResultBase.Errors.Single(r => r.Message.Equals(message2)));
78+
Assert.NotNull(operationResultBase.Errors.Single(r => r.Details is not null && r.Details.Equals(detail2)));
79+
}
80+
}
Lines changed: 86 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -1,39 +1,97 @@
1-
using Xunit;
1+
namespace OneBitSoftware.Utilities.OperationResultTests;
22

3-
namespace OneBitSoftware.Utilities.OperationResultTests
3+
using Microsoft.Extensions.Logging;
4+
using Xunit;
5+
6+
public class OperationResultConstructorTests
47
{
5-
public class OperationResultConstructorTests
8+
[Fact]
9+
public void NewOperationResult_ShouldNotBeNull()
610
{
7-
[Fact]
8-
public void NewOperationResult_ShouldNotBeNull()
9-
{
10-
var sut = new OperationResult();
11+
var sut = new OperationResult();
1112

12-
Assert.NotNull(sut);
13-
}
13+
Assert.NotNull(sut);
14+
Assert.True(sut.Success);
15+
Assert.False(sut.Fail);
16+
}
1417

15-
[Fact]
16-
public void NewOperationResultWithNullLogger_ShouldSucceed()
17-
{
18-
var sut = new OperationResult(null);
18+
[Fact]
19+
public void NewOperationResultWithNullLogger_ShouldSucceed()
20+
{
21+
var sut = new OperationResult(null);
22+
23+
Assert.NotNull(sut);
24+
Assert.True(sut.Success);
25+
Assert.False(sut.Fail);
26+
}
1927

20-
Assert.NotNull(sut);
21-
}
28+
[Fact]
29+
public void NewOperationResultT_ShouldNotBeNull()
30+
{
31+
var sut = new OperationResult<object>();
2232

23-
[Fact]
24-
public void NewOperationResultT_ShouldNotBeNull()
25-
{
26-
var sut = new OperationResult<object>();
33+
Assert.NotNull(sut);
34+
Assert.True(sut.Success);
35+
Assert.False(sut.Fail);
36+
}
2737

28-
Assert.NotNull(sut);
29-
}
38+
[Fact]
39+
public void NewOperationResultTWithNullLogger_ShouldSucceed()
40+
{
41+
var sut = new OperationResult<object>(null);
3042

31-
[Fact]
32-
public void NewOperationResultTWithNullLogger_ShouldSucceed()
33-
{
34-
var sut = new OperationResult<object>(null);
43+
Assert.NotNull(sut);
44+
Assert.True(sut.Success);
45+
Assert.False(sut.Fail);
46+
}
3547

36-
Assert.NotNull(sut);
37-
}
48+
[Fact]
49+
public void NewOperationResultFromException_ShouldSucceed()
50+
{
51+
var result = OperationResult.FromException(new Exception());
52+
Assert.NotNull(result);
53+
Assert.False(result.Success);
54+
Assert.True(result.Fail);
55+
}
56+
57+
[Fact]
58+
public void NewOperationResultTFromException_ShouldSucceed()
59+
{
60+
var result = OperationResult<object>.FromException(new Exception());
61+
Assert.NotNull(result);
62+
Assert.False(result.Success);
63+
Assert.True(result.Fail);
64+
}
65+
66+
[Fact]
67+
public void NewOperationResultTFromError_ShouldSucceed()
68+
{
69+
var errorCode = 666;
70+
var message = "Error";
71+
var detail = "Detail";
72+
var result = OperationResult<object>.FromError(message, errorCode, LogLevel.Debug, detail, null);
73+
Assert.NotNull(result);
74+
Assert.False(result.Success);
75+
Assert.True(result.Fail);
76+
Assert.True(result.Errors.Any(e => e.Code.Equals(errorCode)));
77+
Assert.True(result.Errors.Any(e => e.Message.Equals(message)));
78+
Assert.True(result.Errors.Any(e => e.Details != null && e.Details.Equals(detail)));
79+
Assert.Equal(1, result.Errors.Count);
80+
}
81+
82+
[Fact]
83+
public void NewOperationResultFromError_ShouldSucceed()
84+
{
85+
var errorCode = 666;
86+
var message = "Error";
87+
var detail = "Detail";
88+
var result = OperationResult.FromError(message, errorCode, LogLevel.Debug, detail, null);
89+
Assert.NotNull(result);
90+
Assert.False(result.Success);
91+
Assert.True(result.Fail);
92+
Assert.True(result.Errors.Any(e => e.Code.Equals(errorCode)));
93+
Assert.True(result.Errors.Any(e => e.Message.Equals(message)));
94+
Assert.True(result.Errors.Any(e => e.Details != null && e.Details.Equals(detail)));
95+
Assert.Equal(1, result.Errors.Count);
3896
}
39-
}
97+
}

0 commit comments

Comments
 (0)