Skip to content

(#336) Swapped FluentAssertions for AwesomeAssertions #357

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 1 commit into from
May 18, 2025
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
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
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -5,8 +5,8 @@
</PropertyGroup>
<ItemGroup>
<PackageVersion Include="AutoMapper" Version="13.0.1" />
<PackageVersion Include="AwesomeAssertions" Version="8.2.0" />
<PackageVersion Include="Azure.Identity" Version="1.13.1" />
<PackageVersion Include="FluentAssertions" Version="7.1.0" />
<PackageVersion Include="FluentAssertions.Web" Version="1.8.0" />
<PackageVersion Include="LiteDB" Version="5.0.21" />
<PackageVersion Include="Microsoft.AspNetCore.Mvc.Testing" Version="9.0.4" />
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -289,7 +289,7 @@ public async Task SendAsync_AddsHeader_BearerAuth()
response.Should().NotBeNull();

handler.Requests.Should().ContainSingle();
handler.Requests[0].Should().HaveHeader("Authorization", $"Bearer {ValidAuthenticationToken.Token}");
handler.Requests[0].Headers.Should().ContainSingle(x => x.Key == "Authorization" && x.Value.First() == $"Bearer {ValidAuthenticationToken.Token}");
}

[Fact]
Expand All @@ -308,7 +308,7 @@ public async Task SendAsync_NoHeader_WhenExpired()
response.Should().NotBeNull();

handler.Requests.Should().ContainSingle();
handler.Requests[0].Should().NotHaveHeader("Authorization");
handler.Requests[0].Headers.Should().NotContain(x => x.Key == "Authorization");
}

[Fact]
Expand All @@ -328,7 +328,7 @@ public async Task SendAsync_RemoveHeader_WhenExpired()
response.Should().NotBeNull();

handler.Requests.Should().ContainSingle();
handler.Requests[0].Should().NotHaveHeader("Authorization");
handler.Requests[0].Headers.Should().NotContain(x => x.Key == "Authorization");
}

[Fact]
Expand All @@ -348,7 +348,7 @@ public async Task SendAsync_OverwritesHeader_WhenNotExpired()
response.Should().NotBeNull();

handler.Requests.Should().ContainSingle();
handler.Requests[0].Should().HaveHeader("Authorization", $"Bearer {ValidAuthenticationToken.Token}");
handler.Requests[0].Headers.Should().ContainSingle(x => x.Key == "Authorization" && x.Value.First() == $"Bearer {ValidAuthenticationToken.Token}");
}

/// <summary>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ public async Task Metadata_GetsSetByServer()
TodoItem source = new() { Title = "Test item" };
HttpResponseMessage response = await client.PostAsJsonAsync($"{this.serviceEndpoint}/tables/TodoItem", source);

response.Should().HaveHttpStatusCode(HttpStatusCode.Created);
response.StatusCode.Should().Be(HttpStatusCode.Created);

TodoItem result = await response.Content.ReadFromJsonAsync<TodoItem>();
result.Id.Should().NotBeNullOrEmpty();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@ public async Task DeleteOperation_ExecuteAsync()
{
MockDelegatingHandler handler = new();
HttpClient client = new(handler) { BaseAddress = new Uri("https://test.zumo.net") };
string itemJson = """{"id":"123"}""";
const string itemJson = """{"id":"123"}""";
DatasyncOperation op = new()
{
Id = Guid.NewGuid().ToString(),
Expand Down Expand Up @@ -52,7 +52,7 @@ public async Task DeleteOperation_ExecuteAsync()
request.Should().NotBeNull();
request.Method.Should().Be(HttpMethod.Delete);
request.RequestUri.ToString().Should().Be("https://test.zumo.net/tables/movies/123");
request.Should().NotHaveHeader("If-Match");
request.Headers.Should().NotContain(x => x.Key == "If-Match");

response.Should().NotBeNull();
response.HasContent.Should().BeFalse();
Expand All @@ -67,7 +67,7 @@ public async Task DeleteOperation_ExecuteAsync_WithVersion()
{
MockDelegatingHandler handler = new();
HttpClient client = new(handler) { BaseAddress = new Uri("https://test.zumo.net") };
string itemJson = """{"id":"123"}""";
const string itemJson = """{"id":"123"}""";
DatasyncOperation op = new()
{
Id = Guid.NewGuid().ToString(),
Expand Down Expand Up @@ -98,7 +98,7 @@ public async Task DeleteOperation_ExecuteAsync_WithVersion()
request.Should().NotBeNull();
request.Method.Should().Be(HttpMethod.Delete);
request.RequestUri.ToString().Should().Be("https://test.zumo.net/tables/movies/123");
request.Should().HaveHeader("If-Match", "\"abcdefg\"");
request.Headers.Should().Contain(x => x.Key == "If-Match" && x.Value.First() == "\"abcdefg\"");

response.Should().NotBeNull();
response.HasContent.Should().BeFalse();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,13 +17,12 @@ namespace CommunityToolkit.Datasync.Client.Test.Offline.Operations;
[ExcludeFromCodeCoverage]
public class ReplaceOperation_Tests
{

[Fact]
public async Task ReplaceOperation_ExecuteAsync()
{
MockDelegatingHandler handler = new();
HttpClient client = new(handler) { BaseAddress = new Uri("https://test.zumo.net") };
string itemJson = """{"id":"123"}""";
const string itemJson = """{"id":"123"}""";
DatasyncOperation op = new()
{
Id = Guid.NewGuid().ToString(),
Expand Down Expand Up @@ -55,7 +54,7 @@ public async Task ReplaceOperation_ExecuteAsync()
request.Should().NotBeNull();
request.Method.Should().Be(HttpMethod.Put);
request.RequestUri.ToString().Should().Be("https://test.zumo.net/tables/movies/123");
request.Should().NotHaveHeader("If-Match");
request.Headers.Should().NotContain(x => x.Key == "If-Match");
(await request.Content.ReadAsStringAsync()).Should().Be(itemJson);

response.Should().NotBeNull();
Expand All @@ -73,7 +72,7 @@ public async Task ReplaceOperation_ExecuteAsync_WithVersion()
{
MockDelegatingHandler handler = new();
HttpClient client = new(handler) { BaseAddress = new Uri("https://test.zumo.net") };
string itemJson = """{"id":"123"}""";
const string itemJson = """{"id":"123"}""";
DatasyncOperation op = new()
{
Id = Guid.NewGuid().ToString(),
Expand Down Expand Up @@ -105,7 +104,7 @@ public async Task ReplaceOperation_ExecuteAsync_WithVersion()
request.Should().NotBeNull();
request.Method.Should().Be(HttpMethod.Put);
request.RequestUri.ToString().Should().Be("https://test.zumo.net/tables/movies/123");
request.Should().HaveHeader("If-Match", "\"abcdefg\"");
request.Headers.Should().Contain(x => x.Key == "If-Match" && x.Value.First() == "\"abcdefg\"");
(await request.Content.ReadAsStringAsync()).Should().Be(itemJson);

response.Should().NotBeNull();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -56,7 +56,7 @@ internal class NamedSelectClass
/// <summary>
/// A test evaluator that ensures DateTimeOffset, DateTime, and TimeOnly values are msec resolution.
/// </summary>
private readonly Func<EquivalencyAssertionOptions<ClientKitchenSink>, EquivalencyAssertionOptions<ClientKitchenSink>> entityEquivalentOptions = (options) =>
private readonly Func<EquivalencyOptions<ClientKitchenSink>, EquivalencyOptions<ClientKitchenSink>> entityEquivalentOptions = (options) =>
{
options.Using<DateTimeOffset>(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation, 1.Milliseconds())).WhenTypeIs<DateTimeOffset>();
options.Using<DateTime>(ctx => ctx.Subject.Should().BeCloseTo(ctx.Expectation, 1.Milliseconds())).WhenTypeIs<DateTime>();
Expand Down Expand Up @@ -267,7 +267,7 @@ public async Task AddAsync_Conflict(HttpStatusCode code)
{
this.mockHandler.Responses.Add(GetSuccessfulResponse(this.successfulKitchenSink, code));
ClientKitchenSink entity = new() { Id = "1", StringValue = "abc" };
string expected = """{"stringValue":"abc","id":"1"}""";
const string expected = """{"stringValue":"abc","id":"1"}""";
DatasyncServiceClient<ClientKitchenSink> client = GetMockClient<ClientKitchenSink>();

Func<Task> act = async () => _ = await client.AddAsync(entity, new DatasyncServiceOptions());
Expand Down Expand Up @@ -1204,7 +1204,7 @@ public async Task Query_OnePageOfItems()
[Fact]
public async Task Query_TwoPagesOfItems()
{
Page<ClientKitchenSink>
Page<ClientKitchenSink>
page1 = CreatePage(5, null, "$skip=5"),
page2 = CreatePage(5);

Expand Down Expand Up @@ -1436,7 +1436,7 @@ public async Task RemoveAsync_SetsVersion()
request.Should().NotBeNull();
request.Method.Should().Be(HttpMethod.Delete);
request.RequestUri.ToString().Should().Be($"http://localhost/tables/kitchensink/{id}");
request.Should().HaveHeader("If-Match", "\"abcdefg1234\"");
request.Headers.Should().Contain(x => x.Key == "If-Match" && x.Value.First() == "\"abcdefg1234\"");

response.Should().NotBeNull();
response.HasContent.Should().BeFalse();
Expand All @@ -1458,7 +1458,7 @@ public async Task RemoveAsync_Extn_Unforced_SetsVersion()
request.Should().NotBeNull();
request.Method.Should().Be(HttpMethod.Delete);
request.RequestUri.ToString().Should().Be($"http://localhost/tables/kitchensink/{entity.Id}");
request.Should().HaveHeader("If-Match", "\"abcdefg1234\"");
request.Headers.Should().Contain(x => x.Key == "If-Match" && x.Value.First() == "\"abcdefg1234\"");

response.Should().NotBeNull();
response.HasContent.Should().BeFalse();
Expand All @@ -1480,7 +1480,7 @@ public async Task RemoveAsync_Extn2_SetsVersion()
request.Should().NotBeNull();
request.Method.Should().Be(HttpMethod.Delete);
request.RequestUri.ToString().Should().Be($"http://localhost/tables/kitchensink/{entity.Id}");
request.Should().HaveHeader("If-Match", "\"abcdefg1234\"");
request.Headers.Should().Contain(x => x.Key == "If-Match" && x.Value.First() == "\"abcdefg1234\"");

response.Should().NotBeNull();
response.HasContent.Should().BeFalse();
Expand All @@ -1502,7 +1502,7 @@ public async Task RemoveAsync_Extn_Forced_SetsVersion()
request.Should().NotBeNull();
request.Method.Should().Be(HttpMethod.Delete);
request.RequestUri.ToString().Should().Be($"http://localhost/tables/kitchensink/{entity.Id}");
request.Should().NotHaveHeader("If-Match");
request.Headers.Should().NotContain(x => x.Key == "If-Match");

response.Should().NotBeNull();
response.HasContent.Should().BeFalse();
Expand Down Expand Up @@ -1745,7 +1745,7 @@ public async Task ReplaceAsync_SetsVersion()
request.Should().NotBeNull();
request.Method.Should().Be(HttpMethod.Put);
request.RequestUri.ToString().Should().Be($"http://localhost/tables/kitchensink/{entity.Id}");
request.Should().HaveHeader("If-Match", "\"abcdefg1234\"");
request.Headers.Should().Contain(x => x.Key == "If-Match" && x.Value.First() == "\"abcdefg1234\"");
(await request.Content.ReadAsStringAsync()).Should().Be(expected);

response.Should().NotBeNull();
Expand All @@ -1771,7 +1771,7 @@ public async Task ReplaceAsync_Extn_Forced_SetsVersion()
request.Should().NotBeNull();
request.Method.Should().Be(HttpMethod.Put);
request.RequestUri.ToString().Should().Be($"http://localhost/tables/kitchensink/{entity.Id}");
request.Should().NotHaveHeader("If-Match");
request.Headers.Should().NotContain(x => x.Key == "If-Match");
(await request.Content.ReadAsStringAsync()).Should().Be(expected);

response.Should().NotBeNull();
Expand All @@ -1797,7 +1797,7 @@ public async Task ReplaceAsync_Extn_Unforced_SetsVersion()
request.Should().NotBeNull();
request.Method.Should().Be(HttpMethod.Put);
request.RequestUri.ToString().Should().Be($"http://localhost/tables/kitchensink/{entity.Id}");
request.Should().HaveHeader("If-Match", "\"abcdefg1234\"");
request.Headers.Should().Contain(x => x.Key == "If-Match" && x.Value.First() == "\"abcdefg1234\"");
(await request.Content.ReadAsStringAsync()).Should().Be(expected);

response.Should().NotBeNull();
Expand All @@ -1823,7 +1823,7 @@ public async Task ReplaceAsync_Extn_Default_SetsVersion()
request.Should().NotBeNull();
request.Method.Should().Be(HttpMethod.Put);
request.RequestUri.ToString().Should().Be($"http://localhost/tables/kitchensink/{entity.Id}");
request.Should().HaveHeader("If-Match", "\"abcdefg1234\"");
request.Headers.Should().Contain(x => x.Key == "If-Match" && x.Value.First() == "\"abcdefg1234\"");
(await request.Content.ReadAsStringAsync()).Should().Be(expected);

response.Should().NotBeNull();
Expand Down Expand Up @@ -3561,10 +3561,12 @@ public void Linq_Where_String_Contains()
[Fact]
public void Linq_Where_EndsWith_ToUpper()
{
#pragma warning disable RCS1155 // Use StringComparison when comparing strings
ExecuteQueryTest(
x => x.Where(m => m.StringValue.ToUpperInvariant() == "ER"),
"$filter=(toupper(stringValue) eq 'ER')"
);
#pragma warning restore RCS1155 // Use StringComparison when comparing strings
}

[Fact]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ public async Task Create_WithValidInput_Returns201(string id)
ClientMovie source = new(TestData.Movies.BlackPanther) { Id = id };

HttpResponseMessage response = await this.client.PostAsJsonAsync(this.factory.MovieEndpoint, source, this.serializerOptions);
response.Should().HaveStatusCode(HttpStatusCode.Created);
response.StatusCode.Should().Be(HttpStatusCode.Created);

ClientMovie clientMovie = await response.Content.ReadFromJsonAsync<ClientMovie>(this.serializerOptions);
clientMovie.Should().NotBeNull().And.HaveChangedMetadata(id, this.StartTime).And.BeEquivalentTo<IMovie>(source);
Expand All @@ -44,7 +44,7 @@ public async Task Create_ExistingId_Returns409()
ClientMovie source = new(TestData.Movies.BlackPanther) { Id = existingMovie.Id };

HttpResponseMessage response = await this.client.PostAsJsonAsync(this.factory.MovieEndpoint, source, this.serializerOptions);
response.Should().HaveStatusCode(HttpStatusCode.Conflict);
response.StatusCode.Should().Be(HttpStatusCode.Conflict);

ClientMovie clientMovie = await response.Content.ReadFromJsonAsync<ClientMovie>(this.serializerOptions);
clientMovie.Should().NotBeNull().And.HaveEquivalentMetadataTo(existingMovie).And.BeEquivalentTo<IMovie>(existingMovie);
Expand All @@ -60,7 +60,7 @@ public async Task Create_SoftDeleted_Returns409()
ClientMovie source = new(TestData.Movies.BlackPanther) { Id = existingMovie.Id };

HttpResponseMessage response = await this.client.PostAsJsonAsync(this.factory.MovieEndpoint, source, this.serializerOptions);
response.Should().HaveStatusCode(HttpStatusCode.Conflict);
response.StatusCode.Should().Be(HttpStatusCode.Conflict);

ClientMovie clientMovie = await response.Content.ReadFromJsonAsync<ClientMovie>(this.serializerOptions);
clientMovie.Should().NotBeNull().And.HaveEquivalentMetadataTo(existingMovie).And.BeEquivalentTo<IMovie>(existingMovie);
Expand All @@ -83,7 +83,7 @@ public async Task Create_CanRoundtrip_Types()
};

HttpResponseMessage response = await this.client.PostAsJsonAsync(this.factory.KitchenSinkEndpoint, source, this.serializerOptions);
response.Should().HaveStatusCode(HttpStatusCode.Created);
response.StatusCode.Should().Be(HttpStatusCode.Created);

ClientKitchenSink clientKitchenSink = await response.Content.ReadFromJsonAsync<ClientKitchenSink>(this.serializerOptions);
clientKitchenSink.Should().NotBeNull().And.HaveChangedMetadata(id, this.StartTime).And.BeEquivalentTo<IKitchenSink>(source);
Expand All @@ -97,7 +97,7 @@ public async Task Create_NonJsonData_Returns415()
{
const string content = "<html><body><h1>Not JSON</h1></body></html>";
HttpResponseMessage response = await this.client.PostAsync(this.factory.MovieEndpoint, new StringContent(content, Encoding.UTF8, "text/html"));
response.Should().HaveStatusCode(HttpStatusCode.UnsupportedMediaType);
response.StatusCode.Should().Be(HttpStatusCode.UnsupportedMediaType);
}

[Theory]
Expand Down Expand Up @@ -134,6 +134,6 @@ public async Task Create_ValidationError_Returns400(string propName, object prop
}

HttpResponseMessage response = await this.client.PostAsJsonAsync(this.factory.MovieEndpoint, source, this.serializerOptions);
response.Should().HaveStatusCode(HttpStatusCode.BadRequest);
response.StatusCode.Should().Be(HttpStatusCode.BadRequest);
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,7 @@ public async Task Delete_ById_Returns204()
InMemoryMovie existingMovie = this.factory.GetRandomMovie();

HttpResponseMessage response = await this.client.DeleteAsync($"{this.factory.MovieEndpoint}/{existingMovie.Id}");
response.Should().HaveStatusCode(HttpStatusCode.NoContent);
response.StatusCode.Should().Be(HttpStatusCode.NoContent);

InMemoryMovie serverEntity = this.factory.GetServerEntityById<InMemoryMovie>(existingMovie.Id);
serverEntity.Should().BeNull();
Expand All @@ -39,7 +39,7 @@ public async Task Delete_WithVersioning_Works(string headerName, string value, H
request.Headers.Add(headerName, etag);

HttpResponseMessage response = await this.client.SendAsync(request);
response.Should().HaveStatusCode(expectedStatusCode);
response.StatusCode.Should().Be(expectedStatusCode);

if (expectedStatusCode == HttpStatusCode.PreconditionFailed)
{
Expand All @@ -53,7 +53,7 @@ public async Task Delete_WithVersioning_Works(string headerName, string value, H
public async Task Delete_MissingId_Returns404()
{
HttpResponseMessage response = await this.client.DeleteAsync($"{this.factory.MovieEndpoint}/missing");
response.Should().HaveStatusCode(HttpStatusCode.NotFound);
response.StatusCode.Should().Be(HttpStatusCode.NotFound);
}

[Fact]
Expand All @@ -64,7 +64,7 @@ public async Task Delete_NotSoftDeleted_Returns204()
DateTimeOffset existingUpdatedAt = (DateTimeOffset)existingMovie.UpdatedAt;

HttpResponseMessage response = await this.client.DeleteAsync($"{this.factory.SoftDeletedMovieEndpoint}/{existingMovie.Id}");
response.Should().HaveStatusCode(HttpStatusCode.NoContent);
response.StatusCode.Should().Be(HttpStatusCode.NoContent);

InMemoryMovie serverEntity = this.factory.GetServerEntityById<InMemoryMovie>(existingMovie.Id);
serverEntity.Should().NotBeNull();
Expand All @@ -80,7 +80,7 @@ public async Task Delete_SoftDeletedId_Returns410()
this.factory.SoftDelete(existingMovie);

HttpResponseMessage response = await this.client.DeleteAsync($"{this.factory.SoftDeletedMovieEndpoint}/{existingMovie.Id}");
response.Should().HaveStatusCode(HttpStatusCode.Gone);
response.StatusCode.Should().Be(HttpStatusCode.Gone);

InMemoryMovie serverEntity = this.factory.GetServerEntityById<InMemoryMovie>(existingMovie.Id);
serverEntity.Should().NotBeNull();
Expand Down
Loading