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