diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 6697e17..38a22cb 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -7,18 +7,6 @@ on: branches: [ "main" ] jobs: - test-net8: - runs-on: ubuntu-latest - container: mcr.microsoft.com/dotnet/sdk:8.0 - - steps: - - name: Checkout - uses: actions/checkout@v3 - - name: Build - run: ./build.sh net8.0 - - name: Test - run: ./test.sh net8.0 - test-net9: runs-on: ubuntu-latest container: mcr.microsoft.com/dotnet/sdk:9.0 @@ -27,7 +15,7 @@ jobs: - name: Checkout uses: actions/checkout@v3 - name: Build - run: ./build.sh net9.0 + run: dotnet build - name: Test - run: ./test.sh net9.0 + run: dotnet test diff --git a/Directory.Build.props b/Directory.Build.props index 5b2e9d9..6670e95 100644 --- a/Directory.Build.props +++ b/Directory.Build.props @@ -1,7 +1,7 @@ - net8.0;net9.0 + net9.0 enable enable Cnblogs diff --git a/build.sh b/build.sh deleted file mode 100755 index 6908b50..0000000 --- a/build.sh +++ /dev/null @@ -1,4 +0,0 @@ -#!/usr/bin/env bash -set -e -dotnet restore -p:TargetFramework="$1" -dotnet build -c Release -p:TargetFramework="$1" --no-restore diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/Cnblogs.Architecture.Ddd.Cqrs.Abstractions.csproj b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/Cnblogs.Architecture.Ddd.Cqrs.Abstractions.csproj index a4bf66c..14aeb37 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/Cnblogs.Architecture.Ddd.Cqrs.Abstractions.csproj +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/Cnblogs.Architecture.Ddd.Cqrs.Abstractions.csproj @@ -17,14 +17,6 @@ - - - - - - - - diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CommandResponse.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CommandResponse.cs index 614059b..2a32ee8 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CommandResponse.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/CommandResponse.cs @@ -26,7 +26,7 @@ public record CommandResponse : IValidationResponse, ILockableResponse public string ErrorMessage { get; init; } = string.Empty; /// - public ValidationErrors ValidationErrors { get; init; } = new(); + public ValidationErrors ValidationErrors { get; init; } = []; /// public bool LockAcquired { get; set; } diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ValidationErrors.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ValidationErrors.cs index 4e56344..55bc037 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ValidationErrors.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Abstractions/ValidationErrors.cs @@ -7,7 +7,7 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Abstractions; /// public class ValidationErrors : ICollection { - private readonly List _validationErrors = new(); + private readonly List _validationErrors = []; /// /// Add a new validation error. diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore.csproj b/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore.csproj index 588d7c0..86f4069 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore.csproj +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore.csproj @@ -9,14 +9,7 @@ - - - - - - - - + diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/CqrsRouteMapper.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/CqrsRouteMapper.cs index 2ab46a4..382f5b2 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/CqrsRouteMapper.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.AspNetCore/CqrsRouteMapper.cs @@ -15,35 +15,35 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.AspNetCore; /// public static class CqrsRouteMapper { - private static readonly List QueryTypes = new() { typeof(IQuery<>), typeof(IListQuery<>) }; + private static readonly List QueryTypes = [typeof(IQuery<>), typeof(IListQuery<>)]; - private static readonly List CommandTypes = new() { typeof(ICommand<>), typeof(ICommand<,>) }; + private static readonly List CommandTypes = [typeof(ICommand<>), typeof(ICommand<,>)]; - private static readonly string[] GetAndHeadMethods = { "GET", "HEAD" }; + private static readonly string[] GetAndHeadMethods = ["GET", "HEAD"]; - private static readonly List PostCommandPrefixes = new() - { + private static readonly List PostCommandPrefixes = + [ "Create", "Add", "New" - }; + ]; - private static readonly List PutCommandPrefixes = new() - { + private static readonly List PutCommandPrefixes = + [ "Update", "Modify", "Replace", "Alter" - }; + ]; - private static readonly List DeleteCommandPrefixes = new() - { + private static readonly List DeleteCommandPrefixes = + [ "Delete", "Remove", "Clean", "Clear", "Purge" - }; + ]; /// /// Map a query API, using GET method. would been constructed from route and query string. diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse/ClickhouseContextCollection.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse/ClickhouseContextCollection.cs index d93603d..8e02352 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse/ClickhouseContextCollection.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse/ClickhouseContextCollection.cs @@ -5,7 +5,7 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.Dapper.Clickhouse; /// public class ClickhouseContextCollection { - internal List ContextTypes { get; } = new(); + internal List ContextTypes { get; } = []; internal void Add() { diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.MongoDb/MongoContextCollection.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.MongoDb/MongoContextCollection.cs index 3b072b2..4d3cb11 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.MongoDb/MongoContextCollection.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.MongoDb/MongoContextCollection.cs @@ -7,7 +7,7 @@ namespace Cnblogs.Architecture.Ddd.Cqrs.MongoDb; /// public class MongoContextCollection { - private readonly List _contexts = new(); + private readonly List _contexts = []; /// /// 添加一个 MongoContext。 diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent/CqrsServiceAgent.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent/CqrsServiceAgent.cs index 19f4da5..3d73cc0 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent/CqrsServiceAgent.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent/CqrsServiceAgent.cs @@ -155,7 +155,6 @@ public async Task> PutCommandAsync await response.Content.ReadFromJsonAsync(), - HttpStatusCode.NotFound => default, _ => default }; } @@ -202,7 +201,7 @@ public async Task> BatchGetItemsAsync( '&', ids.Select(i => $"{WebUtility.UrlEncode(paramName)}={WebUtility.UrlEncode(i.ToString())}")); url = $"{url}{(url.Contains('?') ? '&' : '?')}{query}"; - return await HttpClient.GetFromJsonAsync>(url) ?? new List(); + return await HttpClient.GetFromJsonAsync>(url) ?? []; } /// diff --git a/src/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent/ServiceAgentBase.cs b/src/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent/ServiceAgentBase.cs index 2d60860..67c2e27 100644 --- a/src/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent/ServiceAgentBase.cs +++ b/src/Cnblogs.Architecture.Ddd.Cqrs.ServiceAgent/ServiceAgentBase.cs @@ -293,7 +293,7 @@ public async Task> BatchGetItemsAsync( '&', ids.Select(i => $"{WebUtility.UrlEncode(paramName)}={WebUtility.UrlEncode(i.ToString())}")); url = $"{url}{(url.Contains('?') ? '&' : '?')}{query}"; - return await HttpClient.GetFromJsonAsync>(url) ?? new List(); + return await HttpClient.GetFromJsonAsync>(url) ?? []; } catch (HttpRequestException e) { @@ -306,7 +306,7 @@ public async Task> BatchGetItemsAsync( ThrowApiException(HttpMethod.Get, url, e); } - return new List(); + return []; } } diff --git a/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/DateTimeOffsetCalculator.cs b/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/DateTimeOffsetCalculator.cs new file mode 100644 index 0000000..38b5ca7 --- /dev/null +++ b/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/DateTimeOffsetCalculator.cs @@ -0,0 +1,72 @@ +namespace Cnblogs.Architecture.Ddd.Domain.Abstractions; + +/// +/// Handy calculator for DateTime +/// +public static class DateTimeOffsetCalculator +{ + /// + /// Get a new with time set to 0:00:00 + /// + /// Input . + /// + public static DateTimeOffset StartOfTheDay(this DateTimeOffset dateTime) + { + return new DateTimeOffset(dateTime.Date, dateTime.Offset); + } + + /// + /// Get a new with time set to 23:59:59.999. + /// + /// + /// + public static DateTimeOffset EndOfTheDay(this DateTimeOffset dateTime) + { + return StartOfTheDay(dateTime).AddDays(1).AddMilliseconds(-1); + } + + /// + /// Get a new that set the start of a week for the given date. + /// + /// + /// + public static DateTimeOffset StartOfTheWeek(this DateTimeOffset dateTime) + { + var monday = dateTime.DayOfWeek switch + { + DayOfWeek.Monday => dateTime, + DayOfWeek.Sunday => dateTime.AddDays(-6), + _ => dateTime.AddDays(-(int)(dateTime.DayOfWeek - 1)) + }; + + return monday.StartOfTheDay(); + } + + /// + /// Get a new that set to the end of a week for the given date. + /// + /// + /// + public static DateTimeOffset EndOfTheWeek(this DateTimeOffset dateTime) + { + var sunday = dateTime.DayOfWeek switch + { + DayOfWeek.Sunday => dateTime, + DayOfWeek.Monday => dateTime.AddDays(6), + _ => dateTime.AddDays((int)(7 - dateTime.DayOfWeek)) + }; + + return sunday.EndOfTheDay(); + } + + /// + /// Check whether two is in same date. + /// + /// First to check. + /// Second to check. + /// + public static bool IsInSameDate(this DateTimeOffset left, DateTimeOffset right) + { + return left.Year == right.Year && left.DayOfYear == right.DayOfYear; + } +} diff --git a/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/DefaultDateTimeProvider.cs b/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/DefaultDateTimeProvider.cs index 58fee8a..9053697 100644 --- a/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/DefaultDateTimeProvider.cs +++ b/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/DefaultDateTimeProvider.cs @@ -11,6 +11,18 @@ public DateTimeOffset Now() return DateTimeOffset.Now; } + /// + public DateTimeOffset Yesterday() + { + return Today().AddDays(-1); + } + + /// + public DateTimeOffset EndOfYesterday() + { + return Today().AddDays(-1).EndOfTheDay(); + } + /// public DateTimeOffset Today() { @@ -18,9 +30,33 @@ public DateTimeOffset Today() return new DateTimeOffset(now.Year, now.Month, now.Day, 0, 0, 0, now.Offset); } + /// + public DateTimeOffset EndOfToday() + { + return Today().EndOfTheDay(); + } + + /// + public DateTimeOffset Tomorrow() + { + return Today().AddDays(1); + } + + /// + public DateTimeOffset EndOfTomorrow() + { + return Today().AddDays(1).EndOfTheDay(); + } + /// public long UnixSeconds() { return Now().ToUnixTimeSeconds(); } + + /// + public long UnixMilliseconds() + { + return Now().ToUnixTimeMilliseconds(); + } } diff --git a/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/Entity.cs b/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/Entity.cs index f00a01c..782c8b6 100644 --- a/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/Entity.cs +++ b/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/Entity.cs @@ -49,7 +49,7 @@ public abstract class Entity : Entity, IEntity /// 领域事件生成器。 public void AddDomainEvent(Func generator) { - _domainEventGenerator ??= new List>(); + _domainEventGenerator ??= []; _domainEventGenerator.Add(generator); } diff --git a/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/EntityBase.cs b/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/EntityBase.cs index ec36f79..490c868 100644 --- a/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/EntityBase.cs +++ b/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/EntityBase.cs @@ -18,7 +18,7 @@ public abstract class EntityBase : IDomainEventSource /// 领域事件。 public virtual void AddDomainEvent(IDomainEvent eventItem) { - _events ??= new List(); + _events ??= []; _events.Add(eventItem); } diff --git a/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/IDateTimeProvider.cs b/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/IDateTimeProvider.cs index 81f448a..41d4a70 100644 --- a/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/IDateTimeProvider.cs +++ b/src/Cnblogs.Architecture.Ddd.Domain.Abstractions/IDateTimeProvider.cs @@ -12,14 +12,50 @@ public interface IDateTimeProvider DateTimeOffset Now(); /// - /// Get today's date. + /// Get of yesterday's date. + /// + /// + DateTimeOffset Yesterday(); + + /// + /// Get of yesterday's date with time set to 23:59:59.999. + /// + /// + DateTimeOffset EndOfYesterday(); + + /// + /// Get of today's date. /// /// Today's date. DateTimeOffset Today(); + /// + /// Get of today's date with time set to 23:59:59.999. + /// + /// + DateTimeOffset EndOfToday(); + + /// + /// Get of tomorrow's date with time set to 0:00:00.000. + /// + /// + DateTimeOffset Tomorrow(); + + /// + /// Get of tomorrow's date with time set to 23:59:59.000. + /// + /// + DateTimeOffset EndOfTomorrow(); + /// /// Get number of seconds that have elapsed since 1970-01-01T00:00:00Z. /// /// The number of seconds that have elapsed since 1970-01-01T00:00:00Z. long UnixSeconds(); + + /// + /// Get number of milliseconds that have elapsed since 1970-01-01T00:00:00Z. + /// + /// + long UnixMilliseconds(); } diff --git a/src/Cnblogs.Architecture.Ddd.EventBus.Dapr/EndPointExtensions.cs b/src/Cnblogs.Architecture.Ddd.EventBus.Dapr/EndPointExtensions.cs index fb3923f..6b1418b 100644 --- a/src/Cnblogs.Architecture.Ddd.EventBus.Dapr/EndPointExtensions.cs +++ b/src/Cnblogs.Architecture.Ddd.EventBus.Dapr/EndPointExtensions.cs @@ -182,12 +182,12 @@ private static MethodInfo GetSubscribeMethod() { return typeof(EndPointExtensions).GetMethod( nameof(Subscribe), - new[] { typeof(IEndpointRouteBuilder), typeof(string) })!; + [typeof(IEndpointRouteBuilder), typeof(string)])!; } private static void InvokeSubscribe(this MethodInfo method, Type eventType, IEndpointRouteBuilder builder, string appName) { - method.MakeGenericMethod(eventType).Invoke(null, new object[] { builder, appName }); + method.MakeGenericMethod(eventType).Invoke(null, [builder, appName]); } private static string GetAppName(this Assembly assembly) diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/DispatchDomainEventExtensions.cs b/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/DispatchDomainEventExtensions.cs index a42203a..131597a 100644 --- a/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/DispatchDomainEventExtensions.cs +++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/DispatchDomainEventExtensions.cs @@ -24,7 +24,7 @@ public static async Task DispatchDomainEventsAsync(this IMediator mediator, IEnu } catch (Exception exception) { - exceptions ??= new List(); + exceptions ??= []; exceptions.Add(exception); } } diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/OrderBySegmentConfig.cs b/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/OrderBySegmentConfig.cs index 254984c..1449fa7 100644 --- a/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/OrderBySegmentConfig.cs +++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/OrderBySegmentConfig.cs @@ -62,7 +62,7 @@ public static bool TryParseOrderBySegments( return false; } - segments = new List(); + segments = []; var segmentStrings = SplitSortStrings(input); foreach (var s in segmentStrings) { diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/QueryOrderer.cs b/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/QueryOrderer.cs index 82cc628..27b769d 100644 --- a/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/QueryOrderer.cs +++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/QueryOrderer.cs @@ -30,7 +30,7 @@ public static IQueryable OrderBy(this IQueryable quer { var (isDesc, exp) = segment; var method = GetOrderByMethodName(isDesc); - Type[] types = { queryable.ElementType, exp.Body.Type }; + Type[] types = [queryable.ElementType, exp.Body.Type]; var rs = Expression.Call(typeof(Queryable), method, types, queryable.Expression, exp); return queryable.Provider.CreateQuery(rs); } @@ -67,7 +67,7 @@ public static IQueryable OrderBy( foreach (var (isDesc, exp) in segments) { var method = isFirst ? GetOrderByMethodName(isDesc) : GetThenByMethodName(isDesc); - Type[] types = { queryable.ElementType, exp.Body.Type }; + Type[] types = [queryable.ElementType, exp.Body.Type]; var rs = Expression.Call(typeof(Queryable), method, types, queryable.Expression, exp); queryable = queryable.Provider.CreateQuery(rs); isFirst = false; diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/QueryStringBuilder.cs b/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/QueryStringBuilder.cs index 499724a..c5b2c80 100644 --- a/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/QueryStringBuilder.cs +++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.Abstractions/QueryStringBuilder.cs @@ -7,7 +7,7 @@ namespace Cnblogs.Architecture.Ddd.Infrastructure.Abstractions; /// public class QueryStringBuilder { - private readonly List> _params = new(); + private readonly List> _params = []; /// /// 创建一个 。 diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.InMemory/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.InMemory.csproj b/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.InMemory/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.InMemory.csproj index ae94074..67631a4 100644 --- a/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.InMemory/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.InMemory.csproj +++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.InMemory/Cnblogs.Architecture.Ddd.Infrastructure.CacheProviders.InMemory.csproj @@ -9,15 +9,7 @@ - - - - - - - - diff --git a/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.csproj b/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.csproj index e18a1aa..33baa71 100644 --- a/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.csproj +++ b/src/Cnblogs.Architecture.Ddd.Infrastructure.Dapper/Cnblogs.Architecture.Ddd.Infrastructure.Dapper.csproj @@ -10,13 +10,6 @@ - - - - - - - diff --git a/test.sh b/test.sh deleted file mode 100755 index 4c41aad..0000000 --- a/test.sh +++ /dev/null @@ -1,3 +0,0 @@ -#!/usr/bin/env bash -set -e -dotnet test -c Release -f "$1" --no-build --no-restore diff --git a/test/Cnblogs.Architecture.IntegrationTestProject/Application/Queries/ListStringsQueryHandler.cs b/test/Cnblogs.Architecture.IntegrationTestProject/Application/Queries/ListStringsQueryHandler.cs index 3fd69fc..1d51ee7 100644 --- a/test/Cnblogs.Architecture.IntegrationTestProject/Application/Queries/ListStringsQueryHandler.cs +++ b/test/Cnblogs.Architecture.IntegrationTestProject/Application/Queries/ListStringsQueryHandler.cs @@ -8,6 +8,6 @@ public class ListStringsQueryHandler : IPageableQueryHandler public Task> Handle(ListStringsQuery request, CancellationToken cancellationToken) { - return Task.FromResult(new PagedList(new[] { "hello" })); + return Task.FromResult(new PagedList(["hello"])); } } \ No newline at end of file diff --git a/test/Cnblogs.Architecture.IntegrationTestProject/Cnblogs.Architecture.IntegrationTestProject.csproj b/test/Cnblogs.Architecture.IntegrationTestProject/Cnblogs.Architecture.IntegrationTestProject.csproj index 9c4c9b5..84c3626 100644 --- a/test/Cnblogs.Architecture.IntegrationTestProject/Cnblogs.Architecture.IntegrationTestProject.csproj +++ b/test/Cnblogs.Architecture.IntegrationTestProject/Cnblogs.Architecture.IntegrationTestProject.csproj @@ -5,7 +5,4 @@ - - - diff --git a/test/Cnblogs.Architecture.IntegrationTests/Cnblogs.Architecture.IntegrationTests.csproj b/test/Cnblogs.Architecture.IntegrationTests/Cnblogs.Architecture.IntegrationTests.csproj index cea954a..aae480f 100644 --- a/test/Cnblogs.Architecture.IntegrationTests/Cnblogs.Architecture.IntegrationTests.csproj +++ b/test/Cnblogs.Architecture.IntegrationTests/Cnblogs.Architecture.IntegrationTests.csproj @@ -10,8 +10,9 @@ all - + + diff --git a/test/Cnblogs.Architecture.IntegrationTests/CommandResponseHandlerTests.cs b/test/Cnblogs.Architecture.IntegrationTests/CommandResponseHandlerTests.cs index 6a64974..5146fd2 100644 --- a/test/Cnblogs.Architecture.IntegrationTests/CommandResponseHandlerTests.cs +++ b/test/Cnblogs.Architecture.IntegrationTests/CommandResponseHandlerTests.cs @@ -1,3 +1,4 @@ +using System.Net; using System.Net.Http.Headers; using System.Net.Http.Json; using Cnblogs.Architecture.Ddd.Cqrs.Abstractions; @@ -7,7 +8,6 @@ using Cnblogs.Architecture.IntegrationTestProject.Application.Errors; using Cnblogs.Architecture.IntegrationTestProject.Application.Queries; using Cnblogs.Architecture.IntegrationTestProject.Payloads; -using FluentAssertions; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Testing; @@ -36,7 +36,7 @@ public async Task MinimalApi_NoCqrsVersionHeader_RawResultAsync() var content = await response.Content.ReadAsStringAsync(); // Assert - content.Should().NotBeNullOrEmpty(); + Assert.False(string.IsNullOrEmpty(content)); } [Fact] @@ -53,9 +53,9 @@ public async Task MinimalApi_CqrsV2_CommandResponseAsync() var content = await response.Content.ReadFromJsonAsync>(); // Assert - response.Headers.CqrsVersion().Should().BeGreaterThan(1); - content.Should().NotBeNull(); - content.Response.Should().NotBeNullOrEmpty(); + Assert.True(response.Headers.CqrsVersion() > 1); + Assert.NotNull(content); + Assert.False(string.IsNullOrEmpty(content.Response)); } [Fact] @@ -71,8 +71,8 @@ public async Task Mvc_NoCqrsVersionHeader_RawResultAsync() var content = await response.Content.ReadAsStringAsync(); // Assert - response.Should().BeSuccessful(); - content.Should().NotBeNullOrEmpty(); + Assert.True(response.IsSuccessStatusCode); + Assert.False(string.IsNullOrEmpty(content)); } [Fact] @@ -89,9 +89,9 @@ public async Task Mvc_CurrentCqrsVersion_CommandResponseAsync() var content = await response.Content.ReadFromJsonAsync>(); // Assert - response.Should().BeSuccessful(); - response.Headers.CqrsVersion().Should().BeGreaterThan(1); - content!.Response.Should().NotBeNullOrEmpty(); + Assert.True(response.IsSuccessStatusCode); + Assert.True(response.Headers.CqrsVersion() > 1); + Assert.False(string.IsNullOrEmpty(content!.Response)); } [Theory] @@ -108,8 +108,8 @@ public async Task MinimalApi_HavingError_BadRequestAsync(bool needValidationErro var content = await response.Content.ReadAsStringAsync(); // Assert - response.Should().HaveClientError(); - content.Should().NotBeNullOrEmpty(); + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + Assert.False(string.IsNullOrEmpty(content)); } [Fact] @@ -122,7 +122,7 @@ public async Task MinimalApi_Success_OkAsync() var response = await builder.CreateClient().PutAsJsonAsync("/api/v1/strings/1", new UpdatePayload()); // Assert - response.Should().BeSuccessful(); + Assert.True(response.IsSuccessStatusCode); } [Theory] @@ -140,8 +140,8 @@ public async Task MinimalApi_HavingError_ProblemDetailsAsync(bool needValidation var content = await response.Content.ReadFromJsonAsync(); // Assert - response.Should().HaveClientError(); - content.Should().NotBeNull(); + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + Assert.NotNull(content); } [Theory] @@ -160,11 +160,11 @@ public async Task MinimalApi_HavingError_CommandResponseAsync(bool needValidatio var commandResponse = await response.Content.ReadFromJsonAsync>(); // Assert - response.Should().HaveClientError(); - commandResponse.Should().NotBeNull(); - commandResponse.IsSuccess().Should().BeFalse(); - commandResponse.Should().BeEquivalentTo(new { IsValidationError = needValidationError }); - (commandResponse.ErrorCode != null).Should().Be(needExecutionError); + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + Assert.NotNull(commandResponse); + Assert.False(commandResponse.IsSuccess()); + Assert.Equal(needValidationError, commandResponse.IsValidationError); + Assert.Equal(needExecutionError, commandResponse.ErrorCode != null); } [Theory] @@ -185,8 +185,8 @@ public async Task MinimalApi_HavingError_CustomContentAsync(bool needValidationE var content = await response.Content.ReadFromJsonAsync(); // Assert - response.Should().HaveClientError(); - content.Should().BeEquivalentTo(error); + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + Assert.Equivalent(error, content); } [Fact] @@ -199,7 +199,7 @@ public async Task Mvc_Success_OkAsync() var response = await builder.CreateClient().PutAsJsonAsync("/api/v1/mvc/strings/1", new UpdatePayload()); // Assert - response.Should().BeSuccessful(); + Assert.True(response.IsSuccessStatusCode); } [Theory] @@ -216,8 +216,8 @@ public async Task Mvc_HavingError_TextAsync(bool needValidationError, bool needE var content = await response.Content.ReadAsStringAsync(); // Assert - response.Should().HaveClientError(); - content.Should().NotBeNullOrEmpty(); + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + Assert.False(string.IsNullOrEmpty(content)); } [Theory] @@ -235,8 +235,8 @@ public async Task Mvc_HavingError_ProblemDetailAsync(bool needValidationError, b var content = await response.Content.ReadFromJsonAsync(); // Assert - response.Should().HaveClientError(); - content.Should().NotBeNull(); + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + Assert.NotNull(content); } [Theory] @@ -255,11 +255,11 @@ public async Task Mvc_HavingError_CommandResponseAsync(bool needValidationError, var content = await response.Content.ReadFromJsonAsync>(); // Assert - response.Should().HaveClientError(); - content.Should().NotBeNull(); - content.IsSuccess().Should().BeFalse(); - content.Should().BeEquivalentTo(new { IsValidationError = needValidationError }); - (content.ErrorCode != null).Should().Be(needExecutionError); + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + Assert.NotNull(content); + Assert.False(content.IsSuccess()); + Assert.Equal(needValidationError, content.IsValidationError); + Assert.Equal(needExecutionError, content.ErrorCode != null); } [Theory] @@ -280,7 +280,7 @@ public async Task Mvc_HavingError_CustomContentAsync(bool needValidationError, b var content = await response.Content.ReadFromJsonAsync(); // Assert - response.Should().HaveClientError(); - content.Should().BeEquivalentTo(error); + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); + Assert.Equivalent(error, content); } } diff --git a/test/Cnblogs.Architecture.IntegrationTests/CqrsRouteMapperTests.cs b/test/Cnblogs.Architecture.IntegrationTests/CqrsRouteMapperTests.cs index 1292aa5..53892a3 100644 --- a/test/Cnblogs.Architecture.IntegrationTests/CqrsRouteMapperTests.cs +++ b/test/Cnblogs.Architecture.IntegrationTests/CqrsRouteMapperTests.cs @@ -3,7 +3,6 @@ using Cnblogs.Architecture.Ddd.Infrastructure.Abstractions; using Cnblogs.Architecture.IntegrationTestProject; using Cnblogs.Architecture.IntegrationTestProject.Application.Commands; -using FluentAssertions; using Microsoft.AspNetCore.Mvc.Testing; namespace Cnblogs.Architecture.IntegrationTests; @@ -21,8 +20,8 @@ public async Task GetItem_SuccessAsync() var content = await response.Content.ReadAsStringAsync(); // Assert - response.Should().BeSuccessful(); - content.Should().NotBeNullOrEmpty(); + Assert.True(response.IsSuccessStatusCode); + Assert.False(string.IsNullOrEmpty(content)); } [Fact] @@ -35,7 +34,7 @@ public async Task GetItem_NotFondAsync() var response = await builder.CreateClient().GetAsync("/api/v1/strings/1?found=false"); // Assert - response.StatusCode.Should().Be(HttpStatusCode.NotFound); + Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } [Fact] @@ -49,9 +48,9 @@ public async Task ListItems_SuccessAsync() var content = await response.Content.ReadFromJsonAsync>(); // Assert - response.Should().BeSuccessful(); - content.Should().NotBeNull(); - content.Items.Should().NotBeNullOrEmpty(); + Assert.True(response.IsSuccessStatusCode); + Assert.NotNull(content); + Assert.NotEmpty(content.Items); } [Fact] @@ -64,7 +63,7 @@ public async Task CreateItems_SuccessAsync() var response = await builder.CreateClient().PostAsJsonAsync("/api/v1/strings", new { NeedError = false }); // Assert - response.Should().BeSuccessful(); + Assert.True(response.IsSuccessStatusCode); } [Fact] @@ -77,7 +76,7 @@ public async Task UpdateItem_SuccessAsync() var response = await builder.CreateClient().PutAsJsonAsync("/api/v1/strings/1", new { NeedError = false }); // Assert - response.Should().BeSuccessful(); + Assert.True(response.IsSuccessStatusCode); } [Fact] @@ -90,7 +89,7 @@ public async Task DeleteItem_SuccessAsync() var response = await builder.CreateClient().DeleteAsync("/api/v1/strings/1?needError=false"); // Assert - response.Should().BeSuccessful(); + Assert.True(response.IsSuccessStatusCode); } [Fact] @@ -109,7 +108,7 @@ await builder.CreateClient().GetAsync("/api/v1/apps/someApp/strings/1/value") }; // Assert - responses.Should().Match(x => x.All(y => y.IsSuccessStatusCode)); + Assert.All(responses, r => Assert.True(r.IsSuccessStatusCode)); } [Fact] @@ -130,7 +129,7 @@ public async Task GetItem_MapHeadAndGet_SuccessAsync() } // Assert - responses.Should().Match(x => x.All(y => y.IsSuccessStatusCode)); + Assert.All(responses, r => Assert.True(r.IsSuccessStatusCode)); } [Fact] @@ -145,7 +144,7 @@ public async Task PostItem_GenericMap_SuccessAsync() new CreateCommand(false, "data")); // Assert - response.Should().BeSuccessful(); + Assert.True(response.IsSuccessStatusCode); } [Fact] @@ -160,7 +159,7 @@ public async Task PutItem_GenericMap_SuccessAsync() new UpdateCommand(1, false, false)); // Assert - response.Should().BeSuccessful(); + Assert.True(response.IsSuccessStatusCode); } [Fact] @@ -174,6 +173,6 @@ public async Task DeleteCommand_GenericMap_SuccessAsync() var response = await builder.CreateClient().DeleteAsync("/api/v1/generic-map/strings/1" + queryBuilder.Build()); // Assert - response.Should().BeSuccessful(); + Assert.True(response.IsSuccessStatusCode); } } diff --git a/test/Cnblogs.Architecture.IntegrationTests/CustomJsonConverterTests.cs b/test/Cnblogs.Architecture.IntegrationTests/CustomJsonConverterTests.cs index dd7aa41..f331a56 100644 --- a/test/Cnblogs.Architecture.IntegrationTests/CustomJsonConverterTests.cs +++ b/test/Cnblogs.Architecture.IntegrationTests/CustomJsonConverterTests.cs @@ -3,7 +3,6 @@ using System.Text.Json; using Cnblogs.Architecture.IntegrationTestProject; using Cnblogs.Architecture.IntegrationTestProject.Models; -using FluentAssertions; using Microsoft.AspNetCore.Mvc.Testing; namespace Cnblogs.Architecture.IntegrationTests; @@ -26,7 +25,7 @@ public async Task LongToJson_WriteLongToString_CanBeParsedByServerAsync(string b var serverObject = await response.Content.ReadFromJsonAsync(WebDefaults); // Assert - serverObject.Should().BeEquivalentTo(new LongToStringModel() { Id = id }); + Assert.Equivalent(new LongToStringModel() { Id = id }, serverObject); } [Theory] @@ -43,7 +42,7 @@ public async Task LongToJson_WriteLongToString_IsStringInJsonAsync(string baseUr var browserObject = await response.Content.ReadFromJsonAsync(WebDefaults); // Assert - browserObject.EnumerateObject().First().Value.GetString().Should().Be(id.ToString()); + Assert.Equal(id.ToString(), browserObject.EnumerateObject().First().Value.GetString()); } [Theory] @@ -67,7 +66,7 @@ public async Task LongToJson_ReadLongFromString_SuccessAsync(string url) var model = await response.Content.ReadFromJsonAsync(WebDefaults); // Assert - model.EnumerateObject().First().Value.GetString().Should().Be("202410267558024668"); + Assert.Equal("202410267558024668", model.EnumerateObject().First().Value.GetString()); } [Theory] @@ -91,6 +90,6 @@ public async Task LongToJson_ReadLongFromNumber_SuccessAsync(string url) var model = await response.Content.ReadFromJsonAsync(WebDefaults); // Assert - model.EnumerateObject().First().Value.GetString().Should().Be("202410267558024668"); + Assert.Equal("202410267558024668", model.EnumerateObject().First().Value.GetString()); } } diff --git a/test/Cnblogs.Architecture.IntegrationTests/CustomModelBinderTests.cs b/test/Cnblogs.Architecture.IntegrationTests/CustomModelBinderTests.cs index b8b79c5..b647e8d 100644 --- a/test/Cnblogs.Architecture.IntegrationTests/CustomModelBinderTests.cs +++ b/test/Cnblogs.Architecture.IntegrationTests/CustomModelBinderTests.cs @@ -2,7 +2,6 @@ using System.Net.Http.Json; using Cnblogs.Architecture.Ddd.Infrastructure.Abstractions; using Cnblogs.Architecture.IntegrationTestProject; -using FluentAssertions; using Microsoft.AspNetCore.Mvc.Testing; @@ -21,7 +20,7 @@ public async Task PagingParamsModelBinder_Normal_NotNullAsync() .GetFromJsonAsync("/api/v1/mvc/paging?pageIndex=1&pageSize=30"); // Assert - response.Should().BeEquivalentTo(new PagingParams(1, 30)); + Assert.Equivalent(new PagingParams(1, 30), response); } [Theory] @@ -37,7 +36,7 @@ public async Task PagingParamsModelBinder_NoPageIndexOrPageSize_NullAsync(string var response = await builder.CreateClient().GetAsync($"/api/v1/mvc/paging{query}"); // Assert - response.StatusCode.Should().Be(HttpStatusCode.NoContent); + Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); } [Theory] @@ -52,7 +51,7 @@ public async Task PagingParamsModelBinder_PageIndexInvalid_FailAsync(string page var response = await builder.CreateClient().GetAsync($"/api/v1/mvc/paging?pageIndex={pageIndex}&pageSize=10"); // Assert - response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); } [Theory] @@ -67,6 +66,6 @@ public async Task PagingParamsModelBinder_PageSizeInvalid_FailAsync(string pageS var response = await builder.CreateClient().GetAsync($"/api/v1/mvc/paging?pageIndex=1&pageSize={pageSize}"); // Assert - response.StatusCode.Should().Be(HttpStatusCode.BadRequest); + Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); } -} \ No newline at end of file +} diff --git a/test/Cnblogs.Architecture.IntegrationTests/DaprTests.cs b/test/Cnblogs.Architecture.IntegrationTests/DaprTests.cs index 8930ffd..6b84c7a 100644 --- a/test/Cnblogs.Architecture.IntegrationTests/DaprTests.cs +++ b/test/Cnblogs.Architecture.IntegrationTests/DaprTests.cs @@ -3,7 +3,6 @@ using Cnblogs.Architecture.Ddd.EventBus.Dapr; using Cnblogs.Architecture.IntegrationTestProject.EventHandlers; using Cnblogs.Architecture.TestIntegrationEvents; -using FluentAssertions; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.TestHost; using Microsoft.Extensions.DependencyInjection; @@ -40,12 +39,12 @@ public async Task Dapr_SubscribeEndpoint_OkAsync(SubscribeType subscribeType) // Act var response = await httpClient.GetAsync("/dapr/subscribe"); + var responseText = await response.Content.ReadAsStringAsync(); // Assert - response.Should().BeSuccessful(); - var responseText = await response.Content.ReadAsStringAsync(); - responseText.Should().Contain(nameof(TestIntegrationEvent)); - responseText.Should().Contain(nameof(BlogPostCreatedIntegrationEvent)); + Assert.True(response.IsSuccessStatusCode); + Assert.Contains(nameof(TestIntegrationEvent), responseText); + Assert.Contains(nameof(BlogPostCreatedIntegrationEvent), responseText); } [Fact] @@ -65,7 +64,7 @@ public async Task Dapr_SubscribeWithoutAnyAssembly_OkAsync() var response = await httpClient.GetAsync("/dapr/subscribe"); // Assert - response.StatusCode.Should().Be(HttpStatusCode.OK); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); } [Fact] @@ -85,6 +84,6 @@ public async Task Dapr_MapSubscribeHandler_OkAsync() var response = await httpClient.GetAsync("/dapr/subscribe"); // Assert - response.StatusCode.Should().Be(HttpStatusCode.OK); + Assert.Equal(HttpStatusCode.OK, response.StatusCode); } } diff --git a/test/Cnblogs.Architecture.IntegrationTests/IntegrationEventHandlerTests.cs b/test/Cnblogs.Architecture.IntegrationTests/IntegrationEventHandlerTests.cs index f078764..2448b2e 100644 --- a/test/Cnblogs.Architecture.IntegrationTests/IntegrationEventHandlerTests.cs +++ b/test/Cnblogs.Architecture.IntegrationTests/IntegrationEventHandlerTests.cs @@ -3,27 +3,19 @@ using Cnblogs.Architecture.Ddd.EventBus.Dapr; using Cnblogs.Architecture.IntegrationTestProject.EventHandlers; using Cnblogs.Architecture.TestIntegrationEvents; -using FluentAssertions; using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.TestHost; using Microsoft.Extensions.Logging; using Serilog; +using Serilog.Events; using Serilog.Sinks.InMemory; -using Serilog.Sinks.InMemory.Assertions; using Xunit.Abstractions; using static Cnblogs.Architecture.IntegrationTestProject.Constants; namespace Cnblogs.Architecture.IntegrationTests; -public class IntegrationEventHandlerTests +public class IntegrationEventHandlerTests(ITestOutputHelper testOutputHelper) { - private readonly ITestOutputHelper _testOutputHelper; - - public IntegrationEventHandlerTests(ITestOutputHelper testOutputHelper) - { - _testOutputHelper = testOutputHelper; - } - [Fact] public async Task IntegrationEventHandler_TestIntegrationEvent_SuccessAsync() { @@ -44,12 +36,17 @@ public async Task IntegrationEventHandler_TestIntegrationEvent_SuccessAsync() var subscriptions = await client.GetFromJsonAsync("/dapr/subscribe"); var sub = subscriptions!.First(x => x.Route.Contains(nameof(TestIntegrationEvent))); var response = await client.PostAsJsonAsync(sub.Route, @event); - _testOutputHelper.WriteLine("Subscription Route: " + sub.Route); + testOutputHelper.WriteLine("Subscription Route: " + sub.Route); // Assert - response.Should().BeSuccessful(); - InMemorySink.Instance - .Should().HaveMessage(LogTemplates.HandledIntegratonEvent).Appearing().Once() - .WithProperty("event").HavingADestructuredObject().WithProperty("Id").WithValue(@event.Id); + Assert.True(response.IsSuccessStatusCode); + var messages = + InMemorySink.Instance.LogEvents + .Where(x => x.MessageTemplate.Text == LogTemplates.HandledIntegratonEvent) + .ToList(); + var msg = Assert.Single(messages)!; + var value = msg.Properties["event"] as StructureValue; + Assert.NotNull(value); + Assert.Contains(value.Properties, prop => prop.Name == "Id" && prop.Value.ToString() == @event.Id.ToString()); } } diff --git a/test/Cnblogs.Architecture.IntegrationTests/IntegrationEventPublishTests.cs b/test/Cnblogs.Architecture.IntegrationTests/IntegrationEventPublishTests.cs index 8fbb04c..a5e8874 100644 --- a/test/Cnblogs.Architecture.IntegrationTests/IntegrationEventPublishTests.cs +++ b/test/Cnblogs.Architecture.IntegrationTests/IntegrationEventPublishTests.cs @@ -4,7 +4,6 @@ using Cnblogs.Architecture.IntegrationTestProject; using Cnblogs.Architecture.IntegrationTestProject.Payloads; using Cnblogs.Architecture.TestIntegrationEvents; -using FluentAssertions; using Microsoft.AspNetCore.Mvc.Testing; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection.Extensions; @@ -38,8 +37,8 @@ public async Task EventBus_PublishEvent_SuccessAsync() await Task.Delay(1500); // Assert - response.Should().BeSuccessful(); - content.Should().NotBeNullOrEmpty(); + Assert.True(response.IsSuccessStatusCode); + Assert.False(string.IsNullOrEmpty(content)); await eventBusMock.Received(1).PublishAsync( Arg.Any(), Arg.Is(t => t.Message == data)); @@ -76,8 +75,8 @@ public async Task EventBus_Downgrading_DowngradeAsync() await Task.Delay(3000); // hit at 1000ms and 3000ms // Assert - response.Should().BeSuccessful(); - content.Should().NotBeNullOrEmpty(); + Assert.True(response.IsSuccessStatusCode); + Assert.False(string.IsNullOrEmpty(content)); await eventBusMock.Received(2).PublishAsync( Arg.Any(), Arg.Is(t => t.Message == data)); @@ -115,7 +114,7 @@ await client.PostAsJsonAsync( var response = await client.PostAsJsonAsync("/api/v1/strings", new CreatePayload(false, data)); // Assert - response.Should().HaveStatusCode(HttpStatusCode.InternalServerError); + Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); } [Fact] diff --git a/test/Cnblogs.Architecture.TestShared/Cnblogs.Architecture.TestShared.csproj b/test/Cnblogs.Architecture.TestShared/Cnblogs.Architecture.TestShared.csproj index f78e6e2..edcb1ea 100644 --- a/test/Cnblogs.Architecture.TestShared/Cnblogs.Architecture.TestShared.csproj +++ b/test/Cnblogs.Architecture.TestShared/Cnblogs.Architecture.TestShared.csproj @@ -1,16 +1,6 @@ - - - - - - - - - - - + diff --git a/test/Cnblogs.Architecture.TestShared/EntityGenerator.cs b/test/Cnblogs.Architecture.TestShared/EntityGenerator.cs index 1c4af45..e1f213b 100644 --- a/test/Cnblogs.Architecture.TestShared/EntityGenerator.cs +++ b/test/Cnblogs.Architecture.TestShared/EntityGenerator.cs @@ -8,8 +8,8 @@ namespace Cnblogs.Architecture.TestShared; /// Entity type to generate. public partial class EntityGenerator { - private readonly List _template = new(); - private readonly List> _customCloneSetups = new(); + private readonly List _template = []; + private readonly List> _customCloneSetups = []; /// /// Create entity based on given template. diff --git a/test/Cnblogs.Architecture.UnitTests/Cnblogs.Architecture.UnitTests.csproj b/test/Cnblogs.Architecture.UnitTests/Cnblogs.Architecture.UnitTests.csproj index 13c1ac6..1f86a30 100644 --- a/test/Cnblogs.Architecture.UnitTests/Cnblogs.Architecture.UnitTests.csproj +++ b/test/Cnblogs.Architecture.UnitTests/Cnblogs.Architecture.UnitTests.csproj @@ -1,22 +1,24 @@ - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - - - runtime; build; native; contentfiles; analyzers; buildtransitive - all - - + + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + + + runtime; build; native; contentfiles; analyzers; buildtransitive + all + + - - - - - - + + + + + + diff --git a/test/Cnblogs.Architecture.UnitTests/Cqrs/Behaviors/CacheBehaviorTests.cs b/test/Cnblogs.Architecture.UnitTests/Cqrs/Behaviors/CacheBehaviorTests.cs index 82f6644..92670f4 100644 --- a/test/Cnblogs.Architecture.UnitTests/Cqrs/Behaviors/CacheBehaviorTests.cs +++ b/test/Cnblogs.Architecture.UnitTests/Cqrs/Behaviors/CacheBehaviorTests.cs @@ -3,8 +3,6 @@ using Cnblogs.Architecture.Ddd.Infrastructure.Abstractions; using Cnblogs.Architecture.UnitTests.Cqrs.FakeObjects; -using FluentAssertions; - using MediatR; using Microsoft.Extensions.Logging.Abstractions; @@ -37,7 +35,7 @@ public async Task CacheBehavior_DisableCache_NotCacheAsync() CancellationToken.None); // Assert - result.Should().Be("noCache"); + Assert.Equal("noCache", result); } [Fact] @@ -59,7 +57,7 @@ public async Task CacheBehavior_EnableLocal_NoCache_UpdateAsync() CancellationToken.None); // Assert - result.Should().Be("noCache"); + Assert.Equal("noCache", result); await local.Received(1).UpdateAsync(Arg.Any(), Arg.Any(), Arg.Any()); } @@ -84,7 +82,7 @@ public async Task CacheBehavior_EnableLocal_HasCache_UseCacheAsync() CancellationToken.None); // Assert - result.Should().Be("cacheValue"); + Assert.Equal("cacheValue", result); await local.Received(0).UpdateAsync(Arg.Any(), Arg.Any(), Arg.Any()); await remote.Received(0).GetAsync(Arg.Any()); } @@ -109,7 +107,7 @@ public async Task CacheBehavior_EnableRemote_NoCache_UpdateAsync() CancellationToken.None); // Assert - result.Should().Be("noCache"); + Assert.Equal("noCache", result); await local.Received(0).UpdateAsync(Arg.Any(), Arg.Any(), Arg.Any()); await remote.Received(1).UpdateAsync(Arg.Any(), Arg.Any(), Arg.Any()); } @@ -134,7 +132,7 @@ public async Task CacheBehavior_EnableRemote_HasCache_UseCacheAsync() CancellationToken.None); // Assert - result.Should().Be("cacheValue"); + Assert.Equal("cacheValue", result); await local.Received(0).GetAsync(Arg.Any()); } @@ -160,7 +158,7 @@ public async Task CacheBehavior_ThrowOnGet_ThrowAsync() CancellationToken.None); // Assert - await act.Should().ThrowAsync(); + await Assert.ThrowsAsync(act); } [Fact] @@ -185,7 +183,7 @@ public async Task CacheBehavior_ThrowOnGet_NoThrowAsync() CancellationToken.None); // Assert - result.Should().Be("noCache"); + Assert.Equal("noCache", result); } [Fact] @@ -211,7 +209,7 @@ public async Task CacheBehavior_ThrowOnUpdate_ThrowAsync() CancellationToken.None); // Assert - await act.Should().ThrowAsync(); + await Assert.ThrowsAsync(act); } [Fact] @@ -226,7 +224,7 @@ public async Task CacheBehavior_NotThrowOnUpdate_NotThrowAsync() o => o.ThrowIfFailedOnUpdate = false); // Act - var act = async () => await behavior.Handle( + var res = await behavior.Handle( new FakeQuery(null, "cacheKey") { LocalCacheBehavior = CacheBehavior.DisabledCache, @@ -237,7 +235,7 @@ public async Task CacheBehavior_NotThrowOnUpdate_NotThrowAsync() CancellationToken.None); // Assert - await act.Should().NotThrowAsync(); + Assert.NotNull(res); } [Fact] @@ -247,7 +245,7 @@ public void CacheBehavior_NoProvider_Throw() var act = () => GetBehavior, string>([]); // Assert - act.Should().Throw(); + Assert.Throws(act); } private static CacheableRequestBehavior GetBehavior( diff --git a/test/Cnblogs.Architecture.UnitTests/Cqrs/Behaviors/ValidationBehaviorTests.cs b/test/Cnblogs.Architecture.UnitTests/Cqrs/Behaviors/ValidationBehaviorTests.cs index 841117c..d0b3dd5 100644 --- a/test/Cnblogs.Architecture.UnitTests/Cqrs/Behaviors/ValidationBehaviorTests.cs +++ b/test/Cnblogs.Architecture.UnitTests/Cqrs/Behaviors/ValidationBehaviorTests.cs @@ -1,6 +1,5 @@ using Cnblogs.Architecture.Ddd.Cqrs.Abstractions; using Cnblogs.Architecture.UnitTests.Cqrs.FakeObjects; -using FluentAssertions; using Microsoft.Extensions.Logging.Abstractions; namespace Cnblogs.Architecture.UnitTests.Cqrs.Behaviors; @@ -21,7 +20,7 @@ public async Task ValidationBehavior_ValidationFailed_ReturnObjectAsync() // Assert var errors = new ValidationErrors { error }; - result.Should().BeEquivalentTo(new { IsValidationError = true, ValidationErrors = errors }); + Assert.Equivalent(new { IsValidationError = true, ValidationErrors = errors }, result); } [Fact] @@ -36,6 +35,6 @@ public async Task ValidationBehavior_ValidationSuccess_ReturnNextAsync() var result = await behavior.Handle(request, _ => Task.FromResult(new FakeResponse()), CancellationToken.None); // Assert - result.Should().BeEquivalentTo(new { IsValidationError = false, ValidationErrors = new ValidationErrors() }); + Assert.Equivalent(new { IsValidationError = false, ValidationErrors = new ValidationErrors() }, result); } } diff --git a/test/Cnblogs.Architecture.UnitTests/Cqrs/FakeObjects/FakeQuery.cs b/test/Cnblogs.Architecture.UnitTests/Cqrs/FakeObjects/FakeQuery.cs index e9c3ddd..485babc 100644 --- a/test/Cnblogs.Architecture.UnitTests/Cqrs/FakeObjects/FakeQuery.cs +++ b/test/Cnblogs.Architecture.UnitTests/Cqrs/FakeObjects/FakeQuery.cs @@ -51,7 +51,7 @@ public FakeQuery(string? cacheGroupKey, string cacheKey) /// public object?[] GetCacheKeyParameters() { - return new object?[] { _cacheKey }; + return [_cacheKey]; } /// diff --git a/test/Cnblogs.Architecture.UnitTests/Cqrs/FakeObjects/FakeResponse.cs b/test/Cnblogs.Architecture.UnitTests/Cqrs/FakeObjects/FakeResponse.cs index 7f9e565..aca69bc 100644 --- a/test/Cnblogs.Architecture.UnitTests/Cqrs/FakeObjects/FakeResponse.cs +++ b/test/Cnblogs.Architecture.UnitTests/Cqrs/FakeObjects/FakeResponse.cs @@ -11,5 +11,5 @@ public class FakeResponse : IValidationResponse public string ErrorMessage { get; init; } = string.Empty; /// - public ValidationErrors ValidationErrors { get; init; } = new(); + public ValidationErrors ValidationErrors { get; init; } = []; } \ No newline at end of file diff --git a/test/Cnblogs.Architecture.UnitTests/Cqrs/Handlers/InvalidCacheRequestHandlerTests.cs b/test/Cnblogs.Architecture.UnitTests/Cqrs/Handlers/InvalidCacheRequestHandlerTests.cs index 9461e6c..ff98998 100644 --- a/test/Cnblogs.Architecture.UnitTests/Cqrs/Handlers/InvalidCacheRequestHandlerTests.cs +++ b/test/Cnblogs.Architecture.UnitTests/Cqrs/Handlers/InvalidCacheRequestHandlerTests.cs @@ -2,9 +2,6 @@ using Cnblogs.Architecture.Ddd.Domain.Abstractions; using Cnblogs.Architecture.Ddd.Infrastructure.Abstractions; using Cnblogs.Architecture.UnitTests.Cqrs.FakeObjects; - -using FluentAssertions; - using Microsoft.Extensions.Logging.Abstractions; using Microsoft.Extensions.Options; using NSubstitute; @@ -15,14 +12,14 @@ namespace Cnblogs.Architecture.UnitTests.Cqrs.Handlers; public class InvalidCacheRequestHandlerTests { [Fact] - public Task InvalidCache_ThrowOnRemove_ThrowAsync() + public async Task InvalidCache_ThrowOnRemove_ThrowAsync() { // Arrange var provider = Substitute.For(); provider.RemoveAsync(Arg.Any()) .ThrowsAsync(new InvalidOperationException()); var handler = CreateInvalidCacheRequestHandler( - new List() { provider }, + [provider], o => o.ThrowIfFailedOnRemove = true); // Act @@ -31,47 +28,45 @@ public Task InvalidCache_ThrowOnRemove_ThrowAsync() CancellationToken.None); // Assert - return act.Should().ThrowAsync(); + await Assert.ThrowsAsync(act); } [Fact] - public Task InvalidCache_ThrowOnRemove_NotThrowAsync() + public async Task InvalidCache_ThrowOnRemove_NotThrowAsync() { // Arrange var provider = Substitute.For(); provider.RemoveAsync(Arg.Any()) .ThrowsAsync(new InvalidOperationException()); var handler = CreateInvalidCacheRequestHandler( - new List() { provider }, + [provider], o => o.ThrowIfFailedOnRemove = false); // Act - var act = async () => await handler.Handle( + await handler.Handle( new InvalidCacheRequest(new FakeQuery()), CancellationToken.None); - // Assert - return act.Should().NotThrowAsync(); + // Assert-Not throws. } [Fact] - public Task InvalidCache_ThrowOnRemove_OverrideByRequest_NotThrowAsync() + public async Task InvalidCache_ThrowOnRemove_OverrideByRequest_NotThrowAsync() { // Arrange var provider = Substitute.For(); provider.RemoveAsync(Arg.Any()) .ThrowsAsync(new InvalidOperationException()); var handler = CreateInvalidCacheRequestHandler( - new List() { provider }, + [provider], o => o.ThrowIfFailedOnRemove = true); // Act - var act = async () => await handler.Handle( + await handler.Handle( new InvalidCacheRequest(new FakeQuery(), false, false), CancellationToken.None); - // Assert - return act.Should().NotThrowAsync(); + // Assert-Not throws } [Fact] @@ -81,7 +76,7 @@ public async Task InvalidCache_RemoveCacheAsync() var remote = Substitute.For(); var local = Substitute.For(); var handler = CreateInvalidCacheRequestHandler( - new List() { remote, local }, + [remote, local], o => o.ThrowIfFailedOnRemove = false); // Act @@ -101,7 +96,7 @@ public async Task InvalidCache_RemoveGroupCacheAsync() var remote = Substitute.For(); var local = Substitute.For(); var handler = CreateInvalidCacheRequestHandler( - new List() { remote, local }, + [remote, local], o => o.ThrowIfFailedOnRemove = false); // Act @@ -120,10 +115,10 @@ await handler.Handle( public void InvalidCache_NoProvider_Throw() { // Act - var act = () => CreateInvalidCacheRequestHandler(new List()); + var act = () => CreateInvalidCacheRequestHandler([]); // Assert - act.Should().Throw(); + Assert.Throws(act); } private InvalidCacheRequestHandler CreateInvalidCacheRequestHandler( diff --git a/test/Cnblogs.Architecture.UnitTests/EventBus/AssemblyAttributeTests.cs b/test/Cnblogs.Architecture.UnitTests/EventBus/AssemblyAttributeTests.cs index 47325a3..9fe519e 100644 --- a/test/Cnblogs.Architecture.UnitTests/EventBus/AssemblyAttributeTests.cs +++ b/test/Cnblogs.Architecture.UnitTests/EventBus/AssemblyAttributeTests.cs @@ -1,7 +1,6 @@ using Cnblogs.Architecture.Ddd.EventBus.Abstractions; using Cnblogs.Architecture.Ddd.EventBus.Dapr; using Cnblogs.Architecture.TestIntegrationEvents; -using FluentAssertions; using Microsoft.AspNetCore.Builder; using Microsoft.Extensions.DependencyInjection; @@ -18,10 +17,9 @@ public void SubscribeByAssemblyMeta_Success() var app = builder.Build(); // Act - var act = () => app.Subscribe(); + app.Subscribe(); - // Assert - act.Should().NotThrow(); + // Assert-Not throws } [Fact] @@ -35,6 +33,6 @@ public void SubscribeByAssemblyMeta_Throw() var act = () => app.Subscribe(); // Assert - act.Should().Throw(); + Assert.Throws(act); } } diff --git a/test/Cnblogs.Architecture.UnitTests/Infrastructure/EntityFramework/BaseRepositoryTests.cs b/test/Cnblogs.Architecture.UnitTests/Infrastructure/EntityFramework/BaseRepositoryTests.cs index bd412e1..703dc68 100644 --- a/test/Cnblogs.Architecture.UnitTests/Infrastructure/EntityFramework/BaseRepositoryTests.cs +++ b/test/Cnblogs.Architecture.UnitTests/Infrastructure/EntityFramework/BaseRepositoryTests.cs @@ -1,7 +1,6 @@ using Cnblogs.Architecture.Ddd.Domain.Abstractions; using Cnblogs.Architecture.TestShared; using Cnblogs.Architecture.UnitTests.Infrastructure.FakeObjects; -using FluentAssertions; using MediatR; using Microsoft.EntityFrameworkCore; using NSubstitute; @@ -33,8 +32,8 @@ public async Task GetEntityAsync_Include_GetEntityAsync() var got = await repository.GetAsync(entity.Id, e => e.Posts); // Assert - got.Should().NotBeNull(); - got.Posts.Should().BeEquivalentTo(entity.Posts); + Assert.NotNull(got); + Assert.Equivalent(entity.Posts, got.Posts); } [Fact] @@ -59,8 +58,8 @@ public async Task GetEntityAsync_StringBasedInclude_NotNullAsync() var got = await repository.GetAsync(entity.Id, new List() { nameof(entity.Posts) }); // Assert - got.Should().NotBeNull(); - got.Posts.Should().BeEquivalentTo(entity.Posts); + Assert.NotNull(got); + Assert.Equivalent(entity.Posts, got.Posts); } [Fact] @@ -86,8 +85,8 @@ public async Task GetEntityAsync_ThenInclude_NotNullAsync() var got = await repository.GetAsync(entity.Id, new List() { "Posts.Tags" }); // Assert - got.Should().NotBeNull(); - got.Posts.Should().BeEquivalentTo(entity.Posts); + Assert.NotNull(got); + Assert.Equivalent(entity.Posts, got.Posts); } [Fact] @@ -114,8 +113,8 @@ public async Task SaveEntitiesAsync_CallBeforeUpdateForRelatedEntity_UpdateDateU await repository.UpdateAsync(entity); // Assert - entity.DateUpdated.Should().BeAfter(DateTimeOffset.Now.AddDays(-1)); - entity.Posts.Should().AllSatisfy(x => x.DateUpdated.Should().BeAfter(DateTimeOffset.Now.AddDays(-1))); + Assert.True(entity.DateUpdated > DateTimeOffset.Now.AddDays(-1)); + Assert.All(entity.Posts, post => Assert.True(post.DateUpdated > DateTimeOffset.Now.AddDays(-1))); } [Fact] @@ -244,8 +243,8 @@ public async Task SaveEntitiesAsync_DispatchEntityDomainEventsWithMultipleExcept // Assert var eventCount = 1 + entity.Posts.Count; - (await act.Should().ThrowAsync()).And.InnerExceptions.Should() - .HaveCount(eventCount); + var exception = await Assert.ThrowsAsync(act); + Assert.Equal(eventCount, exception.InnerExceptions.Count); await mediator.Received(1).Publish( Arg.Is(d => ((FakeDomainEvent)d).Id != 0 && ((FakeDomainEvent)d).FakeValue == 1), Arg.Any()); diff --git a/test/Cnblogs.Architecture.UnitTests/Infrastructure/MongoDb/MongoBaseRepositoryTests.cs b/test/Cnblogs.Architecture.UnitTests/Infrastructure/MongoDb/MongoBaseRepositoryTests.cs index 736370c..a0735bd 100644 --- a/test/Cnblogs.Architecture.UnitTests/Infrastructure/MongoDb/MongoBaseRepositoryTests.cs +++ b/test/Cnblogs.Architecture.UnitTests/Infrastructure/MongoDb/MongoBaseRepositoryTests.cs @@ -1,6 +1,5 @@ using Cnblogs.Architecture.Ddd.Domain.Abstractions; using Cnblogs.Architecture.UnitTests.Infrastructure.FakeObjects; -using FluentAssertions; using MongoDB.Driver; using NSubstitute; @@ -20,7 +19,7 @@ public async Task AddAsync_WithDomainEvent_SaveThenPublishAsync() var response = await repository.AddAsync(blog); // Assert - response.Should().NotBeNull(); + Assert.NotNull(response); await repository.MongoDbContext.MongoDatabaseMock.GetCollection(string.Empty) .Received(1) .InsertOneAsync( @@ -42,7 +41,7 @@ public async Task AddRangeAsync_WithDomainEvent_SaveThenPublishAsync() var response = await repository.AddRangeAsync(blogs); // Assert - response.Should().HaveSameCount(blogs); + Assert.Equal(blogs.Count, response.Count); await repository.MongoDbContext.MongoDatabaseMock.GetCollection(string.Empty) .Received(1) .InsertManyAsync( @@ -65,7 +64,7 @@ public async Task DeleteAsync_WithDomainEvent_SaveThenPublishAsync() var response = await repository.DeleteAsync(blog); // Assert - response.Should().NotBeNull(); + Assert.NotNull(response); await repository.MongoDbContext.MongoDatabaseMock.GetCollection(string.Empty) .Received(1) .DeleteOneAsync(Arg.Any>(), Arg.Any()); @@ -84,7 +83,7 @@ public async Task UpdateAsync_WithDomainEvent_SaveThenPublishAsync() var response = await repository.UpdateAsync(blog); // Assert - response.Should().NotBeNull(); + Assert.NotNull(response); await repository.MongoDbContext.MongoDatabaseMock.GetCollection(string.Empty) .Received(1) .ReplaceOneAsync( @@ -107,7 +106,7 @@ public async Task UpdateRangeAsync_WithDomainEvent_SaveThenPublishAsync() var response = await repository.UpdateRangeAsync(blogs); // Assert - response.Should().HaveSameCount(blogs); + Assert.Equal(blogs.Count, response.Count()); await repository.MongoDbContext.MongoDatabaseMock.GetCollection(string.Empty).Received(1) .BulkWriteAsync( Arg.Any>>(), @@ -131,7 +130,7 @@ public async Task Uow_Insert_CommitAsync() var response = await uow.SaveEntitiesAsync(); // Assert - response.Should().BeTrue(); + Assert.True(response); await repository.MongoDbContext.ClientSessionHandleMock.Received(1) .CommitTransactionAsync(Arg.Any()); await repository.MongoDbContext.MongoDatabaseMock.GetCollection(string.Empty).Received(1) @@ -158,7 +157,7 @@ public async Task Uow_InsertThenRemove_NoChangeAsync() var response = await uow.SaveEntitiesAsync(); // Assert - response.Should().BeTrue(); + Assert.True(response); await repository.MongoDbContext.MongoDatabaseMock.GetCollection(string.Empty).Received(0) .BulkWriteAsync( Arg.Any(), @@ -183,7 +182,7 @@ public async Task Uow_DeleteThenInsert_UpdateAsync() var response = await uow.SaveEntitiesAsync(); // Assert - response.Should().BeTrue(); + Assert.True(response); await repository.MongoDbContext.MongoDatabaseMock.GetCollection(string.Empty).Received(1) .BulkWriteAsync( Arg.Any(), @@ -207,7 +206,7 @@ public void Uow_DeleteThenUpdate_Throw() var act = () => uow.Update(blog); // Assert - act.Should().Throw(); + Assert.Throws(act); } [Fact] @@ -224,7 +223,7 @@ public void Uow_UpdateThenInsert_Throw() var act = () => uow.Add(blog); // Assert - act.Should().ThrowExactly(); + Assert.Throws(act); } [Fact] @@ -241,7 +240,7 @@ public async Task Uow_DeleteWithDomainEvent_CommitAsync() var response = await uow.SaveEntitiesAsync(); // Assert - response.Should().BeTrue(); + Assert.True(response); await repository.MongoDbContext.ClientSessionHandleMock.Received(1) .CommitTransactionAsync(Arg.Any()); await repository.MongoDbContext.MongoDatabaseMock.GetCollection(string.Empty).Received(1) diff --git a/test/Cnblogs.Architecture.UnitTests/Infrastructure/PagedListTests.cs b/test/Cnblogs.Architecture.UnitTests/Infrastructure/PagedListTests.cs index 781f0fd..bbc2626 100644 --- a/test/Cnblogs.Architecture.UnitTests/Infrastructure/PagedListTests.cs +++ b/test/Cnblogs.Architecture.UnitTests/Infrastructure/PagedListTests.cs @@ -1,9 +1,5 @@ using System.Text.Json; - using Cnblogs.Architecture.Ddd.Infrastructure.Abstractions; - -using FluentAssertions; - using Mapster; namespace Cnblogs.Architecture.UnitTests.Infrastructure; @@ -20,24 +16,24 @@ public void PagedListSelfMappable() var mapped = pagedList.Adapt>(); // Assert - pagedList.Items.Select(a => a.Value).Should().BeEquivalentTo(mapped.Items.Select(b => b.Value)); + Assert.Equivalent(mapped.Items.Select(b => b.Value), pagedList.Items.Select(s => s.Value)); } [Fact] public void PagedListSerializableToAndFromJson() { // Arrange - PagedList pagedList = new(new[] { "a", "b", "c" }); + PagedList pagedList = new(["a", "b", "c"]); // Act var json = JsonSerializer.Serialize(pagedList); var deserialized = JsonSerializer.Deserialize>(json); // Assert - pagedList.Should().BeEquivalentTo(deserialized); + Assert.Equivalent(deserialized, pagedList); } private record ADto(string Value); private record BDto(string Value); -} \ No newline at end of file +}