tests: refactor test suite to match new project structure

This commit is contained in:
Stevan Freeborn
2026-02-02 04:49:00 -06:00
parent 7c6e43d62d
commit 822da7368c
9 changed files with 50 additions and 12 deletions
@@ -17,6 +17,8 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\FiscalOS.API\FiscalOS.API.csproj" /> <ProjectReference Include="..\..\src\FiscalOS.API\FiscalOS.API.csproj" />
<ProjectReference Include="..\..\src\FiscalOS.Core\FiscalOS.Core.csproj" />
<ProjectReference Include="..\..\src\FiscalOS.Infra\FiscalOS.Infra.csproj" />
</ItemGroup> </ItemGroup>
</Project> </Project>
@@ -1,9 +1,3 @@
using FiscalOS.API.Data;
using Microsoft.AspNetCore.TestHost;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Options;
namespace FiscalOS.API.Tests.Infra; namespace FiscalOS.API.Tests.Infra;
public class TestApi : WebApplicationFactory<Program> public class TestApi : WebApplicationFactory<Program>
@@ -19,6 +19,13 @@ public abstract class IntegrationTest(TestApi testApi) : IClassFixture<TestApi>,
await action(context); await action(context);
} }
protected async Task ExecuteDbContextAsync(Func<DbContext, IServiceProvider, Task> action)
{
await using var scope = testApi.Services.CreateAsyncScope();
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
await action(context, scope.ServiceProvider);
}
protected async Task<T> ExecuteDbContextAsync<T>(Func<DbContext, Task<T>> action) protected async Task<T> ExecuteDbContextAsync<T>(Func<DbContext, Task<T>> action)
{ {
await using var scope = testApi.Services.CreateAsyncScope(); await using var scope = testApi.Services.CreateAsyncScope();
@@ -26,6 +33,13 @@ public abstract class IntegrationTest(TestApi testApi) : IClassFixture<TestApi>,
return await action(context); return await action(context);
} }
protected async Task<T> ExecuteDbContextAsync<T>(Func<DbContext, IServiceProvider, Task<T>> action)
{
await using var scope = testApi.Services.CreateAsyncScope();
var context = scope.ServiceProvider.GetRequiredService<AppDbContext>();
return await action(context, scope.ServiceProvider);
}
public async ValueTask DisposeAsync() public async ValueTask DisposeAsync()
{ {
await ExecuteDbContextAsync(static async context => await ExecuteDbContextAsync(static async context =>
@@ -1,4 +1,4 @@
using FiscalOS.API.Identity; using FiscalOS.Core.Identity;
namespace FiscalOS.API.Tests.Integration; namespace FiscalOS.API.Tests.Integration;
@@ -40,11 +40,14 @@ public class LoginTests(TestApi testApi) : IntegrationTest(testApi)
[Fact] [Fact]
public async Task Login_WhenUserExistsButPasswordIsIncorrect_ItShouldReturn401WithProblemDetails() public async Task Login_WhenUserExistsButPasswordIsIncorrect_ItShouldReturn401WithProblemDetails()
{ {
await ExecuteDbContextAsync(static async context => await ExecuteDbContextAsync(static async (context, sp) =>
{ {
var passwordHasher = sp.GetRequiredService<IPasswordHasher>();
context.Add(new User context.Add(new User
{ {
Username = "Stevan", Username = "Stevan",
HashedPassword = passwordHasher.Hash("@Password1"),
}); });
await context.SaveChangesAsync(TestContext.Current.CancellationToken); await context.SaveChangesAsync(TestContext.Current.CancellationToken);
+3 -1
View File
@@ -1,14 +1,16 @@
global using System.Net; global using System.Net;
global using System.Net.Http.Json; global using System.Net.Http.Json;
global using FiscalOS.API.Data;
global using FiscalOS.API.Tests.Infra; global using FiscalOS.API.Tests.Infra;
global using FiscalOS.Infra.Data;
global using Microsoft.AspNetCore.Hosting; global using Microsoft.AspNetCore.Hosting;
global using Microsoft.AspNetCore.Mvc; global using Microsoft.AspNetCore.Mvc;
global using Microsoft.AspNetCore.Mvc.Testing; global using Microsoft.AspNetCore.Mvc.Testing;
global using Microsoft.AspNetCore.TestHost;
global using Microsoft.EntityFrameworkCore; global using Microsoft.EntityFrameworkCore;
global using Microsoft.Extensions.DependencyInjection; global using Microsoft.Extensions.DependencyInjection;
global using Microsoft.Extensions.Logging; global using Microsoft.Extensions.Logging;
global using Microsoft.Extensions.Options;
global using Xunit.Sdk; global using Xunit.Sdk;
@@ -0,0 +1,21 @@
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<RootNamespace>FiscalOS.Infra.Tests</RootNamespace>
</PropertyGroup>
<ItemGroup>
<Content Include="xunit.runner.json" CopyToOutputDirectory="PreserveNewest" />
</ItemGroup>
<ItemGroup>
<PackageReference Include="AwesomeAssertions" />
<PackageReference Include="xunit.v3.mtp-v2" />
</ItemGroup>
<ItemGroup>
<ProjectReference Include="..\..\src\FiscalOS.Infra\FiscalOS.Infra.csproj" />
</ItemGroup>
</Project>
@@ -1,6 +1,4 @@
using FiscalOS.API.Identity; namespace FiscalOS.Infra.Tests.Unit;
namespace FiscalOS.API.Tests.Unit;
public class PasswordHasherTests public class PasswordHasherTests
{ {
+1
View File
@@ -0,0 +1 @@
global using FiscalOS.Infra.Identity;
@@ -0,0 +1,3 @@
{
"$schema": "https://xunit.net/schema/current/xunit.runner.schema.json"
}