Skip to content

Error messages improvements #14

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 38 commits into from
Jun 3, 2020
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
c7a2bb5
Refactor ActionResultAssertions: Types in messages with fullname, Act…
faddiv Apr 6, 2020
3921ba1
Fix ContentResultAssertions messages.
faddiv Apr 7, 2020
3fd233d
Fix FileContentResultAssertions messages.
faddiv Apr 7, 2020
80af63b
Fix FileResultAssertions messages.
faddiv Apr 8, 2020
37984f7
Fix JsonResultAssertions messages.
faddiv Apr 8, 2020
afec7e7
Fix ViewResultAssertions and PartialViewResultAssertions messages. Ad…
faddiv Apr 10, 2020
976f5c5
Fix VirtualFileResult and PhysicalFileResult messages.
faddiv Apr 11, 2020
9cc95cd
Fix StatusCodeResultAssertions messages.
faddiv Apr 11, 2020
88d2825
Fix RouteDataAssertions messages.
faddiv Apr 11, 2020
7db8cf0
Fix RedirectResultAssertions, RedirectToActionResultAssertions, Redir…
faddiv Apr 12, 2020
22c139e
Merge remote-tracking branch 'upstream/master' into ErrorMessagesFix
faddiv Apr 28, 2020
d3b272a
Use new message formats in resx. Update properties.
faddiv Apr 28, 2020
7467117
Fix VirtualFileAssertions.
faddiv Apr 28, 2020
2400d9b
Fix SignOutResultAssertions tests.
faddiv Apr 28, 2020
430c086
Fix SignInResultAssertions Tests. Extracted RoundToSeconds method and…
faddiv Apr 29, 2020
f869aa3
Fix PhysicalFileResultAssertions tests.
faddiv Apr 29, 2020
06f8468
Fix NotFoundObjectResultAssertions and OkObjectResultAssertions tests.
faddiv Apr 29, 2020
2fa8b17
Fix LocalRedirectObjectResultAssertions and JsonResultAssertions Tests.
faddiv Apr 29, 2020
15a18e8
Fix ForbidResultAssertions Tests. Test DateTimeOffset? with ==
faddiv Apr 29, 2020
d503863
Fix CreatedResultAssertions tests.
faddiv Apr 29, 2020
5a85f70
Fix CreatedAtRouteResultAssertions tests.
faddiv Apr 29, 2020
7fef170
Fix CreatedAtActionResultAssertions tests.
faddiv Apr 29, 2020
297b9ce
Modify type message checks.
faddiv Apr 29, 2020
2688709
Fix ChallengeResultAssertions tests.
faddiv Apr 29, 2020
7b512db
Extract GetConvertedDateTimeOffset rename RoundToSeconds. Make Test d…
faddiv Apr 29, 2020
7a6a041
Fix BadRequestObjectResultAssertions tests.
faddiv Apr 29, 2020
e621d1a
Fix ActionResultAssertions tests. Change returning fail messages. Ext…
faddiv Apr 29, 2020
970fc9a
Fix AcceptedResultAssertions tests.
faddiv Apr 29, 2020
f760491
Fix AcceptedAtRouteResultAssertions tests.
faddiv Apr 29, 2020
b79bd73
Fix AcceptedAtActionResultAssertions tests.
faddiv Apr 29, 2020
f54c07f
Clean up unused messages.
faddiv Apr 30, 2020
1ec0019
Fix missing comments.
faddiv Apr 30, 2020
a323393
Remove unused ControllerAssertions.
faddiv Apr 30, 2020
eb30805
Fix reason and reasonArgs doc comments.
faddiv Apr 30, 2020
34d32bb
Extract FileResultAssertions common method into base class.
faddiv Apr 30, 2020
74317c6
Improve error messages on ContainsItem authentication result assertions.
faddiv Apr 30, 2020
54ef634
Extract GetAbsoluteUri.
faddiv Apr 30, 2020
2ba35e7
Improve Casting test's names.
faddiv Apr 30, 2020
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -378,7 +378,7 @@ public IActionResult GetPhysicalFile(string physicalPath, string contentType, st
[HttpGet]
public IActionResult GetVirtualFileResult(string fileName, string contentType)
{
return new VirtualFileResult(fileName, contentType);
return File(fileName, contentType);
}

[HttpGet]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public AcceptedAtActionResultAssertions(AcceptedAtActionResult subject) : base(s
/// is needed. If the phrase does not start with the word <i>because</i>, it is prepended automatically.
/// </param>
/// <param name="reasonArgs">
/// Zero or more objects to format using the placeholders in <see cref="reason" />.
/// Zero or more objects to format using the placeholders in <paramref name="reason"/>.
/// </param>
public AcceptedAtActionResultAssertions WithActionName(string expectedActionName, string reason = "", params object[] reasonArgs)
{
Expand All @@ -35,7 +35,8 @@ public AcceptedAtActionResultAssertions WithActionName(string expectedActionName
Execute.Assertion
.ForCondition(string.Equals(actualActionName, expectedActionName, StringComparison.OrdinalIgnoreCase))
.BecauseOf(reason, reasonArgs)
.FailWith("Expected AcceptedAtActionResult.ActionName to be {0}{reason} but was {1}", expectedActionName, actualActionName);
.WithDefaultIdentifier("AcceptedAtActionResult.ActionName")
.FailWith(FailureMessages.CommonFailMessage, expectedActionName, actualActionName);

return this;
}
Expand All @@ -45,11 +46,11 @@ public AcceptedAtActionResultAssertions WithActionName(string expectedActionName
/// </summary>
/// <param name="expectedControllerName">The expected controller.</param>
/// <param name="reason">
/// A formatted phrase as is supported by <see cref="string.Format(string,object[])" /> explaining why the assertion
/// A formatted phrase as is supported by <see cref="string.Format(string,object[])" /> explaining why the assertion
/// is needed. If the phrase does not start with the word <i>because</i>, it is prepended automatically.
/// </param>
/// <param name="reasonArgs">
/// Zero or more objects to format using the placeholders in <see cref="reason" />.
/// Zero or more objects to format using the placeholders in <paramref name="reason"/>.
/// </param>
public AcceptedAtActionResultAssertions WithControllerName(string expectedControllerName, string reason = "", params object[] reasonArgs)
{
Expand All @@ -58,7 +59,8 @@ public AcceptedAtActionResultAssertions WithControllerName(string expectedContro
Execute.Assertion
.ForCondition(string.Equals(actualControllerName, expectedControllerName, StringComparison.OrdinalIgnoreCase))
.BecauseOf(reason, reasonArgs)
.FailWith("Expected AcceptedAtActionResult.ControllerName to be {0}{reason} but was {1}", expectedControllerName, actualControllerName);
.WithDefaultIdentifier("AcceptedAtActionResult.ControllerName")
.FailWith(FailureMessages.CommonFailMessage, expectedControllerName, actualControllerName);

return this;
}
Expand All @@ -69,27 +71,18 @@ public AcceptedAtActionResultAssertions WithControllerName(string expectedContro
/// <param name="key">The expected key.</param>
/// <param name="expectedValue">The expected value.</param>
/// <param name="reason">
/// A formatted phrase as is supported by <see cref="string.Format(string,object[])" /> explaining why the assertion
/// A formatted phrase as is supported by <see cref="string.Format(string,object[])" /> explaining why the assertion
/// is needed. If the phrase does not start with the word <i>because</i>, it is prepended automatically.
/// </param>
/// <param name="reasonArgs">
/// Zero or more objects to format using the placeholders in <see cref="reason" />.
/// Zero or more objects to format using the placeholders in <paramref name="reason"/>.
/// </param>
public AcceptedAtActionResultAssertions WithRouteValue(string key, object expectedValue, string reason = "", params object[] reasonArgs)
{
var subjectTyped = Subject as AcceptedAtActionResult;

Execute.Assertion
.ForCondition(subjectTyped != null && subjectTyped.RouteValues.ContainsKey(key))
.BecauseOf(reason, reasonArgs)
.FailWith(FailureMessages.AcceptedAtActionResult_RouteValues_ContainsKey, key);

var actualValue = subjectTyped.RouteValues[key];

Execute.Assertion
.ForCondition(expectedValue.Equals(actualValue))
.BecauseOf(reason, reasonArgs)
.FailWith(FailureMessages.AcceptedAtActionResult_RouteValues_HaveValue, key, expectedValue, actualValue);
AssertionHelpers.AssertStringObjectDictionary(subjectTyped.RouteValues,
"AcceptedAtActionResult.RouteValues", key, expectedValue, reason, reasonArgs);

return this;
}
Expand All @@ -105,11 +98,14 @@ public TValue ValueAs<TValue>()
var value = subjectTyped.Value;

if (value == null)
Execute.Assertion.FailWith(FailureMessages.CommonNullWasSuppliedFailMessage, "AcceptedAtActionResult.Value", typeof(TValue).Name);
Execute.Assertion
.WithDefaultIdentifier("AcceptedAtActionResult.Value")
.FailWith(FailureMessages.CommonNullWasSuppliedFailMessage, typeof(TValue));

Execute.Assertion
.ForCondition(value is TValue)
.FailWith(FailureMessages.CommonTypeFailMessage, "AcceptedAtActionResult.Value", typeof(TValue).Name, value.GetType().Name);
.WithDefaultIdentifier("AcceptedAtActionResult.Value")
.FailWith(FailureMessages.CommonTypeFailMessage, typeof(TValue), value.GetType());

return (TValue)value;
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ public AcceptedAtRouteResultAssertions(AcceptedAtRouteResult subject) : base(sub
/// is needed. If the phrase does not start with the word <i>because</i>, it is prepended automatically.
/// </param>
/// <param name="reasonArgs">
/// Zero or more objects to format using the placeholders in <see cref="reason" />.
/// Zero or more objects to format using the placeholders in <paramref name="reason"/>.
/// </param>
public AcceptedAtRouteResultAssertions WithRouteName(string expectedRouteName, string reason = "", params object[] reasonArgs)
{
Expand All @@ -35,7 +35,8 @@ public AcceptedAtRouteResultAssertions WithRouteName(string expectedRouteName, s
Execute.Assertion
.BecauseOf(reason, reasonArgs)
.ForCondition(string.Equals(expectedRouteName, subjectTyped.RouteName, StringComparison.OrdinalIgnoreCase))
.FailWith(FailureMessages.CommonFailMessage, "AcceptedAtRouteResult.RouteName", expectedRouteName, subjectTyped.RouteName);
.WithDefaultIdentifier("AcceptedAtRouteResult.RouteName")
.FailWith(FailureMessages.CommonFailMessage, expectedRouteName, subjectTyped.RouteName);

return this;
}
Expand All @@ -50,23 +51,14 @@ public AcceptedAtRouteResultAssertions WithRouteName(string expectedRouteName, s
/// is needed. If the phrase does not start with the word <i>because</i>, it is prepended automatically.
/// </param>
/// <param name="reasonArgs">
/// Zero or more objects to format using the placeholders in <see cref="reason" />.
/// Zero or more objects to format using the placeholders in <paramref name="reason"/>.
/// </param>
public AcceptedAtRouteResultAssertions WithRouteValue(string key, object expectedValue, string reason = "", params object[] reasonArgs)
{
var subjectTyped = Subject as AcceptedAtRouteResult;

Execute.Assertion
.ForCondition(subjectTyped != null && subjectTyped.RouteValues.ContainsKey(key))
.BecauseOf(reason, reasonArgs)
.FailWith(FailureMessages.AcceptedAtRouteResult_RouteValues_ContainsKey, key);

var actualValue = subjectTyped.RouteValues[key];

Execute.Assertion
.ForCondition(expectedValue.Equals(actualValue))
.BecauseOf(reason, reasonArgs)
.FailWith(FailureMessages.AcceptedAtRouteResult_RouteValues_HaveValue, key, expectedValue, actualValue);
AssertionHelpers.AssertStringObjectDictionary(subjectTyped.RouteValues,
"AcceptedAtRouteResult.RouteValues", key, expectedValue, reason, reasonArgs);

return this;
}
Expand All @@ -82,11 +74,14 @@ public TValue ValueAs<TValue>()
var value = subjectTyped.Value;

if (value == null)
Execute.Assertion.FailWith(FailureMessages.CommonNullWasSuppliedFailMessage, "AcceptedAtRouteResult.Value", typeof(TValue).Name);
Execute.Assertion
.WithDefaultIdentifier("AcceptedAtRouteResult.Value")
.FailWith(FailureMessages.CommonNullWasSuppliedFailMessage, typeof(TValue));

Execute.Assertion
.ForCondition(value is TValue)
.FailWith(FailureMessages.CommonTypeFailMessage, "AcceptedAtRouteResult.Value", typeof(TValue).Name, value.GetType().Name);
.WithDefaultIdentifier("AcceptedAtRouteResult.Value")
.FailWith(FailureMessages.CommonTypeFailMessage, typeof(TValue), value.GetType());

return (TValue)value;
}
Expand Down
37 changes: 28 additions & 9 deletions src/FluentAssertions.AspNetCore.Mvc/AcceptedResultAssertions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -50,11 +50,14 @@ public TValue ValueAs<TValue>()
var value = AcceptedResultSubject.Value;

if (value == null)
Execute.Assertion.FailWith(FailureMessages.CommonNullWasSuppliedFailMessage, "AcceptedResultAssertions.Value", typeof(TValue).Name);
Execute.Assertion
.WithDefaultIdentifier("AcceptedResultAssertions.Value")
.FailWith(FailureMessages.CommonNullWasSuppliedFailMessage, typeof(TValue));

Execute.Assertion
.ForCondition(value is TValue)
.FailWith(FailureMessages.CommonTypeFailMessage, "AcceptedResultAssertions.Value", typeof(TValue).Name, value.GetType().Name);
.WithDefaultIdentifier("AcceptedResultAssertions.Value")
.FailWith(FailureMessages.CommonTypeFailMessage, typeof(TValue), value.GetType());

return (TValue)value;
}
Expand All @@ -65,16 +68,23 @@ public TValue ValueAs<TValue>()
/// <param name="uri">
/// The Uri.
/// </param>
/// <param name="reason">
/// A formatted phrase as is supported by <see cref="string.Format(string,object[])" /> explaining why the assertion
/// is needed. If the phrase does not start with the word <i>because</i>, it is prepended automatically.
/// </param>
/// <param name="reasonArgs">
/// Zero or more objects to format using the placeholders in <paramref name="reason"/>.
/// </param>
/// <returns>The typed value.</returns>
public AcceptedResultAssertions WithUri(Uri uri)
public AcceptedResultAssertions WithUri(Uri uri, string reason = "", params object[] reasonArgs)
{
var expectedUri = !uri.IsAbsoluteUri
? uri.GetComponents(UriComponents.SerializationInfoString, UriFormat.UriEscaped)
: uri.AbsoluteUri;
var expectedUri = AssertionHelpers.GetAbsoluteUri(uri);

Execute.Assertion
.BecauseOf(reason, reasonArgs)
.ForCondition(expectedUri == Location)
.FailWith(FailureMessages.CommonFailMessage, "AcceptedResultAssertions.Uri", expectedUri, Location);
.WithDefaultIdentifier("AcceptedResultAssertions.Uri")
.FailWith(FailureMessages.CommonFailMessage, expectedUri, Location);

return this;
}
Expand All @@ -85,12 +95,21 @@ public AcceptedResultAssertions WithUri(Uri uri)
/// <param name="uri">
/// The Uri as string.
/// </param>
/// <param name="reason">
/// A formatted phrase as is supported by <see cref="string.Format(string,object[])" /> explaining why the assertion
/// is needed. If the phrase does not start with the word <i>because</i>, it is prepended automatically.
/// </param>
/// <param name="reasonArgs">
/// Zero or more objects to format using the placeholders in <paramref name="reason"/>.
/// </param>
/// <returns>The typed value.</returns>
public AcceptedResultAssertions WithUri(string uri)
public AcceptedResultAssertions WithUri(string uri, string reason = "", params object[] reasonArgs)
{
Execute.Assertion
.BecauseOf(reason, reasonArgs)
.ForCondition(uri == Location)
.FailWith(FailureMessages.CommonFailMessage, "AcceptedResultAssertions.Uri", uri, Location);
.WithDefaultIdentifier("AcceptedResultAssertions.Uri")
.FailWith(FailureMessages.CommonFailMessage, uri, Location);

return this;
}
Expand Down
Loading