Skip to content

Commit

Permalink
added WithMessageArgument to the test helper extension
Browse files Browse the repository at this point in the history
  • Loading branch information
Dan Scott authored and JeremySkinner committed Feb 15, 2020
1 parent f8d44c5 commit ec3872e
Show file tree
Hide file tree
Showing 2 changed files with 44 additions and 8 deletions.
27 changes: 25 additions & 2 deletions src/FluentValidation.Tests/ValidatorTesterTester.cs
Original file line number Diff line number Diff line change
Expand Up @@ -369,9 +369,32 @@ public class ValidatorTesterTester {
}

exceptionCaught.ShouldEqual(errMessages.Contains(withoutErrMsg));
}
}

[Fact]
[Fact]
public void Expected_message_argument_check() {
bool exceptionCaught = false;

try {
var validator = new InlineValidator<Person> {
v => v.RuleFor(x => x.Surname)
.Must((x, y, context) => {
context.MessageFormatter.AppendArgument("Foo", "bar");
return false;
})
.WithMessage("{Foo}")
};
validator.ShouldHaveValidationErrorFor(x => x.Surname, null as string).WithMessageArgument("Foo", "foo");
}
catch (ValidationTestException e) {
exceptionCaught = true;
e.Message.ShouldEqual("Expected message argument 'Foo' with value 'foo'. Actual value was 'bar'");
}

exceptionCaught.ShouldBeTrue();
}

[Fact]
public void Expected_state_check() {
bool exceptionCaught = false;

Expand Down
25 changes: 19 additions & 6 deletions src/FluentValidation/TestHelper/ValidatorTestExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -120,12 +120,20 @@ public static class ValidationTestExtension {
}

private static string BuildErrorMessage(ValidationFailure failure, string exceptionMessage, string defaultMessage) {
if (exceptionMessage != null && failure != null) {
return exceptionMessage.Replace("{Code}", failure.ErrorCode)
.Replace("{Message}", failure.ErrorMessage)
.Replace("{State}", failure.CustomState?.ToString() ?? "")
.Replace("{Severity}", failure.Severity.ToString());
}
if (exceptionMessage != null && failure != null) {
var formattedExceptionMessage = exceptionMessage.Replace("{Code}", failure.ErrorCode)
.Replace("{Message}", failure.ErrorMessage)
.Replace("{State}", failure.CustomState?.ToString() ?? "")
.Replace("{Severity}", failure.Severity.ToString());

var messageArgumentMatches = Regex.Matches(formattedExceptionMessage, "{MessageArgument:(.*)}");
for (var i = 0; i < messageArgumentMatches.Count; i++) {
if (failure.FormattedMessagePlaceholderValues.ContainsKey(messageArgumentMatches[i].Groups[1].Value)) {
formattedExceptionMessage = formattedExceptionMessage.Replace(messageArgumentMatches[i].Value, failure.FormattedMessagePlaceholderValues[messageArgumentMatches[i].Groups[1].Value].ToString());
}
}
return formattedExceptionMessage;
}
return defaultMessage;
}

Expand Down Expand Up @@ -211,6 +219,11 @@ public static class ValidationTestExtension {
return failures.When(failure => failure.CustomState == expectedCustomState, string.Format("Expected custom state of '{0}'. Actual state was '{{State}}'", expectedCustomState));
}

public static IEnumerable<ValidationFailure> WithMessageArgument<T>(this IEnumerable<ValidationFailure> failures, string argumentKey, T argumentValue) {
return failures.When(failure => failure.FormattedMessagePlaceholderValues.ContainsKey(argumentKey) && ((T)failure.FormattedMessagePlaceholderValues[argumentKey]).Equals(argumentValue),
string.Format("Expected message argument '{0}' with value '{1}'. Actual value was '{{MessageArgument:{0}}}'", argumentKey, argumentValue.ToString()));
}

public static IEnumerable<ValidationFailure> WithErrorMessage(this IEnumerable<ValidationFailure> failures, string expectedErrorMessage) {
return failures.When(failure => failure.ErrorMessage == expectedErrorMessage, string.Format("Expected an error message of '{0}'. Actual message was '{{Message}}'", expectedErrorMessage));
}
Expand Down

0 comments on commit ec3872e

Please sign in to comment.