Skip to content

Commit ee1ee26

Browse files
CSHARP-3396: Expose the Reason an Operation Fails Document Validation (#566)
1 parent 81c1adb commit ee1ee26

File tree

11 files changed

+397
-95
lines changed

11 files changed

+397
-95
lines changed

src/MongoDB.Driver/MongoBulkWriteException.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -121,14 +121,17 @@ private static string FormatMessage(IEnumerable<BulkWriteError> writeErrors, Wri
121121
var sb = new StringBuilder("A bulk write operation resulted in one or more errors.");
122122
if (writeErrors != null)
123123
{
124+
sb.Append(" WriteErrors: [ ");
124125
foreach (var writeError in writeErrors)
125126
{
126-
sb.AppendLine().Append(" " + writeError.Message);
127+
sb.Append(writeError + ", ");
127128
}
129+
sb.Remove(sb.Length - 2, 2);
130+
sb.Append(" ].");
128131
}
129132
if (writeConcernError != null)
130133
{
131-
sb.AppendLine().Append(" " + writeConcernError.Message);
134+
sb.Append($" WriteConcernError: {writeConcernError}.");
132135
}
133136

134137
return sb.ToString();

src/MongoDB.Driver/MongoWriteException.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,11 +129,11 @@ private static string FormatMessage(WriteError writeError, WriteConcernError wri
129129
var sb = new StringBuilder("A write operation resulted in an error.");
130130
if (writeError != null)
131131
{
132-
sb.AppendLine().Append(" " + writeError.Message);
132+
sb.Append($" WriteError: {writeError}.");
133133
}
134134
if (writeConcernError != null)
135135
{
136-
sb.AppendLine().Append(" " + writeConcernError.Message);
136+
sb.Append($" WriteConcernError: {writeConcernError}.");
137137
}
138138

139139
return sb.ToString();

src/MongoDB.Driver/WriteConcernError.cs

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,12 @@
1313
* limitations under the License.
1414
*/
1515

16+
#if !NETSTANDARD1_5
1617
using System;
18+
#endif
1719
using System.Collections.Generic;
20+
using System.Linq;
21+
using System.Text;
1822
using MongoDB.Bson;
1923

2024
namespace MongoDB.Driver
@@ -93,6 +97,37 @@ public string Message
9397
get { return _message; }
9498
}
9599

100+
/// <inheritdoc/>
101+
public override string ToString()
102+
{
103+
var sb = new StringBuilder($"{{ Code : \"{_code}\"");
104+
if (_codeName != null)
105+
{
106+
sb.Append($", CodeName : \"{_codeName}\"");
107+
}
108+
if (_message != null)
109+
{
110+
sb.Append($", Message : \"{_message}\"");
111+
}
112+
if (_details != null)
113+
{
114+
sb.Append($", Details : \"{_details}\"");
115+
}
116+
if (_errorLabels != null && _errorLabels.Any())
117+
{
118+
sb.Append(", ErrorLabels : [ ");
119+
foreach (var errorLabel in _errorLabels)
120+
{
121+
sb.Append($"\"{errorLabel}\", ");
122+
}
123+
sb.Remove(sb.Length - 2, 2);
124+
sb.Append(" ]");
125+
}
126+
sb.Append(" }");
127+
128+
return sb.ToString();
129+
}
130+
96131
// internal static methods
97132
internal static WriteConcernError FromCore(Core.Operations.BulkWriteConcernError error)
98133
{

src/MongoDB.Driver/WriteError.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#if !NETSTANDARD1_5
1717
using System;
1818
#endif
19+
using System.Text;
1920
using MongoDB.Bson;
2021

2122
namespace MongoDB.Driver
@@ -75,5 +76,22 @@ public string Message
7576
{
7677
get { return _message; }
7778
}
79+
80+
/// <inheritdoc/>
81+
public override string ToString()
82+
{
83+
var stringBuilder = new StringBuilder($"{{ Category : \"{_category}\", Code : {_code}");
84+
if (_message != null)
85+
{
86+
stringBuilder.Append($", Message : \"{_message}\"");
87+
}
88+
if (_details != null)
89+
{
90+
stringBuilder.Append($", Details : \"{_details}\"");
91+
}
92+
stringBuilder.Append(" }");
93+
94+
return stringBuilder.ToString();
95+
}
7896
}
7997
}

tests/MongoDB.Driver.Tests/MongoBulkWriteExceptionTests.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,9 @@
2424
#endif
2525
using FluentAssertions;
2626
using MongoDB.Bson;
27+
#if !NETCOREAPP1_1
2728
using MongoDB.Bson.TestHelpers.EqualityComparers;
29+
#endif
2830
using MongoDB.Driver.Core.Clusters;
2931
using MongoDB.Driver.Core.Connections;
3032
using MongoDB.Driver.Core.Operations;
@@ -71,7 +73,7 @@ public void constructor_should_initialize_subject()
7173

7274
subject.ConnectionId.Should().BeSameAs(__connectionId);
7375
subject.ErrorLabels.Should().BeEquivalentTo(__writeConcernError.ErrorLabels);
74-
subject.Message.Should().Contain("bulk write operation");
76+
subject.Message.Should().Be("A bulk write operation resulted in one or more errors. WriteErrors: [ { Category : \"Uncategorized\", Code : 1, Message : \"blah\", Details : \"{ \"a\" : 1 }\" } ]. WriteConcernError: { Code : \"11\", Message : \"funny\", Details : \"{ \"c\" : 1 }\", ErrorLabels : [ \"RetryableWriteError\" ] }.");
7577
subject.Result.Should().BeSameAs(__bulkWriteResult);
7678
subject.UnprocessedRequests.Should().Equal(__unprocessedRequests);
7779
subject.WriteConcernError.Should().BeSameAs(__writeConcernError);

tests/MongoDB.Driver.Tests/MongoCollectionProseTests.cs

Lines changed: 0 additions & 84 deletions
This file was deleted.

tests/MongoDB.Driver.Tests/MongoWriteExceptionTests.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,18 @@
1515

1616
using System;
1717
using System.Collections.Generic;
18+
#if !NETCOREAPP1_1
1819
using System.IO;
20+
#endif
1921
using System.Net;
2022
#if NET452
2123
using System.Runtime.Serialization.Formatters.Binary;
2224
#endif
2325
using FluentAssertions;
2426
using MongoDB.Bson;
27+
#if !NETCOREAPP1_1
2528
using MongoDB.Bson.TestHelpers.EqualityComparers;
29+
#endif
2630
using MongoDB.Driver.Core.Clusters;
2731
using MongoDB.Driver.Core.Connections;
2832
using MongoDB.Driver.Core.Servers;
@@ -64,7 +68,7 @@ public void constructor_should_initialize_subject()
6468
subject.ConnectionId.Should().Be(__connectionId);
6569
subject.ErrorLabels.Should().BeEquivalentTo(__writeConcernError.ErrorLabels);
6670
subject.InnerException.Should().Be(__innerException);
67-
subject.Message.Should().Be("A write operation resulted in an error." + Environment.NewLine + " writeError" + Environment.NewLine + " writeConcernError");
71+
subject.Message.Should().Be("A write operation resulted in an error. WriteError: { Category : \"Uncategorized\", Code : 1, Message : \"writeError\", Details : \"{ \"details\" : \"writeError\" }\" }. WriteConcernError: { Code : \"1\", Message : \"writeConcernError\", Details : \"{ \"details\" : \"writeConcernError\" }\", ErrorLabels : [ \"RetryableWriteError\" ] }.");
6872
subject.WriteConcernError.Should().Be(__writeConcernError);
6973
subject.WriteError.Should().Be(__writeError);
7074
}
@@ -85,7 +89,7 @@ public void FromBulkWriteException_should_return_expected_result()
8589
result.ConnectionId.Should().Be(__connectionId);
8690
result.ErrorLabels.Should().BeEquivalentTo(writeConcernError.ErrorLabels);
8791
result.InnerException.Should().BeSameAs(bulkWriteException);
88-
result.Message.Should().Be("A write operation resulted in an error." + Environment.NewLine + " message" + Environment.NewLine + " message");
92+
result.Message.Should().Be("A write operation resulted in an error. WriteError: { Category : \"Uncategorized\", Code : 2, Message : \"message\", Details : \"{ \"details\" : 1 }\" }. WriteConcernError: { Code : \"1\", Message : \"message\", Details : \"{ \"details\" : 1 }\", ErrorLabels : [ \"RetryableWriteError\" ] }.");
8993
result.WriteConcernError.Should().Be(writeConcernError);
9094
result.WriteError.Should().Be(writeErrors[0]);
9195
}

0 commit comments

Comments
 (0)