diff --git a/src/Yavsc.Org.Tests/Controllers/ClientControllerCollectionTests.cs b/src/Yavsc.Org.Tests/Controllers/ClientControllerCollectionTests.cs index cf18970e..8883c75d 100644 --- a/src/Yavsc.Org.Tests/Controllers/ClientControllerCollectionTests.cs +++ b/src/Yavsc.Org.Tests/Controllers/ClientControllerCollectionTests.cs @@ -290,150 +290,12 @@ public class ClientControllerCollectionTests : IClassFixture BisectClientDbId() - { - await using var scope = _factory.Services.CreateAsyncScope(); - var db = scope.ServiceProvider.GetRequiredService(); - return db.Clients.Single(c => c.ClientId == TargetClientId).Id; - } - - [Fact] - public async Task Bisect_RedirectUris_alone() - { - await using var scope = _factory.Services.CreateAsyncScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var id = await BisectClientDbId(); - var client = await db.Clients - .Include(c => c.RedirectUris) - .SingleOrDefaultAsync(c => c.Id == id, TestContext.Current.CancellationToken); - Assert.NotNull(client); - Assert.NotNull(client!.RedirectUris); - } - - [Fact] - public async Task Bisect_PostLogoutRedirectUris_alone() - { - await using var scope = _factory.Services.CreateAsyncScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var id = await BisectClientDbId(); - var client = await db.Clients - .Include(c => c.PostLogoutRedirectUris) - .SingleOrDefaultAsync(c => c.Id == id, TestContext.Current.CancellationToken); - Assert.NotNull(client); - Assert.NotNull(client!.PostLogoutRedirectUris); - } - - [Fact] - public async Task Bisect_AllowedScopes_alone() - { - await using var scope = _factory.Services.CreateAsyncScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var id = await BisectClientDbId(); - var client = await db.Clients - .Include(c => c.AllowedScopes) - .SingleOrDefaultAsync(c => c.Id == id, TestContext.Current.CancellationToken); - Assert.NotNull(client); - Assert.NotNull(client!.AllowedScopes); - } - - [Fact] - public async Task Bisect_AllowedGrantTypes_alone() - { - await using var scope = _factory.Services.CreateAsyncScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var id = await BisectClientDbId(); - var client = await db.Clients - .Include(c => c.AllowedGrantTypes) - .SingleOrDefaultAsync(c => c.Id == id, TestContext.Current.CancellationToken); - Assert.NotNull(client); - Assert.NotNull(client!.AllowedGrantTypes); - } - - [Fact] - public async Task Bisect_AllowedCorsOrigins_alone() - { - await using var scope = _factory.Services.CreateAsyncScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var id = await BisectClientDbId(); - var client = await db.Clients - .Include(c => c.AllowedCorsOrigins) - .SingleOrDefaultAsync(c => c.Id == id, TestContext.Current.CancellationToken); - Assert.NotNull(client); - Assert.NotNull(client!.AllowedCorsOrigins); - } - - [Fact] - public async Task Bisect_IdentityProviderRestrictions_alone() - { - await using var scope = _factory.Services.CreateAsyncScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var id = await BisectClientDbId(); - var client = await db.Clients - .Include(c => c.IdentityProviderRestrictions) - .SingleOrDefaultAsync(c => c.Id == id, TestContext.Current.CancellationToken); - Assert.NotNull(client); - Assert.NotNull(client!.IdentityProviderRestrictions); - } - - [Fact] - public async Task Bisect_Claims_alone() - { - await using var scope = _factory.Services.CreateAsyncScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var id = await BisectClientDbId(); - var client = await db.Clients - .Include(c => c.Claims) - .SingleOrDefaultAsync(c => c.Id == id, TestContext.Current.CancellationToken); - Assert.NotNull(client); - Assert.NotNull(client!.Claims); - } - - [Fact] - public async Task Bisect_Properties_alone() - { - await using var scope = _factory.Services.CreateAsyncScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var id = await BisectClientDbId(); - var client = await db.Clients - .Include(c => c.Properties) - .SingleOrDefaultAsync(c => c.Id == id, TestContext.Current.CancellationToken); - Assert.NotNull(client); - Assert.NotNull(client!.Properties); - } - - [Fact] - public async Task Bisect_ClientSecrets_alone() - { - await using var scope = _factory.Services.CreateAsyncScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var id = await BisectClientDbId(); - var client = await db.Clients - .Include(c => c.ClientSecrets) - .SingleOrDefaultAsync(c => c.Id == id, TestContext.Current.CancellationToken); - Assert.NotNull(client); - Assert.NotNull(client!.ClientSecrets); - } - - [Fact] - public async Task Bisect_baseline_no_include() - { - // Sanity check : la query de base (sans Include) doit passer. - // Si celle-ci échoue, le problème n'est pas un Include. - await using var scope = _factory.Services.CreateAsyncScope(); - var db = scope.ServiceProvider.GetRequiredService(); - var id = await BisectClientDbId(); - var client = await db.Clients - .SingleOrDefaultAsync(c => c.Id == id, TestContext.Current.CancellationToken); - Assert.NotNull(client); - } + // 2026-07-11 fix/issue-3-splitquery: tests retirés car leur hypothèse + // ("bug de provider InMemory sur ces 3 entités") n'est pas la cause + // racine — c'est une redondance de mapping HasOne dans + // ApplicationDbContext.OnModelCreating. Le test gardien + // EditRedirectUris_GET_after_add_lists_both_uris reste en place + // comme sentinelle de régression sur le fix. private static string? ExtractAntiforgeryToken(string html) { diff --git a/src/Yavsc.Org/Controllers/Administration/ClientController.Collections.cs b/src/Yavsc.Org/Controllers/Administration/ClientController.Collections.cs index 5569bf77..b31ec0c3 100644 --- a/src/Yavsc.Org/Controllers/Administration/ClientController.Collections.cs +++ b/src/Yavsc.Org/Controllers/Administration/ClientController.Collections.cs @@ -287,7 +287,6 @@ public partial class ClientController private async Task LoadClientAsync(int id) => await dbContext.Clients - .AsSplitQuery() .Include(c => c.RedirectUris) .Include(c => c.PostLogoutRedirectUris) .Include(c => c.AllowedScopes) diff --git a/src/Yavsc.Server/Models/ApplicationDbContext.cs b/src/Yavsc.Server/Models/ApplicationDbContext.cs index c3404aed..fd924944 100644 --- a/src/Yavsc.Server/Models/ApplicationDbContext.cs +++ b/src/Yavsc.Server/Models/ApplicationDbContext.cs @@ -131,13 +131,10 @@ namespace Yavsc.Models // builder.Entity>().HasKey(i=> new { i.LoginProvider, i.UserId, i.ProviderKey }); builder.Entity().HasOne().WithMany(e => e.ClientSecrets).HasForeignKey(e => e.ClientId); - builder.Entity().HasOne().WithMany(e => e.AllowedScopes).HasForeignKey(e => e.ClientId); builder.Entity().HasOne().WithMany(e => e.IdentityProviderRestrictions).HasForeignKey(e => e.ClientId); builder.Entity().HasOne().WithMany(e => e.Properties).HasForeignKey(e => e.ClientId); builder.Entity().HasOne().WithMany(e => e.PostLogoutRedirectUris).HasForeignKey(e => e.ClientId); - builder.Entity().HasOne().WithMany(e => e.RedirectUris).HasForeignKey(e => e.ClientId); builder.Entity().HasOne().WithMany(e => e.AllowedCorsOrigins).HasForeignKey(e => e.ClientId); - builder.Entity().HasOne().WithMany(e => e.AllowedGrantTypes).HasForeignKey(e => e.ClientId); builder.Entity().HasOne().WithMany(e => e.Secrets).HasForeignKey(e => e.ApiResourceId); builder.Entity().HasOne().WithMany(e => e.Scopes).HasForeignKey(e => e.ApiResourceId); builder.Entity().HasOne().WithMany(e => e.UserClaims).HasForeignKey(e => e.ApiResourceId);