From f66d01b251f4039a2c0fc5bec52659cc5d8106e0 Mon Sep 17 00:00:00 2001 From: Eduardo Pires Date: Mon, 9 Jun 2025 23:22:42 -0300 Subject: [PATCH] Add integration tests for API --- Equinox.sln | 101 ++++++++++++++++++ .../Configurations/DatabaseConfig.cs | 19 +++- .../Equinox.Services.Api.csproj | 1 + src/Equinox.Services.Api/Program.cs | 3 +- .../CustomerControllerTests.cs | 96 +++++++++++++++++ .../Equinox.Tests.Integration.csproj | 29 +++++ .../Support/EquinoxApiFactory.cs | 20 ++++ .../Support/TestAuthHandler.cs | 24 +++++ 8 files changed, 287 insertions(+), 6 deletions(-) create mode 100644 tests/Equinox.Tests.Integration/CustomerControllerTests.cs create mode 100644 tests/Equinox.Tests.Integration/Equinox.Tests.Integration.csproj create mode 100644 tests/Equinox.Tests.Integration/Support/EquinoxApiFactory.cs create mode 100644 tests/Equinox.Tests.Integration/Support/TestAuthHandler.cs diff --git a/Equinox.sln b/Equinox.sln index bc6aaf89..bd80faea 100644 --- a/Equinox.sln +++ b/Equinox.sln @@ -39,52 +39,152 @@ Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "6 - Tests", "6 - Tests", "{ EndProject Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Equinox.Tests.Architecture", "tests\Equinox.Tests.Architecture\Equinox.Tests.Architecture.csproj", "{C4036D98-A669-440C-9970-05DB45815949}" EndProject +Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "tests", "tests", "{0AB3BF05-4346-4AA6-1389-037BE0695223}" +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Equinox.Tests.Integration", "tests\Equinox.Tests.Integration\Equinox.Tests.Integration.csproj", "{9A28027A-E63C-4777-91C7-8D32E7BA70CC}" +EndProject Global GlobalSection(SolutionConfigurationPlatforms) = preSolution Debug|Any CPU = Debug|Any CPU + Debug|x64 = Debug|x64 + Debug|x86 = Debug|x86 Release|Any CPU = Release|Any CPU + Release|x64 = Release|x64 + Release|x86 = Release|x86 EndGlobalSection GlobalSection(ProjectConfigurationPlatforms) = postSolution {490517BA-F3C3-44B4-82F8-1E3A4ED6777A}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {490517BA-F3C3-44B4-82F8-1E3A4ED6777A}.Debug|Any CPU.Build.0 = Debug|Any CPU + {490517BA-F3C3-44B4-82F8-1E3A4ED6777A}.Debug|x64.ActiveCfg = Debug|Any CPU + {490517BA-F3C3-44B4-82F8-1E3A4ED6777A}.Debug|x64.Build.0 = Debug|Any CPU + {490517BA-F3C3-44B4-82F8-1E3A4ED6777A}.Debug|x86.ActiveCfg = Debug|Any CPU + {490517BA-F3C3-44B4-82F8-1E3A4ED6777A}.Debug|x86.Build.0 = Debug|Any CPU {490517BA-F3C3-44B4-82F8-1E3A4ED6777A}.Release|Any CPU.ActiveCfg = Release|Any CPU {490517BA-F3C3-44B4-82F8-1E3A4ED6777A}.Release|Any CPU.Build.0 = Release|Any CPU + {490517BA-F3C3-44B4-82F8-1E3A4ED6777A}.Release|x64.ActiveCfg = Release|Any CPU + {490517BA-F3C3-44B4-82F8-1E3A4ED6777A}.Release|x64.Build.0 = Release|Any CPU + {490517BA-F3C3-44B4-82F8-1E3A4ED6777A}.Release|x86.ActiveCfg = Release|Any CPU + {490517BA-F3C3-44B4-82F8-1E3A4ED6777A}.Release|x86.Build.0 = Release|Any CPU {EA966EC3-85A6-4B57-82C1-5120E3390243}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {EA966EC3-85A6-4B57-82C1-5120E3390243}.Debug|Any CPU.Build.0 = Debug|Any CPU + {EA966EC3-85A6-4B57-82C1-5120E3390243}.Debug|x64.ActiveCfg = Debug|Any CPU + {EA966EC3-85A6-4B57-82C1-5120E3390243}.Debug|x64.Build.0 = Debug|Any CPU + {EA966EC3-85A6-4B57-82C1-5120E3390243}.Debug|x86.ActiveCfg = Debug|Any CPU + {EA966EC3-85A6-4B57-82C1-5120E3390243}.Debug|x86.Build.0 = Debug|Any CPU {EA966EC3-85A6-4B57-82C1-5120E3390243}.Release|Any CPU.ActiveCfg = Release|Any CPU {EA966EC3-85A6-4B57-82C1-5120E3390243}.Release|Any CPU.Build.0 = Release|Any CPU + {EA966EC3-85A6-4B57-82C1-5120E3390243}.Release|x64.ActiveCfg = Release|Any CPU + {EA966EC3-85A6-4B57-82C1-5120E3390243}.Release|x64.Build.0 = Release|Any CPU + {EA966EC3-85A6-4B57-82C1-5120E3390243}.Release|x86.ActiveCfg = Release|Any CPU + {EA966EC3-85A6-4B57-82C1-5120E3390243}.Release|x86.Build.0 = Release|Any CPU {851E7338-2397-4E8D-8199-FD1EAD109418}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {851E7338-2397-4E8D-8199-FD1EAD109418}.Debug|Any CPU.Build.0 = Debug|Any CPU + {851E7338-2397-4E8D-8199-FD1EAD109418}.Debug|x64.ActiveCfg = Debug|Any CPU + {851E7338-2397-4E8D-8199-FD1EAD109418}.Debug|x64.Build.0 = Debug|Any CPU + {851E7338-2397-4E8D-8199-FD1EAD109418}.Debug|x86.ActiveCfg = Debug|Any CPU + {851E7338-2397-4E8D-8199-FD1EAD109418}.Debug|x86.Build.0 = Debug|Any CPU {851E7338-2397-4E8D-8199-FD1EAD109418}.Release|Any CPU.ActiveCfg = Release|Any CPU {851E7338-2397-4E8D-8199-FD1EAD109418}.Release|Any CPU.Build.0 = Release|Any CPU + {851E7338-2397-4E8D-8199-FD1EAD109418}.Release|x64.ActiveCfg = Release|Any CPU + {851E7338-2397-4E8D-8199-FD1EAD109418}.Release|x64.Build.0 = Release|Any CPU + {851E7338-2397-4E8D-8199-FD1EAD109418}.Release|x86.ActiveCfg = Release|Any CPU + {851E7338-2397-4E8D-8199-FD1EAD109418}.Release|x86.Build.0 = Release|Any CPU {BF28C988-9C1B-41F5-BD58-D2FCAD7E80BA}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {BF28C988-9C1B-41F5-BD58-D2FCAD7E80BA}.Debug|Any CPU.Build.0 = Debug|Any CPU + {BF28C988-9C1B-41F5-BD58-D2FCAD7E80BA}.Debug|x64.ActiveCfg = Debug|Any CPU + {BF28C988-9C1B-41F5-BD58-D2FCAD7E80BA}.Debug|x64.Build.0 = Debug|Any CPU + {BF28C988-9C1B-41F5-BD58-D2FCAD7E80BA}.Debug|x86.ActiveCfg = Debug|Any CPU + {BF28C988-9C1B-41F5-BD58-D2FCAD7E80BA}.Debug|x86.Build.0 = Debug|Any CPU {BF28C988-9C1B-41F5-BD58-D2FCAD7E80BA}.Release|Any CPU.ActiveCfg = Release|Any CPU {BF28C988-9C1B-41F5-BD58-D2FCAD7E80BA}.Release|Any CPU.Build.0 = Release|Any CPU + {BF28C988-9C1B-41F5-BD58-D2FCAD7E80BA}.Release|x64.ActiveCfg = Release|Any CPU + {BF28C988-9C1B-41F5-BD58-D2FCAD7E80BA}.Release|x64.Build.0 = Release|Any CPU + {BF28C988-9C1B-41F5-BD58-D2FCAD7E80BA}.Release|x86.ActiveCfg = Release|Any CPU + {BF28C988-9C1B-41F5-BD58-D2FCAD7E80BA}.Release|x86.Build.0 = Release|Any CPU {9CC884B7-FA70-49E1-92A6-2B566E00FAB9}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {9CC884B7-FA70-49E1-92A6-2B566E00FAB9}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9CC884B7-FA70-49E1-92A6-2B566E00FAB9}.Debug|x64.ActiveCfg = Debug|Any CPU + {9CC884B7-FA70-49E1-92A6-2B566E00FAB9}.Debug|x64.Build.0 = Debug|Any CPU + {9CC884B7-FA70-49E1-92A6-2B566E00FAB9}.Debug|x86.ActiveCfg = Debug|Any CPU + {9CC884B7-FA70-49E1-92A6-2B566E00FAB9}.Debug|x86.Build.0 = Debug|Any CPU {9CC884B7-FA70-49E1-92A6-2B566E00FAB9}.Release|Any CPU.ActiveCfg = Release|Any CPU {9CC884B7-FA70-49E1-92A6-2B566E00FAB9}.Release|Any CPU.Build.0 = Release|Any CPU + {9CC884B7-FA70-49E1-92A6-2B566E00FAB9}.Release|x64.ActiveCfg = Release|Any CPU + {9CC884B7-FA70-49E1-92A6-2B566E00FAB9}.Release|x64.Build.0 = Release|Any CPU + {9CC884B7-FA70-49E1-92A6-2B566E00FAB9}.Release|x86.ActiveCfg = Release|Any CPU + {9CC884B7-FA70-49E1-92A6-2B566E00FAB9}.Release|x86.Build.0 = Release|Any CPU {F0DDF87D-98A4-4237-91C9-FD865ED78ABB}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {F0DDF87D-98A4-4237-91C9-FD865ED78ABB}.Debug|Any CPU.Build.0 = Debug|Any CPU + {F0DDF87D-98A4-4237-91C9-FD865ED78ABB}.Debug|x64.ActiveCfg = Debug|Any CPU + {F0DDF87D-98A4-4237-91C9-FD865ED78ABB}.Debug|x64.Build.0 = Debug|Any CPU + {F0DDF87D-98A4-4237-91C9-FD865ED78ABB}.Debug|x86.ActiveCfg = Debug|Any CPU + {F0DDF87D-98A4-4237-91C9-FD865ED78ABB}.Debug|x86.Build.0 = Debug|Any CPU {F0DDF87D-98A4-4237-91C9-FD865ED78ABB}.Release|Any CPU.ActiveCfg = Release|Any CPU {F0DDF87D-98A4-4237-91C9-FD865ED78ABB}.Release|Any CPU.Build.0 = Release|Any CPU + {F0DDF87D-98A4-4237-91C9-FD865ED78ABB}.Release|x64.ActiveCfg = Release|Any CPU + {F0DDF87D-98A4-4237-91C9-FD865ED78ABB}.Release|x64.Build.0 = Release|Any CPU + {F0DDF87D-98A4-4237-91C9-FD865ED78ABB}.Release|x86.ActiveCfg = Release|Any CPU + {F0DDF87D-98A4-4237-91C9-FD865ED78ABB}.Release|x86.Build.0 = Release|Any CPU {91F0D76D-2BEA-43D2-B123-DC29F2E87792}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {91F0D76D-2BEA-43D2-B123-DC29F2E87792}.Debug|Any CPU.Build.0 = Debug|Any CPU + {91F0D76D-2BEA-43D2-B123-DC29F2E87792}.Debug|x64.ActiveCfg = Debug|Any CPU + {91F0D76D-2BEA-43D2-B123-DC29F2E87792}.Debug|x64.Build.0 = Debug|Any CPU + {91F0D76D-2BEA-43D2-B123-DC29F2E87792}.Debug|x86.ActiveCfg = Debug|Any CPU + {91F0D76D-2BEA-43D2-B123-DC29F2E87792}.Debug|x86.Build.0 = Debug|Any CPU {91F0D76D-2BEA-43D2-B123-DC29F2E87792}.Release|Any CPU.ActiveCfg = Release|Any CPU {91F0D76D-2BEA-43D2-B123-DC29F2E87792}.Release|Any CPU.Build.0 = Release|Any CPU + {91F0D76D-2BEA-43D2-B123-DC29F2E87792}.Release|x64.ActiveCfg = Release|Any CPU + {91F0D76D-2BEA-43D2-B123-DC29F2E87792}.Release|x64.Build.0 = Release|Any CPU + {91F0D76D-2BEA-43D2-B123-DC29F2E87792}.Release|x86.ActiveCfg = Release|Any CPU + {91F0D76D-2BEA-43D2-B123-DC29F2E87792}.Release|x86.Build.0 = Release|Any CPU {788030D0-561B-4136-96B4-D5ABFB5CFD07}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {788030D0-561B-4136-96B4-D5ABFB5CFD07}.Debug|Any CPU.Build.0 = Debug|Any CPU + {788030D0-561B-4136-96B4-D5ABFB5CFD07}.Debug|x64.ActiveCfg = Debug|Any CPU + {788030D0-561B-4136-96B4-D5ABFB5CFD07}.Debug|x64.Build.0 = Debug|Any CPU + {788030D0-561B-4136-96B4-D5ABFB5CFD07}.Debug|x86.ActiveCfg = Debug|Any CPU + {788030D0-561B-4136-96B4-D5ABFB5CFD07}.Debug|x86.Build.0 = Debug|Any CPU {788030D0-561B-4136-96B4-D5ABFB5CFD07}.Release|Any CPU.ActiveCfg = Release|Any CPU {788030D0-561B-4136-96B4-D5ABFB5CFD07}.Release|Any CPU.Build.0 = Release|Any CPU + {788030D0-561B-4136-96B4-D5ABFB5CFD07}.Release|x64.ActiveCfg = Release|Any CPU + {788030D0-561B-4136-96B4-D5ABFB5CFD07}.Release|x64.Build.0 = Release|Any CPU + {788030D0-561B-4136-96B4-D5ABFB5CFD07}.Release|x86.ActiveCfg = Release|Any CPU + {788030D0-561B-4136-96B4-D5ABFB5CFD07}.Release|x86.Build.0 = Release|Any CPU {B3000AD2-5EAA-49A2-8FC4-10DF329B15B0}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {B3000AD2-5EAA-49A2-8FC4-10DF329B15B0}.Debug|Any CPU.Build.0 = Debug|Any CPU + {B3000AD2-5EAA-49A2-8FC4-10DF329B15B0}.Debug|x64.ActiveCfg = Debug|Any CPU + {B3000AD2-5EAA-49A2-8FC4-10DF329B15B0}.Debug|x64.Build.0 = Debug|Any CPU + {B3000AD2-5EAA-49A2-8FC4-10DF329B15B0}.Debug|x86.ActiveCfg = Debug|Any CPU + {B3000AD2-5EAA-49A2-8FC4-10DF329B15B0}.Debug|x86.Build.0 = Debug|Any CPU {B3000AD2-5EAA-49A2-8FC4-10DF329B15B0}.Release|Any CPU.ActiveCfg = Release|Any CPU {B3000AD2-5EAA-49A2-8FC4-10DF329B15B0}.Release|Any CPU.Build.0 = Release|Any CPU + {B3000AD2-5EAA-49A2-8FC4-10DF329B15B0}.Release|x64.ActiveCfg = Release|Any CPU + {B3000AD2-5EAA-49A2-8FC4-10DF329B15B0}.Release|x64.Build.0 = Release|Any CPU + {B3000AD2-5EAA-49A2-8FC4-10DF329B15B0}.Release|x86.ActiveCfg = Release|Any CPU + {B3000AD2-5EAA-49A2-8FC4-10DF329B15B0}.Release|x86.Build.0 = Release|Any CPU {C4036D98-A669-440C-9970-05DB45815949}.Debug|Any CPU.ActiveCfg = Debug|Any CPU {C4036D98-A669-440C-9970-05DB45815949}.Debug|Any CPU.Build.0 = Debug|Any CPU + {C4036D98-A669-440C-9970-05DB45815949}.Debug|x64.ActiveCfg = Debug|Any CPU + {C4036D98-A669-440C-9970-05DB45815949}.Debug|x64.Build.0 = Debug|Any CPU + {C4036D98-A669-440C-9970-05DB45815949}.Debug|x86.ActiveCfg = Debug|Any CPU + {C4036D98-A669-440C-9970-05DB45815949}.Debug|x86.Build.0 = Debug|Any CPU {C4036D98-A669-440C-9970-05DB45815949}.Release|Any CPU.ActiveCfg = Release|Any CPU {C4036D98-A669-440C-9970-05DB45815949}.Release|Any CPU.Build.0 = Release|Any CPU + {C4036D98-A669-440C-9970-05DB45815949}.Release|x64.ActiveCfg = Release|Any CPU + {C4036D98-A669-440C-9970-05DB45815949}.Release|x64.Build.0 = Release|Any CPU + {C4036D98-A669-440C-9970-05DB45815949}.Release|x86.ActiveCfg = Release|Any CPU + {C4036D98-A669-440C-9970-05DB45815949}.Release|x86.Build.0 = Release|Any CPU + {9A28027A-E63C-4777-91C7-8D32E7BA70CC}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {9A28027A-E63C-4777-91C7-8D32E7BA70CC}.Debug|Any CPU.Build.0 = Debug|Any CPU + {9A28027A-E63C-4777-91C7-8D32E7BA70CC}.Debug|x64.ActiveCfg = Debug|Any CPU + {9A28027A-E63C-4777-91C7-8D32E7BA70CC}.Debug|x64.Build.0 = Debug|Any CPU + {9A28027A-E63C-4777-91C7-8D32E7BA70CC}.Debug|x86.ActiveCfg = Debug|Any CPU + {9A28027A-E63C-4777-91C7-8D32E7BA70CC}.Debug|x86.Build.0 = Debug|Any CPU + {9A28027A-E63C-4777-91C7-8D32E7BA70CC}.Release|Any CPU.ActiveCfg = Release|Any CPU + {9A28027A-E63C-4777-91C7-8D32E7BA70CC}.Release|Any CPU.Build.0 = Release|Any CPU + {9A28027A-E63C-4777-91C7-8D32E7BA70CC}.Release|x64.ActiveCfg = Release|Any CPU + {9A28027A-E63C-4777-91C7-8D32E7BA70CC}.Release|x64.Build.0 = Release|Any CPU + {9A28027A-E63C-4777-91C7-8D32E7BA70CC}.Release|x86.ActiveCfg = Release|Any CPU + {9A28027A-E63C-4777-91C7-8D32E7BA70CC}.Release|x86.Build.0 = Release|Any CPU EndGlobalSection GlobalSection(SolutionProperties) = preSolution HideSolutionNode = FALSE @@ -102,6 +202,7 @@ Global {788030D0-561B-4136-96B4-D5ABFB5CFD07} = {DF6C4BDE-F3C5-4E53-A5D5-9D27B2D3E38F} {B3000AD2-5EAA-49A2-8FC4-10DF329B15B0} = {DF6C4BDE-F3C5-4E53-A5D5-9D27B2D3E38F} {C4036D98-A669-440C-9970-05DB45815949} = {7426F6BA-3DAD-411E-9956-3980D42DC36F} + {9A28027A-E63C-4777-91C7-8D32E7BA70CC} = {0AB3BF05-4346-4AA6-1389-037BE0695223} EndGlobalSection GlobalSection(ExtensibilityGlobals) = postSolution SolutionGuid = {4050E145-6791-440A-A2E5-75B05ACD4AFE} diff --git a/src/Equinox.Services.Api/Configurations/DatabaseConfig.cs b/src/Equinox.Services.Api/Configurations/DatabaseConfig.cs index a6eb3071..5d5e463a 100644 --- a/src/Equinox.Services.Api/Configurations/DatabaseConfig.cs +++ b/src/Equinox.Services.Api/Configurations/DatabaseConfig.cs @@ -9,11 +9,20 @@ public static WebApplicationBuilder AddDatabaseConfiguration(this WebApplication { if (builder == null) throw new ArgumentNullException(nameof(builder)); - builder.Services.AddDbContext(options => - options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); - - builder.Services.AddDbContext(options => - options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); + if (builder.Environment.EnvironmentName == "Testing") + { + builder.Services.AddDbContext(options => + options.UseInMemoryDatabase("Equinox")); + builder.Services.AddDbContext(options => + options.UseInMemoryDatabase("EquinoxEvents")); + } + else + { + builder.Services.AddDbContext(options => + options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); + builder.Services.AddDbContext(options => + options.UseSqlServer(builder.Configuration.GetConnectionString("DefaultConnection"))); + } return builder; } diff --git a/src/Equinox.Services.Api/Equinox.Services.Api.csproj b/src/Equinox.Services.Api/Equinox.Services.Api.csproj index 91af3386..9e8866bc 100644 --- a/src/Equinox.Services.Api/Equinox.Services.Api.csproj +++ b/src/Equinox.Services.Api/Equinox.Services.Api.csproj @@ -14,6 +14,7 @@ + all runtime; build; native; contentfiles; analyzers; buildtransitive diff --git a/src/Equinox.Services.Api/Program.cs b/src/Equinox.Services.Api/Program.cs index 9be6e435..b57dbb95 100644 --- a/src/Equinox.Services.Api/Program.cs +++ b/src/Equinox.Services.Api/Program.cs @@ -28,4 +28,5 @@ app.MapIdentityApi(); app.UseSwaggerSetup(); -app.Run(); \ No newline at end of file +app.Run(); +public partial class Program { } diff --git a/tests/Equinox.Tests.Integration/CustomerControllerTests.cs b/tests/Equinox.Tests.Integration/CustomerControllerTests.cs new file mode 100644 index 00000000..cc0e8003 --- /dev/null +++ b/tests/Equinox.Tests.Integration/CustomerControllerTests.cs @@ -0,0 +1,96 @@ +using System.Net; +using System.Net.Http.Json; +using Equinox.Application.ViewModels; +using Equinox.Tests.Integration.Support; +using Microsoft.AspNetCore.Mvc.Testing; +using Xunit; + +namespace Equinox.Tests.Integration; + +public class CustomerControllerTests : IClassFixture +{ + private readonly HttpClient _client; + + public CustomerControllerTests(EquinoxApiFactory factory) + { + _client = factory.CreateClient(new WebApplicationFactoryClientOptions + { + AllowAutoRedirect = false + }); + } + + [Fact(DisplayName = "POST /customer registra cliente" )] + public async Task Post_RegisterCustomer_ReturnsSuccess() + { + // Arrange + var customer = new CustomerViewModel + { + Name = "John Doe", + Email = "john@test.com", + BirthDate = DateTime.UtcNow.AddYears(-30) + }; + + // Act + var response = await _client.PostAsJsonAsync("/customer", customer); + + // Assert + response.EnsureSuccessStatusCode(); + var list = await _client.GetFromJsonAsync>("/customer"); + Assert.Contains(list!, c => c.Email == "john@test.com"); + } + + [Fact(DisplayName = "PUT /customer atualiza cliente" )] + public async Task Put_UpdateCustomer_ReturnsSuccess() + { + // Arrange + var customer = new CustomerViewModel + { + Name = "Jane Doe", + Email = "jane@test.com", + BirthDate = DateTime.UtcNow.AddYears(-25) + }; + var createResponse = await _client.PostAsJsonAsync("/customer", customer); + createResponse.EnsureSuccessStatusCode(); + var created = (await _client.GetFromJsonAsync>("/customer"))! + .First(c => c.Email == "jane@test.com"); + var update = new CustomerViewModel + { + Id = created!.Id, + Name = "Jane Updated", + Email = created.Email, + BirthDate = created.BirthDate + }; + + // Act + var updateResponse = await _client.PutAsJsonAsync("/customer", update); + + // Assert + updateResponse.EnsureSuccessStatusCode(); + var get = await _client.GetFromJsonAsync($"/customer/{created.Id}"); + Assert.Equal("Jane Updated", get!.Name); + } + + [Fact(DisplayName = "DELETE /customer remove cliente" )] + public async Task Delete_RemoveCustomer_ReturnsSuccess() + { + // Arrange + var customer = new CustomerViewModel + { + Name = "Remove Doe", + Email = "remove@test.com", + BirthDate = DateTime.UtcNow.AddYears(-20) + }; + var create = await _client.PostAsJsonAsync("/customer", customer); + create.EnsureSuccessStatusCode(); + var created = (await _client.GetFromJsonAsync>("/customer"))! + .First(c => c.Email == "remove@test.com"); + + // Act + var deleteResponse = await _client.DeleteAsync($"/customer?id={created.Id}"); + + // Assert + deleteResponse.EnsureSuccessStatusCode(); + var getResponse = await _client.GetAsync($"/customer/{created.Id}"); + Assert.Equal(HttpStatusCode.NoContent, getResponse.StatusCode); + } +} diff --git a/tests/Equinox.Tests.Integration/Equinox.Tests.Integration.csproj b/tests/Equinox.Tests.Integration/Equinox.Tests.Integration.csproj new file mode 100644 index 00000000..c55daa98 --- /dev/null +++ b/tests/Equinox.Tests.Integration/Equinox.Tests.Integration.csproj @@ -0,0 +1,29 @@ + + + net9.0 + enable + enable + false + true + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + all + runtime; build; native; contentfiles; analyzers; buildtransitive + + + + + + + + + diff --git a/tests/Equinox.Tests.Integration/Support/EquinoxApiFactory.cs b/tests/Equinox.Tests.Integration/Support/EquinoxApiFactory.cs new file mode 100644 index 00000000..29a5700b --- /dev/null +++ b/tests/Equinox.Tests.Integration/Support/EquinoxApiFactory.cs @@ -0,0 +1,20 @@ +using Microsoft.AspNetCore.Authentication; +using Microsoft.AspNetCore.Hosting; +using Microsoft.AspNetCore.Mvc.Testing; +using Microsoft.Extensions.DependencyInjection; + +namespace Equinox.Tests.Integration.Support; + +public class EquinoxApiFactory : WebApplicationFactory +{ + protected override void ConfigureWebHost(IWebHostBuilder builder) + { + builder.UseEnvironment("Testing"); + + builder.ConfigureServices(services => + { + services.AddAuthentication("Test") + .AddScheme("Test", options => { }); + }); + } +} diff --git a/tests/Equinox.Tests.Integration/Support/TestAuthHandler.cs b/tests/Equinox.Tests.Integration/Support/TestAuthHandler.cs new file mode 100644 index 00000000..269d10fa --- /dev/null +++ b/tests/Equinox.Tests.Integration/Support/TestAuthHandler.cs @@ -0,0 +1,24 @@ +using System.Security.Claims; +using System.Text.Encodings.Web; +using Microsoft.AspNetCore.Authentication; +using Microsoft.Extensions.Logging; +using Microsoft.Extensions.Options; +using System.Threading.Tasks; + +namespace Equinox.Tests.Integration.Support; + +public class TestAuthHandler : AuthenticationHandler +{ + public TestAuthHandler(IOptionsMonitor options, + ILoggerFactory logger, UrlEncoder encoder, ISystemClock clock) : base(options, logger, encoder, clock) + { } + + protected override Task HandleAuthenticateAsync() + { + var claims = new[] { new Claim("Customers", "Write"), new Claim("Customers", "Remove") }; + var identity = new ClaimsIdentity(claims, Scheme.Name); + var principal = new ClaimsPrincipal(identity); + var ticket = new AuthenticationTicket(principal, Scheme.Name); + return Task.FromResult(AuthenticateResult.Success(ticket)); + } +}