Skip to content

Commit 7467117

Browse files
committed
Fix VirtualFileAssertions.
1 parent d3b272a commit 7467117

File tree

3 files changed

+65
-50
lines changed

3 files changed

+65
-50
lines changed

src/FluentAssertions.AspNetCore.Mvc/VirtualFileResultAssertions.cs

Lines changed: 12 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System;
2+
using System.Collections;
3+
using System.Collections.Generic;
24
using System.Diagnostics;
35
using FluentAssertions.Execution;
46
using FluentAssertions.Primitives;
@@ -10,7 +12,6 @@ namespace FluentAssertions.AspNetCore.Mvc
1012
/// <summary>
1113
/// Contains a number of methods to assert that a <see cref="VirtualFileResult"/> is in the expected state.
1214
/// </summary>
13-
[DebuggerNonUserCode]
1415
public class VirtualFileResultAssertions : ObjectAssertions
1516
{
1617
#region Public Constructors
@@ -61,7 +62,8 @@ public VirtualFileResultAssertions WithFileName(string expectedFileName, string
6162
Execute.Assertion
6263
.ForCondition(string.Equals(actualFileName, expectedFileName, StringComparison.OrdinalIgnoreCase))
6364
.BecauseOf(reason, reasonArgs)
64-
.FailWith(string.Format(FailureMessages.CommonFailMessage, "VirtualFileResult.FileName", expectedFileName, actualFileName));
65+
.WithDefaultIdentifier("VirtualFileResult.FileName")
66+
.FailWith(FailureMessages.CommonFailMessage, expectedFileName, actualFileName);
6567

6668
return this;
6769
}
@@ -84,7 +86,8 @@ public VirtualFileResultAssertions WithContentType(string expectedContentType, s
8486
Execute.Assertion
8587
.ForCondition(string.Equals(actualContentType, expectedContentType, StringComparison.OrdinalIgnoreCase))
8688
.BecauseOf(reason, reasonArgs)
87-
.FailWith(string.Format(FailureMessages.CommonFailMessage, "VirtualFileResult.ContentType", expectedContentType, actualContentType));
89+
.WithDefaultIdentifier("VirtualFileResult.ContentType")
90+
.FailWith(FailureMessages.CommonFailMessage, expectedContentType, actualContentType);
8891

8992
return this;
9093
}
@@ -107,7 +110,8 @@ public VirtualFileResultAssertions WithFileDownloadName(string expectedFileDownl
107110
Execute.Assertion
108111
.ForCondition(string.Equals(actualFileDownloadName, expectedFileDownloadName, StringComparison.OrdinalIgnoreCase))
109112
.BecauseOf(reason, reasonArgs)
110-
.FailWith(string.Format(FailureMessages.CommonFailMessage, "VirtualFileResult.FileDownloadName", expectedFileDownloadName, actualFileDownloadName));
113+
.WithDefaultIdentifier("VirtualFileResult.FileDownloadName")
114+
.FailWith(FailureMessages.CommonFailMessage, expectedFileDownloadName, actualFileDownloadName);
111115

112116
return this;
113117
}
@@ -127,35 +131,11 @@ public VirtualFileResultAssertions WithLastModified(DateTimeOffset? expectedLast
127131
{
128132
var actualLastModified = LastModified;
129133

130-
if (actualLastModified == null && expectedLastModified == null)
131-
{
132-
return this;
133-
}
134-
135-
if (actualLastModified == null)
136-
{
137-
Execute.Assertion
138-
.ForCondition(false)
139-
.BecauseOf(reason, reasonArgs)
140-
.FailWith(string.Format(FailureMessages.CommonFailMessage, "VirtualFileResult.LastModified", expectedLastModified, null));
141-
142-
return this;
143-
}
144-
145-
if (expectedLastModified == null)
146-
{
147-
Execute.Assertion
148-
.ForCondition(false)
149-
.BecauseOf(reason, reasonArgs)
150-
.FailWith(string.Format(FailureMessages.CommonFailMessage, "VirtualFileResult.LastModified", null, actualLastModified));
151-
152-
return this;
153-
}
154-
155134
Execute.Assertion
156-
.ForCondition(DateTimeOffset.Compare(actualLastModified.Value, expectedLastModified.Value) == 0)
135+
.ForCondition(EqualityComparer<DateTimeOffset?>.Default.Equals(actualLastModified, expectedLastModified))
157136
.BecauseOf(reason, reasonArgs)
158-
.FailWith(string.Format(FailureMessages.CommonFailMessage, "VirtualFileResult.LastModified", expectedLastModified, actualLastModified));
137+
.WithDefaultIdentifier("VirtualFileResult.LastModified")
138+
.FailWith(FailureMessages.CommonFailMessage, expectedLastModified, actualLastModified);
159139

160140
return this;
161141
}
@@ -179,7 +159,7 @@ public VirtualFileResultAssertions WithEntityTag(EntityTagHeaderValue expectedEn
179159
.ForCondition(Equals(actualEntityTag, expectedEntityTag))
180160
.BecauseOf(reason, reasonArgs)
181161
.WithDefaultIdentifier("VirtualFileResult.EntityTag")
182-
.FailWith(FailureMessages.CommonFailMessage, actualEntityTag, expectedEntityTag);
162+
.FailWith(FailureMessages.CommonFailMessage, expectedEntityTag, actualEntityTag);
183163
return this;
184164
}
185165

tests/FluentAssertions.AspNetCore.Mvc.Tests/Helpers/FailureMessageHelper.cs

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,11 @@ namespace FluentAssertions.Mvc.Tests.Helpers
55
{
66
static class FailureMessageHelper
77
{
8+
public const string Reason = "it is {0}";
9+
public readonly static object[] ReasonArgs = new[] { (object)10 };
10+
811
public static string Format(string message, params string[] args)
9-
{
12+
{
1013
var formattedArg = args.Select(x => String.Format("\"{0}\"", x)).ToArray();
1114

1215
return String.Format(message, formattedArg);
@@ -17,6 +20,11 @@ public static string ExpectedContextToBeXButY(string context, string expected, s
1720
return ExpectedContextToBeXButY(context, (object)$"\"{expected}\"", (object)$"\"{actual}\"");
1821
}
1922

23+
public static string ExpectedContextToBeXButY(string context, DateTimeOffset? expected, DateTimeOffset? actual)
24+
{
25+
return ExpectedContextToBeXButY(context, ToString(expected), ToString(actual));
26+
}
27+
2028
public static string ExpectedContextToBeXButY(string context, object expected, object actual)
2129
{
2230
return $"Expected {context} to be {expected} because it is 10 but found {actual}.";
@@ -31,5 +39,14 @@ public static string ExpectedKeyButNotFound(string context, string key, string e
3139
{
3240
return $"Expected {context} to contain value \"{expected}\" at key \"{key}\" because it is 10, but the key was not found.";
3341
}
42+
43+
private static object ToString(DateTimeOffset? expected)
44+
{
45+
if (expected.HasValue)
46+
return $"<{expected:yyyy-MM-dd HH:mm:ss.fffffff z}h>";
47+
else
48+
return "<null>";
49+
}
50+
3451
}
3552
}

tests/FluentAssertions.AspNetCore.Mvc.Tests/VirtualFileResultAssertions_Tests.cs

Lines changed: 35 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,6 @@
11
using System;
2+
using System.Globalization;
3+
using FluentAssertions.Mvc.Tests.Helpers;
24
using Microsoft.AspNetCore.Mvc;
35
using Microsoft.Net.Http.Headers;
46
using Xunit;
@@ -7,10 +9,12 @@ namespace FluentAssertions.AspNetCore.Mvc.Tests
79
{
810
public class VirtualFileResultAssertions_Tests
911
{
12+
public const string Reason = FailureMessageHelper.Reason;
13+
public readonly static object[] ReasonArgs = FailureMessageHelper.ReasonArgs;
1014
private const string TestFileName = "TestFileName";
1115
private const string TestContentType = "text/html";
1216
private const string TestFileDownloadName = "TestFileDownloadName";
13-
private readonly DateTimeOffset? TestLastModified = DateTimeOffset.Now;
17+
private readonly DateTimeOffset? TestLastModified = DateTimeOffset.Parse("2020-04-28 15:48:33.6672395 +2", CultureInfo.InvariantCulture);
1418
private readonly EntityTagHeaderValue TestEntityTag = new EntityTagHeaderValue("\"0815\"");
1519

1620
[Fact]
@@ -26,8 +30,10 @@ public void WithFileName_GivenUnexpected_ShouldFail()
2630
var actualFileName = TestFileName;
2731
var expectedFileName = "xyz";
2832
ActionResult result = new VirtualFileResult(actualFileName, TestContentType);
29-
var failureMessage = string.Format(FailureMessages.CommonFailMessage, "VirtualFileResult.FileName", expectedFileName, actualFileName);
30-
Action a = () => result.Should().BeVirtualFileResult().WithFileName(expectedFileName);
33+
var failureMessage = FailureMessageHelper.ExpectedContextToBeXButY("VirtualFileResult.FileName", expectedFileName, actualFileName);
34+
35+
Action a = () => result.Should().BeVirtualFileResult().WithFileName(expectedFileName, Reason, ReasonArgs);
36+
3137
a.Should().Throw<Exception>().WithMessage(failureMessage);
3238
}
3339

@@ -44,8 +50,10 @@ public void WithContentType_GivenUnexpected_ShouldFail()
4450
var actualContentType = TestContentType;
4551
var expectedContentType = "xyz";
4652
ActionResult result = new VirtualFileResult(string.Empty, actualContentType);
47-
var failureMessage = string.Format(FailureMessages.CommonFailMessage, "VirtualFileResult.ContentType", expectedContentType, actualContentType);
48-
Action a = () => result.Should().BeVirtualFileResult().WithContentType(expectedContentType);
53+
var failureMessage = FailureMessageHelper.ExpectedContextToBeXButY("VirtualFileResult.ContentType", expectedContentType, actualContentType);
54+
55+
Action a = () => result.Should().BeVirtualFileResult().WithContentType(expectedContentType, Reason, ReasonArgs);
56+
4957
a.Should().Throw<Exception>().WithMessage(failureMessage);
5058
}
5159

@@ -62,8 +70,10 @@ public void WithFileDownloadName_GivenUnexpected_ShouldFail()
6270
var actualFileDownloadName = TestFileDownloadName;
6371
var expectedFileDownloadName = "xyz";
6472
ActionResult result = new VirtualFileResult(string.Empty, TestContentType) { FileDownloadName = actualFileDownloadName };
65-
var failureMessage = string.Format(FailureMessages.CommonFailMessage, "VirtualFileResult.FileDownloadName", expectedFileDownloadName, actualFileDownloadName);
66-
Action a = () => result.Should().BeVirtualFileResult().WithFileDownloadName(expectedFileDownloadName);
73+
var failureMessage = FailureMessageHelper.ExpectedContextToBeXButY("VirtualFileResult.FileDownloadName", expectedFileDownloadName, actualFileDownloadName);
74+
75+
Action a = () => result.Should().BeVirtualFileResult().WithFileDownloadName(expectedFileDownloadName, Reason, ReasonArgs);
76+
6777
a.Should().Throw<Exception>().WithMessage(failureMessage);
6878
}
6979

@@ -87,10 +97,12 @@ public void WithLastModified_GivenNull_ShouldPass()
8797
public void WithLastModified_GivenActualNull_ShouldFail()
8898
{
8999
var actualLastModified = null as DateTimeOffset?;
90-
var expectedLastModified = DateTimeOffset.Now;
100+
var expectedLastModified = TestLastModified;
91101
ActionResult result = new VirtualFileResult(string.Empty, TestContentType) { LastModified = actualLastModified };
92-
var failureMessage = string.Format(FailureMessages.CommonFailMessage, "VirtualFileResult.LastModified", expectedLastModified, actualLastModified);
93-
Action a = () => result.Should().BeVirtualFileResult().WithLastModified(expectedLastModified);
102+
var failureMessage = FailureMessageHelper.ExpectedContextToBeXButY("VirtualFileResult.LastModified", expectedLastModified, actualLastModified);
103+
104+
Action a = () => result.Should().BeVirtualFileResult().WithLastModified(expectedLastModified, Reason, ReasonArgs);
105+
94106
a.Should().Throw<Exception>().WithMessage(failureMessage);
95107
}
96108

@@ -100,19 +112,23 @@ public void WithLastModified_GivenExpectedNull_ShouldFail()
100112
var actualLastModified = DateTimeOffset.Now;
101113
var expectedLastModified = null as DateTimeOffset?;
102114
ActionResult result = new VirtualFileResult(string.Empty, TestContentType) { LastModified = actualLastModified };
103-
var failureMessage = string.Format(FailureMessages.CommonFailMessage, "VirtualFileResult.LastModified", expectedLastModified, actualLastModified);
104-
Action a = () => result.Should().BeVirtualFileResult().WithLastModified(expectedLastModified);
115+
var failureMessage = FailureMessageHelper.ExpectedContextToBeXButY("VirtualFileResult.LastModified", expectedLastModified, actualLastModified);
116+
117+
Action a = () => result.Should().BeVirtualFileResult().WithLastModified(expectedLastModified, Reason, ReasonArgs);
118+
105119
a.Should().Throw<Exception>().WithMessage(failureMessage);
106120
}
107121

108122
[Fact]
109123
public void WithLastModified_GivenUnexpected_ShouldFail()
110124
{
111125
var actualLastModified = TestLastModified;
112-
var expectedLastModified = DateTimeOffset.Now.AddMilliseconds(1);
126+
var expectedLastModified = TestLastModified.Value.AddMilliseconds(1);
113127
ActionResult result = new VirtualFileResult(string.Empty, TestContentType) { LastModified = actualLastModified };
114-
var failureMessage = string.Format(FailureMessages.CommonFailMessage, "VirtualFileResult.LastModified", expectedLastModified, actualLastModified);
115-
Action a = () => result.Should().BeVirtualFileResult().WithLastModified(expectedLastModified);
128+
var failureMessage = FailureMessageHelper.ExpectedContextToBeXButY("VirtualFileResult.LastModified", expectedLastModified, actualLastModified);
129+
130+
Action a = () => result.Should().BeVirtualFileResult().WithLastModified(expectedLastModified, Reason, ReasonArgs);
131+
116132
a.Should().Throw<Exception>().WithMessage(failureMessage);
117133
}
118134

@@ -129,8 +145,10 @@ public void WithEntityTag_GivenUnexpected_ShouldFail()
129145
var actualEntityTag = TestEntityTag;
130146
var expectedEntityTag = new EntityTagHeaderValue("\"1234\"");
131147
ActionResult result = new VirtualFileResult(string.Empty, TestContentType) { EntityTag = actualEntityTag };
132-
var failureMessage = string.Format(FailureMessages.CommonFailMessage, "VirtualFileResult.EntityTag", expectedEntityTag, actualEntityTag);
133-
Action a = () => result.Should().BeVirtualFileResult().WithEntityTag(expectedEntityTag);
148+
var failureMessage = FailureMessageHelper.ExpectedContextToBeXButY("VirtualFileResult.EntityTag", expectedEntityTag, actualEntityTag);
149+
150+
Action a = () => result.Should().BeVirtualFileResult().WithEntityTag(expectedEntityTag, Reason, ReasonArgs);
151+
134152
a.Should().Throw<Exception>().WithMessage(failureMessage);
135153
}
136154
}

0 commit comments

Comments
 (0)