From fbaef397f06ea444c54d7dae5db38f276975c1be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=85=D0=B0=D0=B8=D0=BB?= Date: Sun, 2 Aug 2026 16:58:44 +0400 Subject: [PATCH 1/2] fix: restore OAuth OpenAPI endpoints --- Directory.Packages.props | 2 +- .../OpenApi/IdentityOpenApiDocumentTests.cs | 34 +++++++++++++++++++ 2 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/Features/OAuth/OpenApi/IdentityOpenApiDocumentTests.cs diff --git a/Directory.Packages.props b/Directory.Packages.props index 6be60de4..c753b767 100644 --- a/Directory.Packages.props +++ b/Directory.Packages.props @@ -28,7 +28,7 @@ - + diff --git a/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/Features/OAuth/OpenApi/IdentityOpenApiDocumentTests.cs b/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/Features/OAuth/OpenApi/IdentityOpenApiDocumentTests.cs new file mode 100644 index 00000000..f202a1a3 --- /dev/null +++ b/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/Features/OAuth/OpenApi/IdentityOpenApiDocumentTests.cs @@ -0,0 +1,34 @@ +using System.Text.Json; + +namespace PANiXiDA.TacticalHeroes.Identity.FunctionalTests.Presentation.Features.OAuth.OpenApi; + +public sealed class IdentityOpenApiDocumentTests(FunctionalTestFixture fixture) + : FunctionalTestBase(fixture) +{ + [Fact(DisplayName = "GET Identity OpenAPI document should include OAuth endpoints when requested")] + public async Task GetIdentityOpenApiDocument_Should_IncludeOAuthEndpoints_When_Requested() + { + var cancellationToken = TestContext.Current.CancellationToken; + + using var response = await Client.GetAsync( + "/openapi/identity.json", + cancellationToken); + var responseBody = await response.Content.ReadAsStringAsync(cancellationToken); + + response.StatusCode.ShouldBe(HttpStatusCode.OK, responseBody); + using var document = JsonDocument.Parse(responseBody); + var paths = document.RootElement + .GetProperty("paths") + .EnumerateObject() + .Select(path => path.Name) + .ToArray(); + + paths.ShouldContain("/connect/authorize"); + paths.ShouldContain("/connect/introspect"); + paths.ShouldContain("/connect/logout"); + paths.ShouldContain("/connect/par"); + paths.ShouldContain("/connect/revoke"); + paths.ShouldContain("/connect/token"); + paths.ShouldContain("/connect/userinfo"); + } +} From 8e93cc602e56ab03763658a60b5335553d20666e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9C=D0=B8=D1=85=D0=B0=D0=B8=D0=BB?= Date: Sun, 2 Aug 2026 17:09:10 +0400 Subject: [PATCH 2/2] test: run OpenAPI regression in development --- .../OAuth/OpenApi/IdentityOpenApiDocumentTests.cs | 5 ++++- .../Presentation/FunctionalTestFixture.cs | 11 +++++++++++ .../FunctionalTestWebApplicationFactory.cs | 4 ++-- 3 files changed, 17 insertions(+), 3 deletions(-) diff --git a/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/Features/OAuth/OpenApi/IdentityOpenApiDocumentTests.cs b/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/Features/OAuth/OpenApi/IdentityOpenApiDocumentTests.cs index f202a1a3..308ed355 100644 --- a/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/Features/OAuth/OpenApi/IdentityOpenApiDocumentTests.cs +++ b/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/Features/OAuth/OpenApi/IdentityOpenApiDocumentTests.cs @@ -1,5 +1,7 @@ using System.Text.Json; +using Microsoft.Extensions.Hosting; + namespace PANiXiDA.TacticalHeroes.Identity.FunctionalTests.Presentation.Features.OAuth.OpenApi; public sealed class IdentityOpenApiDocumentTests(FunctionalTestFixture fixture) @@ -9,8 +11,9 @@ public sealed class IdentityOpenApiDocumentTests(FunctionalTestFixture fixture) public async Task GetIdentityOpenApiDocument_Should_IncludeOAuthEndpoints_When_Requested() { var cancellationToken = TestContext.Current.CancellationToken; + using var client = Fixture.CreateClient(Environments.Development); - using var response = await Client.GetAsync( + using var response = await client.GetAsync( "/openapi/identity.json", cancellationToken); var responseBody = await response.Content.ReadAsStringAsync(cancellationToken); diff --git a/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/FunctionalTestFixture.cs b/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/FunctionalTestFixture.cs index 0d16f05f..976bbf30 100644 --- a/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/FunctionalTestFixture.cs +++ b/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/FunctionalTestFixture.cs @@ -56,6 +56,17 @@ public HttpClient CreateClient(WebApplicationFactoryClientOptions options) return client; } + public HttpClient CreateClient(string environmentName) + { + var factory = new FunctionalTestWebApplicationFactory(environmentName); + _factories.Add(factory); + + var client = factory.CreateClient(); + _clients.Add(client); + + return client; + } + private void CreateCurrentClient() { _factory = new FunctionalTestWebApplicationFactory(); diff --git a/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/FunctionalTestWebApplicationFactory.cs b/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/FunctionalTestWebApplicationFactory.cs index 82650748..252be3ea 100644 --- a/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/FunctionalTestWebApplicationFactory.cs +++ b/tests/Identity/PANiXiDA.TacticalHeroes.Identity.FunctionalTests/Presentation/FunctionalTestWebApplicationFactory.cs @@ -12,14 +12,14 @@ namespace PANiXiDA.TacticalHeroes.Identity.FunctionalTests.Presentation; -internal sealed class FunctionalTestWebApplicationFactory +internal sealed class FunctionalTestWebApplicationFactory(string environmentName = "Test") : WebApplicationFactory { public CapturingEventBus EventBus { get; } = new(); protected override void ConfigureWebHost(IWebHostBuilder builder) { - builder.UseEnvironment("Test"); + builder.UseEnvironment(environmentName); builder.ConfigureLogging(logging => logging.ClearProviders()); builder.ConfigureServices(services => {