From 5aa3a6f820bc66814398ef9d7996bc21b8b245c8 Mon Sep 17 00:00:00 2001 From: Alexandre Brandizzi Date: Wed, 23 Sep 2026 03:44:44 -0300 Subject: [PATCH] test: exercise team member rollback through DI --- .../TeamMemberCreateTransactionTests.cs | 65 ++++++++----------- 1 file changed, 28 insertions(+), 37 deletions(-) diff --git a/SeaHavenIndustries.Tests/TeamMemberCreateTransactionTests.cs b/SeaHavenIndustries.Tests/TeamMemberCreateTransactionTests.cs index 43c2d40..bc7abe8 100644 --- a/SeaHavenIndustries.Tests/TeamMemberCreateTransactionTests.cs +++ b/SeaHavenIndustries.Tests/TeamMemberCreateTransactionTests.cs @@ -6,12 +6,17 @@ using Microsoft.AspNetCore.Identity.EntityFrameworkCore; using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata; -using Microsoft.Extensions.Logging.Abstractions; +using Microsoft.Extensions.Configuration; +using Microsoft.Extensions.DependencyInjection; +using Microsoft.Extensions.DependencyInjection.Extensions; using SeaHaven.DataServices.Dto; using SeaHaven.DataServices.Implementation; +using SeaHaven.DataServices.DependencyInjection; using SeaHaven.DataServices.Interfaces; using SeaHaven.Services.DTOs; +using SeaHaven.Services.DependencyInjection; using SeaHaven.Services.Implementation; +using SeaHaven.Services.Interfaces; namespace SeaHavenIndustries.Tests; @@ -30,18 +35,27 @@ public sealed class TeamMemberCreateTransactionTests await using (var setup = new SqliteTeamMemberTestDbContext(options)) await setup.Database.EnsureCreatedAsync(); - await using (var createScope = new SqliteTeamMemberTestDbContext(options)) - { - var permissionData = new ThrowingAfterPersistPermissionDataService( - new TeamPermissionOverrideDataService(createScope)); - var service = new TeamMemberService( - CreateUserManager(createScope), - CreateRoleManager(createScope), - new UserServiceAreaDataService(createScope), - permissionData, - new UserDataService(createScope), - permissionService: null!); + var configuration = new ConfigurationBuilder().Build(); + var services = new ServiceCollection(); + services.AddLogging(); + services.AddDbContext(builder => builder.UseSqlite(connection)); + services.Replace(ServiceDescriptor.Scoped(provider => + new SqliteTeamMemberTestDbContext( + provider.GetRequiredService>()))); + services.AddIdentity() + .AddEntityFrameworkStores() + .AddDefaultTokenProviders(); + services.AddDataServices(); + services.AddBusinessServices(configuration); + services.AddScoped(); + services.AddScoped(provider => + new ThrowingAfterPersistPermissionDataService( + provider.GetRequiredService())); + await using var serviceProvider = services.BuildServiceProvider(); + await using (var createScope = serviceProvider.CreateAsyncScope()) + { + var service = createScope.ServiceProvider.GetRequiredService(); var failure = await Record.ExceptionAsync(() => service.CreateAsync( ValidRequest(), Admin(), @@ -51,7 +65,8 @@ public sealed class TeamMemberCreateTransactionTests Assert.Equal("injected mid-sequence failure", failure!.Message); } - await using var verify = new SqliteTeamMemberTestDbContext(options); + await using var verifyScope = serviceProvider.CreateAsyncScope(); + var verify = verifyScope.ServiceProvider.GetRequiredService(); Assert.Empty(await verify.Users.AsNoTracking().ToListAsync()); Assert.Empty(await verify.Roles.AsNoTracking().ToListAsync()); Assert.Empty(await verify.UserRoles.AsNoTracking().ToListAsync()); @@ -59,26 +74,6 @@ public sealed class TeamMemberCreateTransactionTests Assert.Empty(await verify.UserPermissionOverrides.AsNoTracking().ToListAsync()); } - private static UserManager CreateUserManager(ApplicationDbContext context) => - new( - new UserStore(context), - Microsoft.Extensions.Options.Options.Create(new IdentityOptions()), - new PasswordHasher(), - Array.Empty>(), - Array.Empty>(), - new UpperInvariantLookupNormalizer(), - new IdentityErrorDescriber(), - new EmptyServiceProvider(), - NullLogger>.Instance); - - private static RoleManager CreateRoleManager(ApplicationDbContext context) => - new( - new RoleStore(context), - Array.Empty>(), - new UpperInvariantLookupNormalizer(), - new IdentityErrorDescriber(), - NullLogger>.Instance); - private static CreateTeamMemberRequestDTO ValidRequest() => new() { Name = "Taylor Dispatcher", @@ -155,8 +150,4 @@ public sealed class TeamMemberCreateTransactionTests _inner.ClearOverridesAsync(userId, cancellationToken); } - private sealed class EmptyServiceProvider : IServiceProvider - { - public object? GetService(Type serviceType) => null; - } }