Skip to content
Merged
Show file tree
Hide file tree
Changes from 2 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 .editorconfig
Original file line number Diff line number Diff line change
Expand Up @@ -381,5 +381,5 @@ roslynator_binary_operator_new_line = before
roslynator_conditional_operator_new_line = before
roslynator_null_conditional_operator_new_line = before

[*.{json,env,yml,yaml,xml,xsd,html,cshtml,csproj,props,sln,resx}]
[*.{json,env,yml,yaml,xml,xsd,html,cshtml,csproj,props,sln,slnx,resx}]
indent_size = 2
11 changes: 11 additions & 0 deletions Hikkaba.Tests.Integration/Models/IAppFactorySeedResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
using System;
using Hikkaba.Tests.Integration;
using Microsoft.Extensions.DependencyInjection;

namespace ReactReduxTodo.Tests.Integration.Models;

internal interface IAppFactorySeedResult : IDisposable
{
IServiceScope Scope { get; set; }
CustomAppFactory AppFactory { get; set; }
}
9 changes: 9 additions & 0 deletions Hikkaba.Tests.Integration/Models/ISeedResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
using System;
using Microsoft.Extensions.DependencyInjection;

namespace ReactReduxTodo.Tests.Integration.Models;

internal interface ISeedResult : IDisposable
{
public IServiceScope Scope { get; set; }
}
17 changes: 17 additions & 0 deletions Hikkaba.Tests.Integration/Models/SeedResult.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
using System;
using Hikkaba.Tests.Integration;
using Microsoft.Extensions.DependencyInjection;

namespace ReactReduxTodo.Tests.Integration.Models;

internal sealed class SeedResult : ISeedResult, IAppFactorySeedResult
{
public required IServiceScope Scope { get; set; }
public required CustomAppFactory AppFactory { get; set; }

public void Dispose()
{
Scope.Dispose();
AppFactory.Dispose();
}
}
51 changes: 28 additions & 23 deletions Hikkaba.Tests.Integration/Tests/Repositories/BanRepositoryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -19,6 +19,7 @@
using JetBrains.Annotations;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using ReactReduxTodo.Tests.Integration.Models;
using Thread = Hikkaba.Data.Entities.Thread;

namespace Hikkaba.Tests.Integration.Tests.Repositories;
Expand All @@ -44,10 +45,24 @@ public async Task OneTimeTearDownAsync()
}

[MustDisposeResource]
private async Task<CustomAppFactory> CreateAppFactoryAsync()
private async Task<ISeedResult> Seed(CancellationToken cancellationToken)
{
var connectionString = await _contextManager!.CreateRespawnedDbConnectionStringAsync();
return new CustomAppFactory(connectionString);
var customAppFactory = new CustomAppFactory(connectionString);

var scope = customAppFactory.Services.GetRequiredService<IServiceScopeFactory>().CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();

if ((await dbContext.Database.GetPendingMigrationsAsync(cancellationToken)).Any())
{
await dbContext.Database.MigrateAsync(cancellationToken);
}

return new SeedResult
{
Scope = scope,
AppFactory = customAppFactory,
};
}

[CancelAfter(TestDefaults.TestTimeout)]
Expand All @@ -61,16 +76,12 @@ public async Task ListBansPaginatedAsync_WhenSearchExact_ReturnsExpectedResult(
CancellationToken cancellationToken)
{
// Arrange
await using var customAppFactory = await CreateAppFactoryAsync();
using var scope = customAppFactory.Services.GetRequiredService<IServiceScopeFactory>().CreateScope();
var timeProvider = scope.ServiceProvider.GetRequiredService<TimeProvider>();
var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
var hashService = scope.ServiceProvider.GetRequiredService<IHashService>();
using var seedResult = await Seed(cancellationToken);
using var serviceScope = seedResult.Scope.ServiceProvider.GetRequiredService<IServiceScopeFactory>().CreateScope();

if ((await dbContext.Database.GetPendingMigrationsAsync(cancellationToken)).Any())
{
await dbContext.Database.MigrateAsync(cancellationToken);
}
var dbContext = serviceScope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
var hashService = serviceScope.ServiceProvider.GetRequiredService<IHashService>();
var timeProvider = serviceScope.ServiceProvider.GetRequiredService<TimeProvider>();

// Seed
var admin = new ApplicationUser
Expand Down Expand Up @@ -168,7 +179,7 @@ public async Task ListBansPaginatedAsync_WhenSearchExact_ReturnsExpectedResult(

await dbContext.SaveChangesAsync(cancellationToken);

var repository = scope.ServiceProvider.GetRequiredService<IBanRepository>();
var repository = serviceScope.ServiceProvider.GetRequiredService<IBanRepository>();

// Act
var result = await repository.ListBansPaginatedAsync(new BanPagingFilter
Expand All @@ -195,16 +206,10 @@ public async Task ListBansPaginatedAsync_WhenSearchInRange_ReturnsExpectedResult
CancellationToken cancellationToken)
{
// Arrange
await using var customAppFactory = await CreateAppFactoryAsync();
using var scope = customAppFactory.Services.GetRequiredService<IServiceScopeFactory>().CreateScope();
var timeProvider = scope.ServiceProvider.GetRequiredService<TimeProvider>();
var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
var hashService = scope.ServiceProvider.GetRequiredService<IHashService>();

if ((await dbContext.Database.GetPendingMigrationsAsync(cancellationToken)).Any())
{
await dbContext.Database.MigrateAsync(cancellationToken);
}
using var seedResult = await Seed(cancellationToken);
var dbContext = seedResult.Scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
var hashService = seedResult.Scope.ServiceProvider.GetRequiredService<IHashService>();
var timeProvider = seedResult.Scope.ServiceProvider.GetRequiredService<TimeProvider>();

// Seed
var admin = new ApplicationUser
Expand Down Expand Up @@ -306,7 +311,7 @@ public async Task ListBansPaginatedAsync_WhenSearchInRange_ReturnsExpectedResult

await dbContext.SaveChangesAsync(cancellationToken);

var repository = scope.ServiceProvider.GetRequiredService<IBanRepository>();
var repository = seedResult.Scope.ServiceProvider.GetRequiredService<IBanRepository>();

// Act
var result = await repository.ListBansPaginatedAsync(new BanPagingFilter
Expand Down
37 changes: 23 additions & 14 deletions Hikkaba.Tests.Integration/Tests/Repositories/PostRepositoryTests.cs
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;
using ReactReduxTodo.Tests.Integration.Models;
using Thread = Hikkaba.Data.Entities.Thread;

namespace Hikkaba.Tests.Integration.Tests.Repositories;
Expand All @@ -44,10 +45,24 @@ public async Task OneTimeTearDownAsync()
}

[MustDisposeResource]
private async Task<CustomAppFactory> CreateAppFactoryAsync()
private async Task<ISeedResult> Seed(CancellationToken cancellationToken)
{
var connectionString = await _contextManager!.CreateRespawnedDbConnectionStringAsync();
return new CustomAppFactory(connectionString);
var customAppFactory = new CustomAppFactory(connectionString);

var scope = customAppFactory.Services.GetRequiredService<IServiceScopeFactory>().CreateScope();
var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();

if ((await dbContext.Database.GetPendingMigrationsAsync(cancellationToken)).Any())
{
await dbContext.Database.MigrateAsync(cancellationToken);
}

return new SeedResult
{
Scope = scope,
AppFactory = customAppFactory,
};
}

[CancelAfter(TestDefaults.TestTimeout)]
Expand All @@ -63,17 +78,11 @@ public async Task SearchPostsPaginatedAsync_WhenSearchQueryIsProvided_ReturnsExp
CancellationToken cancellationToken)
{
// Arrange
await using var customAppFactory = await CreateAppFactoryAsync();
using var scope = customAppFactory.Services.GetRequiredService<IServiceScopeFactory>().CreateScope();
var timeProvider = scope.ServiceProvider.GetRequiredService<TimeProvider>();
var dbContext = scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
var hashService = scope.ServiceProvider.GetRequiredService<IHashService>();
var logger = scope.ServiceProvider.GetRequiredService<ILogger<PostRepositoryTests>>();

if ((await dbContext.Database.GetPendingMigrationsAsync(cancellationToken)).Any())
{
await dbContext.Database.MigrateAsync(cancellationToken);
}
using var seedResult = await Seed(cancellationToken);
var dbContext = seedResult.Scope.ServiceProvider.GetRequiredService<ApplicationDbContext>();
var hashService = seedResult.Scope.ServiceProvider.GetRequiredService<IHashService>();
var timeProvider = seedResult.Scope.ServiceProvider.GetRequiredService<TimeProvider>();
var logger = seedResult.Scope.ServiceProvider.GetRequiredService<ILogger<PostRepositoryTests>>();

// Seed
var admin = new ApplicationUser
Expand Down Expand Up @@ -165,7 +174,7 @@ public async Task SearchPostsPaginatedAsync_WhenSearchQueryIsProvided_ReturnsExp

await DbUtils.WaitForFulltextIndexAsync(logger, dbContext, ["Posts", "Threads"], cancellationToken: cancellationToken);

var repository = scope.ServiceProvider.GetRequiredService<IPostRepository>();
var repository = seedResult.Scope.ServiceProvider.GetRequiredService<IPostRepository>();

// Act
var result = await repository.SearchPostsPaginatedAsync(new SearchPostsPagingFilter
Expand Down
Loading
Loading