Skip to content

Commit 37cafff

Browse files
refactor(tests): use Shouldly for assertions (#98)
* Refactor tests to use Shouldly for assertions - Updated assertions in FluentHttpClientTest to use Shouldly for better readability. - Refactored FluentHttpHeadersTest to replace traditional assertions with Shouldly. - Modified FluentHttpRequestBuilderTest to utilize Shouldly for assertions. - Changed assertions in HttpMiddlewareTest to use Shouldly for consistency. - Updated FileUploadIntegrationTest to use Shouldly for response assertions. - Refactored MessagePackIntegrationTest to utilize Shouldly for assertions. - Changed ResponseCacheIntegrationTest assertions to use Shouldly for clarity. - Updated SerilogIntegrationTest to use Shouldly for null checks and value assertions. - Refactored LoggingHttpMiddlewareTest to use Shouldly for assertions. - Updated TimerHttpMiddlewareTest to utilize Shouldly for assertions. - Added Shouldly package reference to the test project. - Included global using directive for Shouldly in GlobalUsings.cs. * refactor: update test dependencies and improve test assertions
1 parent a857f3f commit 37cafff

16 files changed

Lines changed: 253 additions & 263 deletions

Directory.Packages.props

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
<PackageVersion Include="Microsoft.Extensions.Logging.Abstractions" Version="10.0.6" />
1515
<PackageVersion Include="Microsoft.Extensions.DependencyInjection" Version="10.0.6" />
1616
<PackageVersion Include="Microsoft.Extensions.Logging" Version="10.0.6" />
17-
<PackageVersion Include="Microsoft.Data.SqlClient" Version="6.1.1" />
17+
<PackageVersion Include="Microsoft.Data.SqlClient" Version="7.0.0" />
1818
<PackageVersion Include="Microsoft.EntityFrameworkCore.SqlServer" Version="10.0.6" />
1919
<PackageVersion Include="Microsoft.AspNet.WebApi.Client" Version="6.0.0" />
2020
<!-- 3rd party -->
@@ -26,7 +26,8 @@
2626
<PackageVersion Include="Sketch7.Core" Version="0.2.0" />
2727
<!-- testing -->
2828
<PackageVersion Include="Microsoft.NET.Test.Sdk" Version="18.4.0" />
29-
<PackageVersion Include="xunit" Version="2.9.3" />
29+
<PackageVersion Include="Shouldly" Version="4.3.0" />
30+
<PackageVersion Include="xunit.v3" Version="3.2.2" />
3031
<PackageVersion Include="xunit.runner.visualstudio" Version="3.1.5" />
3132
<PackageVersion Include="RichardSzalay.MockHttp" Version="7.0.0" />
3233
<PackageVersion Include="Serilog.Extensions.Logging" Version="10.0.0" />

src/FluentlyHttpClient/Middleware/FluentHttpMiddlewareBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -93,7 +93,7 @@ public IFluentHttpMiddlewareRunner Build(IFluentHttpClient httpClient)
9393
}
9494
}
9595
else
96-
ctor = new object[] { };
96+
ctor = [];
9797
var instance = (IFluentHttpMiddleware)ActivatorUtilities.CreateInstance(_serviceProvider, pipe.Type, ctor);
9898

9999
if (isFirst)

test/FluentHttpClientFactoryTest.cs

Lines changed: 33 additions & 38 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ public void ShouldAllowEmptyBaseUrl()
1313
var httpClient = GetNewClientFactory().CreateBuilder("abc")
1414
.Build();
1515

16-
Assert.Null(httpClient.BaseUrl);
16+
httpClient.BaseUrl.ShouldBeNull();
1717
}
1818
}
1919

@@ -30,7 +30,7 @@ public void AddFluentlyHttpClient_Defaults_ShouldBeSet()
3030
.GetRequiredService<IFluentHttpClientFactory>();
3131

3232
var client = f.CreateBuilder("sketch7").Build();
33-
Assert.Equal("default-config", client.Headers.UserAgent.ToString());
33+
client.Headers.UserAgent.ToString().ShouldBe("default-config");
3434
}
3535

3636

@@ -57,17 +57,13 @@ public void Build_RegisterMulti_ShouldNotReplacePrevious()
5757
httpClientB.Headers.TryGetValues("X-S7", out var s7HeadersB);
5858
httpClientA.Headers.TryGetValues("X-Org", out var orgHeadersB);
5959

60-
Assert.NotNull(orgHeadersA);
61-
Assert.Single(orgHeadersA, "s7");
62-
Assert.NotNull(s7HeadersA);
63-
Assert.Single(s7HeadersA, "a");
64-
Assert.Equal("dXNlcjpwYSQk", httpClientA.Headers.Authorization!.Parameter);
65-
66-
Assert.NotNull(orgHeadersB);
67-
Assert.Single(orgHeadersB, "s7");
68-
Assert.NotNull(s7HeadersB);
69-
Assert.Single(s7HeadersB, "b");
70-
Assert.Equal("dXNlci0yOnBhJCQ=", httpClientB.Headers.Authorization!.Parameter);
60+
orgHeadersA.ShouldNotBeNull().ShouldHaveSingleItem().ShouldBe("s7");
61+
s7HeadersA.ShouldNotBeNull().ShouldHaveSingleItem().ShouldBe("a");
62+
httpClientA.Headers.Authorization!.Parameter.ShouldBe("dXNlcjpwYSQk");
63+
64+
orgHeadersB.ShouldNotBeNull().ShouldHaveSingleItem().ShouldBe("s7");
65+
s7HeadersB.ShouldNotBeNull().ShouldHaveSingleItem().ShouldBe("b");
66+
httpClientB.Headers.Authorization!.Parameter.ShouldBe("dXNlci0yOnBhJCQ=");
7167
}
7268

7369
[Fact]
@@ -81,8 +77,8 @@ public void ShouldHaveWithCustomDefaultsSet()
8177
var request = httpClient.CreateRequest("/api")
8278
.Build();
8379

84-
Assert.NotNull(request);
85-
Assert.Equal(HttpMethod.Put, request.Method);
80+
request.ShouldNotBeNull();
81+
request.Method.ShouldBe(HttpMethod.Put);
8682
}
8783

8884
[Fact]
@@ -97,9 +93,9 @@ public void ShouldHaveCustomDefaultsCombined()
9793
var request = httpClient.CreateRequest("/api")
9894
.Build();
9995

100-
Assert.NotNull(request);
101-
Assert.Equal(HttpMethod.Put, request.Method);
102-
Assert.Equal("user", request.Items["context"]);
96+
request.ShouldNotBeNull();
97+
request.Method.ShouldBe(HttpMethod.Put);
98+
request.Items["context"].ShouldBe("user");
10399
}
104100

105101
[Fact]
@@ -114,9 +110,9 @@ public void ShouldHavePreviousCustomDefaultsReplaced()
114110
var request = httpClient.CreateRequest("/api")
115111
.Build();
116112

117-
Assert.NotNull(request);
118-
Assert.Equal(HttpMethod.Get, request.Method);
119-
Assert.Equal("user", request.Items["context"]);
113+
request.ShouldNotBeNull();
114+
request.Method.ShouldBe(HttpMethod.Get);
115+
request.Items["context"].ShouldBe("user");
120116
}
121117

122118
[Fact]
@@ -140,7 +136,7 @@ public void ShouldHaveQueryParamsDefaultsSet()
140136
})
141137
.Build();
142138

143-
Assert.Equal("/api/heroes?ROLES=warrior,assassin", request.Uri?.ToString());
139+
request.Uri?.ToString().ShouldBe("/api/heroes?ROLES=warrior,assassin");
144140
}
145141

146142
[Fact]
@@ -158,8 +154,8 @@ public void ShouldAppendToParentsBaseUrl()
158154
.Build()
159155
;
160156

161-
Assert.Equal("http://abc.com/v1/", subHttpClient.BaseUrl);
162-
Assert.Equal("http://abc.com/", httpClient.BaseUrl);
157+
subHttpClient.BaseUrl.ShouldBe("http://abc.com/v1/");
158+
httpClient.BaseUrl.ShouldBe("http://abc.com/");
163159
}
164160
}
165161

@@ -173,7 +169,7 @@ public void ShouldSetClientFormatters()
173169
.ConfigureFormatters(opts => { opts.Formatters.Clear(); })
174170
.Build();
175171

176-
Assert.Empty(httpClient.Formatters);
172+
httpClient.Formatters.ShouldBeEmpty();
177173
}
178174

179175
[Fact]
@@ -187,7 +183,7 @@ public void ShouldSetDefaultFormatter()
187183
})
188184
.Build();
189185

190-
Assert.Equal(httpClient.Formatters.XmlFormatter, httpClient.DefaultFormatter);
186+
httpClient.DefaultFormatter.ShouldBe(httpClient.Formatters.XmlFormatter);
191187
}
192188

193189
[Fact]
@@ -207,8 +203,8 @@ public void SetDefaultFormatterMany_ShouldBeSetCorrectly()
207203
.Build()
208204
;
209205

210-
Assert.Equal(httpClient.Formatters.XmlFormatter, httpClient.DefaultFormatter);
211-
Assert.Equal(httpClient2.Formatters.FormUrlEncodedFormatter, httpClient2.DefaultFormatter);
206+
httpClient.DefaultFormatter.ShouldBe(httpClient.Formatters.XmlFormatter);
207+
httpClient2.DefaultFormatter.ShouldBe(httpClient2.Formatters.FormUrlEncodedFormatter);
212208
}
213209

214210
[Fact]
@@ -224,7 +220,7 @@ public void ShouldAutoRegisterDefault()
224220
})
225221
.Build();
226222

227-
Assert.Equal(jsonFormatter, httpClient.DefaultFormatter);
223+
httpClient.DefaultFormatter.ShouldBe(jsonFormatter);
228224
}
229225

230226
[Fact]
@@ -238,7 +234,7 @@ public void DefaultFormatterShouldBePlacedFirst()
238234
})
239235
.Build();
240236

241-
Assert.Equal(httpClient.Formatters.First(), httpClient.DefaultFormatter);
237+
httpClient.DefaultFormatter.ShouldBe(httpClient.Formatters.First());
242238
}
243239
}
244240

@@ -253,8 +249,7 @@ public void ShouldSetClientFormatters()
253249
.WithBaseUrl("http://abc.com")
254250
.Build();
255251

256-
var userAgentHeader = httpClient.Headers.GetValues("User-Agent").FirstOrDefault();
257-
Assert.Equal("hots", userAgentHeader);
252+
httpClient.Headers.GetValues("User-Agent").FirstOrDefault().ShouldBe("hots");
258253
}
259254
}
260255

@@ -267,15 +262,15 @@ public void ShouldRegisterSuccessfully()
267262
.WithBaseUrl("http://abc.com")
268263
.Build();
269264

270-
Assert.NotNull(httpClient);
271-
Assert.Equal("abc", httpClient.Identifier);
265+
httpClient.ShouldNotBeNull();
266+
httpClient.Identifier.ShouldBe("abc");
272267
}
273268

274269
[Fact]
275270
public void ThrowsErrorWhenIdentifierNotSpecified()
276271
{
277272
var clientBuilder = GetNewClientFactory().CreateBuilder(null!);
278-
Assert.Throws<ClientBuilderValidationException>(() => clientBuilder.Register());
273+
Should.Throw<ClientBuilderValidationException>(() => clientBuilder.Register());
279274
}
280275

281276
[Fact]
@@ -285,7 +280,7 @@ public void ThrowsErrorWhenAlreadyRegistered()
285280
.WithBaseUrl("http://abc.com")
286281
.Register();
287282

288-
Assert.Throws<ClientBuilderValidationException>(() => clientBuilder.Register());
283+
Should.Throw<ClientBuilderValidationException>(() => clientBuilder.Register());
289284
}
290285
}
291286

@@ -302,7 +297,7 @@ public async Task ShouldDisposeClient()
302297
var isRegistered = fluentHttpClientFactory.Remove("abc")
303298
.Has("abc");
304299

305-
await Assert.ThrowsAsync<ObjectDisposedException>(() => httpClient.Get<Hero>("/api/heroes/azmodan"));
306-
Assert.False(isRegistered);
300+
await Should.ThrowAsync<ObjectDisposedException>(() => httpClient.Get<Hero>("/api/heroes/azmodan"));
301+
isRegistered.ShouldBeFalse();
307302
}
308303
}

test/FluentHttpClientTest.cs

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -23,8 +23,8 @@ public async Task Get_ShouldReturnContent()
2323

2424
var hero = await httpClient.Get<Hero>("/api/heroes/azmodan");
2525

26-
Assert.NotNull(hero);
27-
Assert.Equal("Azmodan", hero.Name);
26+
hero.ShouldNotBeNull();
27+
hero.Name.ShouldBe("Azmodan");
2828
}
2929

3030
[Fact]
@@ -51,8 +51,8 @@ public async Task Post_ShouldReturnContent()
5151
Title = "Lord of Sin"
5252
});
5353

54-
Assert.NotNull(hero);
55-
Assert.Equal("Lord of Sin", hero.Title);
54+
hero.ShouldNotBeNull();
55+
hero.Title.ShouldBe("Lord of Sin");
5656
}
5757

5858
[Fact]
@@ -92,21 +92,21 @@ public void CreateClient_ShouldInheritOptions()
9292
httpClient.Headers.TryGetValues("country", out var countryValues);
9393
var subClientCountry = subClient.Headers.GetValues("country").FirstOrDefault();
9494

95-
Assert.Equal("sketch7", httpClient.Identifier);
96-
Assert.Equal("sketch7.subclient", subClient.Identifier);
97-
Assert.Equal("en-GB", httpClientLocale);
98-
Assert.Equal("de", subClientLocale);
99-
Assert.Null(countryValues?.FirstOrDefault());
100-
Assert.Equal("de", subClientCountry);
101-
102-
Assert.Equal(httpClientRequest.HttpMethod, subClientRequest.HttpMethod);
103-
Assert.Equal(httpClientRequest.Items["error-mapping"], subClientRequest.Items["error-mapping"]);
104-
Assert.Equal("user", httpClientRequest.Items["context"]);
105-
Assert.Equal("reward", subClientRequest.Items["context"]);
106-
Assert.Equal(httpClient.Formatters.Count, subClient.Formatters.Count);
95+
httpClient.Identifier.ShouldBe("sketch7");
96+
subClient.Identifier.ShouldBe("sketch7.subclient");
97+
httpClientLocale.ShouldBe("en-GB");
98+
subClientLocale.ShouldBe("de");
99+
countryValues?.FirstOrDefault().ShouldBeNull();
100+
subClientCountry.ShouldBe("de");
101+
102+
subClientRequest.HttpMethod.ShouldBe(httpClientRequest.HttpMethod);
103+
subClientRequest.Items["error-mapping"].ShouldBe(httpClientRequest.Items["error-mapping"]);
104+
httpClientRequest.Items["context"].ShouldBe("user");
105+
subClientRequest.Items["context"].ShouldBe("reward");
106+
subClient.Formatters.Count.ShouldBe(httpClient.Formatters.Count);
107107
// todo: check middleware count?
108108

109-
Assert.Equal(2, httpClientFactory.Count);
109+
httpClientFactory.Count.ShouldBe(2);
110110
}
111111

112112
[Fact]
@@ -136,8 +136,8 @@ public async Task GraphQL_ShouldReturnContent()
136136
var response = await httpClient.CreateGqlRequest(query, operationName)
137137
.ReturnAsGqlResponse<Hero>();
138138

139-
Assert.True(response.IsSuccessStatusCode);
140-
Assert.NotNull(response.Data);
141-
Assert.Equal("Lord of Sin", response.Data.Title);
139+
response.IsSuccessStatusCode.ShouldBeTrue();
140+
response.Data.ShouldNotBeNull();
141+
response.Data.Title.ShouldBe("Lord of Sin");
142142
}
143143
}

0 commit comments

Comments
 (0)