diff --git a/Medications.slnx b/Medications.slnx index ba4ce66..604e424 100644 --- a/Medications.slnx +++ b/Medications.slnx @@ -4,7 +4,7 @@ - + diff --git a/README.md b/README.md index b23e8eb..ee2e05b 100644 --- a/README.md +++ b/README.md @@ -3,7 +3,7 @@ [![CI](https://github.com/fernandotonacoder/medications-rest-api/actions/workflows/ci.yml/badge.svg)](https://github.com/fernandotonacoder/medications-rest-api/actions/workflows/ci.yml) [![.NET](https://img.shields.io/badge/.NET-10-512BD4?logo=dotnet&logoColor=white)](https://dotnet.microsoft.com/) [![Aspire](https://img.shields.io/badge/Aspire-512BD4?logo=dotnet&logoColor=white)](https://learn.microsoft.com/en-us/dotnet/aspire/) -[![SQL Server](https://img.shields.io/badge/SQL%20Server-2022-CC2927)](https://www.microsoft.com/sql-server) +[![SQL Server](https://img.shields.io/badge/SQL%20Server-2022-0078D4?logo=microsoftsqlserver&logoColor=white)](https://www.microsoft.com/sql-server) [![Scalar](https://img.shields.io/badge/Scalar-API%20Reference-1F2937)](https://scalar.com/) [![Quality gate](https://sonarcloud.io/api/project_badges/quality_gate?project=fernandotonacoder_medications-rest-api)](https://sonarcloud.io/summary/overall?id=fernandotonacoder_medications-rest-api) diff --git a/tests/Medications.Unit.Tests/MedicationEndpointsRegistrationUnitTests.cs b/tests/Medications.Unit.Tests/MedicationEndpointsRegistrationUnitTests.cs new file mode 100644 index 0000000..fb9aeaa --- /dev/null +++ b/tests/Medications.Unit.Tests/MedicationEndpointsRegistrationUnitTests.cs @@ -0,0 +1,59 @@ +using Medications.Api.Data; +using Medications.Api.Endpoints; +using Microsoft.AspNetCore.Builder; +using Microsoft.AspNetCore.Routing; +using Microsoft.EntityFrameworkCore; +using Microsoft.Extensions.DependencyInjection; + +namespace Medications.Unit.Tests +{ + public class MedicationEndpointsRegistrationUnitTests + { + [Theory] + [InlineData("GET", "/api/medications/")] + [InlineData("GET", "/api/medications/{id}")] + [InlineData("POST", "/api/medications/")] + [InlineData("DELETE", "/api/medications/{id}")] + public void MapMedicationEndpoints_RegistersRoute(string httpMethod, string pattern) + { + var endpoints = MapEndpoints(); + + Assert.Contains(endpoints, endpoint => + endpoint.RoutePattern.RawText == pattern + && endpoint.Metadata.GetMetadata()!.HttpMethods.Contains(httpMethod)); + } + + [Fact] + public void MapMedicationEndpoints_RegistersOnlyTheFourEndpoints() + { + Assert.Equal(4, MapEndpoints().Count); + } + + [Fact] + public void GetMedicationById_IsNamed_SoCreatedAtRouteResolvesTheLocationHeader() + { + var endpoints = MapEndpoints(); + + var named = Assert.Single(endpoints, endpoint => + endpoint.Metadata.GetMetadata()?.EndpointName == "GetMedication"); + Assert.Equal("/api/medications/{id}", named.RoutePattern.RawText); + } + + private static List MapEndpoints() + { + var builder = WebApplication.CreateSlimBuilder(); + builder.Services.AddDbContext( + options => options.UseInMemoryDatabase(nameof(MedicationEndpointsRegistrationUnitTests))); + builder.Services.AddSingleton(TimeProvider.System); + + var app = builder.Build(); + + app.MapMedicationEndpoints(); + + return ((IEndpointRouteBuilder)app).DataSources + .SelectMany(dataSource => dataSource.Endpoints) + .OfType() + .ToList(); + } + } +} diff --git a/tests/Medications.Unit.Tests/Medications.Unit.Tests.csproj b/tests/Medications.Unit.Tests/Medications.Unit.Tests.csproj index 1234f5e..955983c 100644 --- a/tests/Medications.Unit.Tests/Medications.Unit.Tests.csproj +++ b/tests/Medications.Unit.Tests/Medications.Unit.Tests.csproj @@ -2,8 +2,6 @@ false - $(MSBuildThisFileDirectory)..\test.runsettings