diff --git a/CleanArchitecture.Api/CleanArchitecture.Api.csproj b/CleanArchitecture.Api/CleanArchitecture.Api.csproj index 8abb896..d3220e5 100644 --- a/CleanArchitecture.Api/CleanArchitecture.Api.csproj +++ b/CleanArchitecture.Api/CleanArchitecture.Api.csproj @@ -7,6 +7,7 @@ + @@ -14,6 +15,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive + diff --git a/CleanArchitecture.Api/Program.cs b/CleanArchitecture.Api/Program.cs index c4f97be..22c3fca 100644 --- a/CleanArchitecture.Api/Program.cs +++ b/CleanArchitecture.Api/Program.cs @@ -4,7 +4,9 @@ using CleanArchitecture.Application.gRPC; using CleanArchitecture.Domain.Extensions; using CleanArchitecture.Infrastructure.Database; using CleanArchitecture.Infrastructure.Extensions; +using HealthChecks.UI.Client; using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Diagnostics.HealthChecks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Configuration; using Microsoft.Extensions.DependencyInjection; @@ -16,7 +18,9 @@ builder.Services.AddControllers(); builder.Services.AddGrpc(); builder.Services.AddEndpointsApiExplorer(); -builder.Services.AddHealthChecks(); +builder.Services + .AddHealthChecks() + .AddDbContextCheck(); builder.Services.AddDbContext(options => { @@ -50,7 +54,10 @@ app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); -app.MapHealthChecks("/health"); +app.MapHealthChecks("/healthz", new HealthCheckOptions +{ + ResponseWriter = UIResponseWriter.WriteHealthCheckUIResponse +}); app.MapGrpcService(); using (var scope = app.Services.CreateScope()) diff --git a/CleanArchitecture.Application.Tests/CleanArchitecture.Application.Tests.csproj b/CleanArchitecture.Application.Tests/CleanArchitecture.Application.Tests.csproj index 97e5d67..8efb4e8 100644 --- a/CleanArchitecture.Application.Tests/CleanArchitecture.Application.Tests.csproj +++ b/CleanArchitecture.Application.Tests/CleanArchitecture.Application.Tests.csproj @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/CleanArchitecture.Domain.Tests/CleanArchitecture.Domain.Tests.csproj b/CleanArchitecture.Domain.Tests/CleanArchitecture.Domain.Tests.csproj index 5c12890..05abe65 100644 --- a/CleanArchitecture.Domain.Tests/CleanArchitecture.Domain.Tests.csproj +++ b/CleanArchitecture.Domain.Tests/CleanArchitecture.Domain.Tests.csproj @@ -10,14 +10,14 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/CleanArchitecture.Infrastructure.Tests/CleanArchitecture.Infrastructure.Tests.csproj b/CleanArchitecture.Infrastructure.Tests/CleanArchitecture.Infrastructure.Tests.csproj index f8c86da..0807cc3 100644 --- a/CleanArchitecture.Infrastructure.Tests/CleanArchitecture.Infrastructure.Tests.csproj +++ b/CleanArchitecture.Infrastructure.Tests/CleanArchitecture.Infrastructure.Tests.csproj @@ -9,14 +9,14 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/CleanArchitecture.IntegrationTests/CleanArchitecture.IntegrationTests.csproj b/CleanArchitecture.IntegrationTests/CleanArchitecture.IntegrationTests.csproj index d7259af..a7dab7a 100644 --- a/CleanArchitecture.IntegrationTests/CleanArchitecture.IntegrationTests.csproj +++ b/CleanArchitecture.IntegrationTests/CleanArchitecture.IntegrationTests.csproj @@ -13,14 +13,14 @@ - + runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all diff --git a/CleanArchitecture.IntegrationTests/UtilityTests/AuthTests.cs b/CleanArchitecture.IntegrationTests/UtilityTests/AuthTests.cs new file mode 100644 index 0000000..5359a72 --- /dev/null +++ b/CleanArchitecture.IntegrationTests/UtilityTests/AuthTests.cs @@ -0,0 +1,34 @@ +using System; +using System.Net; +using System.Net.Http; +using System.Threading.Tasks; +using CleanArchitecture.IntegrationTests.Fixtures; +using FluentAssertions; +using Xunit; +using Xunit.Priority; + +namespace CleanArchitecture.IntegrationTests.UtilityTests; + +[Collection("IntegrationTests")] +[TestCaseOrderer(PriorityOrderer.Name, PriorityOrderer.Assembly)] +public sealed class AuthTests : IClassFixture +{ + private readonly TestFixtureBase _fixture; + + public AuthTests(TestFixtureBase fixture) + { + _fixture = fixture; + } + + [Theory] + [InlineData("/api/v1/user")] + [InlineData("/api/v1/user/me")] + [InlineData("/api/v1/user/d74b112a-ece0-443d-9b4f-85bc418822ca")] + public async Task Should_Get_Unauthorized_If_Trying_To_Call_Endpoint_Without_Token( + string url) + { + var response = await _fixture.ServerClient.GetAsync(url); + + response.StatusCode.Should().Be(HttpStatusCode.Unauthorized); + } +} \ No newline at end of file diff --git a/CleanArchitecture.IntegrationTests/UtilityTests/HealthChecksTests.cs b/CleanArchitecture.IntegrationTests/UtilityTests/HealthChecksTests.cs new file mode 100644 index 0000000..784a755 --- /dev/null +++ b/CleanArchitecture.IntegrationTests/UtilityTests/HealthChecksTests.cs @@ -0,0 +1,35 @@ +using System.Net; +using System.Threading.Tasks; +using CleanArchitecture.IntegrationTests.Fixtures; +using FluentAssertions; +using Microsoft.Extensions.Diagnostics.HealthChecks; +using Newtonsoft.Json.Linq; +using Xunit; +using Xunit.Priority; + +namespace CleanArchitecture.IntegrationTests.UtilityTests; + +[Collection("IntegrationTests")] +[TestCaseOrderer(PriorityOrderer.Name, PriorityOrderer.Assembly)] +public sealed class HealthChecksTests : IClassFixture +{ + private readonly TestFixtureBase _fixture; + + public HealthChecksTests(TestFixtureBase fixture) + { + _fixture = fixture; + } + + [Fact] + [Priority(0)] + public async Task Should_Return_Healthy() + { + var response = await _fixture.ServerClient.GetAsync("/healthz"); + response.StatusCode.Should().Be(HttpStatusCode.OK); + + var content = await response.Content.ReadAsStringAsync(); + + var json = JObject.Parse(content); + json["status"]!.Value().Should().Be(HealthStatus.Healthy.ToString()); + } +} \ No newline at end of file diff --git a/CleanArchitecture.Proto/CleanArchitecture.Proto.csproj b/CleanArchitecture.Proto/CleanArchitecture.Proto.csproj index 5fd66a5..256330f 100644 --- a/CleanArchitecture.Proto/CleanArchitecture.Proto.csproj +++ b/CleanArchitecture.Proto/CleanArchitecture.Proto.csproj @@ -16,9 +16,9 @@ - - - + + + diff --git a/CleanArchitecture.gRPC.Tests/CleanArchitecture.gRPC.Tests.csproj b/CleanArchitecture.gRPC.Tests/CleanArchitecture.gRPC.Tests.csproj index 53e40ae..f860903 100644 --- a/CleanArchitecture.gRPC.Tests/CleanArchitecture.gRPC.Tests.csproj +++ b/CleanArchitecture.gRPC.Tests/CleanArchitecture.gRPC.Tests.csproj @@ -9,7 +9,7 @@ - + @@ -17,7 +17,7 @@ runtime; build; native; contentfiles; analyzers; buildtransitive all - + runtime; build; native; contentfiles; analyzers; buildtransitive all