using System.Net; using System.Net.Http.Headers; using CrupestApi.Commons.Secrets; using Microsoft.AspNetCore.TestHost; namespace CrupestApi.Commons.Crud.Tests; public class CrudIntegratedTest : IAsyncLifetime { private readonly WebApplication _app; private HttpClient _httpClient = default!; private HttpClient _authorizedHttpClient = default!; private string _token = default!; public CrudIntegratedTest() { var builder = WebApplication.CreateBuilder(); builder.Logging.ClearProviders(); builder.Services.AddSingleton(); builder.Services.AddCrud(); builder.WebHost.UseTestServer(); _app = builder.Build(); _app.UseCrudCore(); _app.MapCrud("/test", "test-perm"); } public async Task InitializeAsync() { await _app.StartAsync(); _httpClient = _app.GetTestClient(); using (var scope = _app.Services.CreateScope()) { var secretService = (SecretService)scope.ServiceProvider.GetRequiredService(); var key = secretService.Create(new SecretInfo { Key = "test-perm" }); _token = secretService.GetByKey(key).Secret; } _authorizedHttpClient = _app.GetTestClient(); _authorizedHttpClient.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _token); } public async Task DisposeAsync() { await _app.StopAsync(); } [Fact] public async Task EmptyTest() { using var response = await _authorizedHttpClient.GetAsync("/test"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var body = await response.Content.ReadFromJsonAsync>(); Assert.NotNull(body); Assert.Empty(body); } [Fact] public async Task CrudTest() { { using var response = await _authorizedHttpClient.PostAsJsonAsync("/test", new TestEntity { Name = "test", Age = 22 }); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var body = await response.Content.ReadFromJsonAsync(); Assert.NotNull(body); Assert.Equal("test", body.Name); Assert.Equal(22, body.Age); Assert.Null(body.Height); Assert.NotEmpty(body.Secret); } { using var response = await _authorizedHttpClient.GetAsync("/test"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var body = await response.Content.ReadFromJsonAsync>(); Assert.NotNull(body); var entity = Assert.Single(body); Assert.Equal("test", entity.Name); Assert.Equal(22, entity.Age); Assert.Null(entity.Height); Assert.NotEmpty(entity.Secret); } { using var response = await _authorizedHttpClient.GetAsync("/test/test"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var body = await response.Content.ReadFromJsonAsync(); Assert.NotNull(body); Assert.Equal("test", body.Name); Assert.Equal(22, body.Age); Assert.Null(body.Height); Assert.NotEmpty(body.Secret); } { using var response = await _authorizedHttpClient.PatchAsJsonAsync("/test/test", new TestEntity { Name = "test-2", Age = 23, Height = 188.0f }); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var body = await response.Content.ReadFromJsonAsync(); Assert.NotNull(body); Assert.Equal("test-2", body.Name); Assert.Equal(23, body.Age); Assert.Equal(188.0f, body.Height); Assert.NotEmpty(body.Secret); } { using var response = await _authorizedHttpClient.GetAsync("/test/test-2"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var body = await response.Content.ReadFromJsonAsync(); Assert.NotNull(body); Assert.Equal("test-2", body.Name); Assert.Equal(23, body.Age); Assert.Equal(188.0f, body.Height); Assert.NotEmpty(body.Secret); } { using var response = await _authorizedHttpClient.DeleteAsync("/test/test-2"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); } { using var response = await _authorizedHttpClient.GetAsync("/test"); Assert.Equal(HttpStatusCode.OK, response.StatusCode); var body = await response.Content.ReadFromJsonAsync>(); Assert.NotNull(body); Assert.Empty(body); } } [Fact] public async Task UnauthorizedTest() { { using var response = await _httpClient.GetAsync("/test"); Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); } { using var response = await _httpClient.GetAsync("/test/test"); Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); } { using var response = await _httpClient.PostAsJsonAsync("/test", new TestEntity { Name = "test", Age = 22 }); Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); } { using var response = await _httpClient.PatchAsJsonAsync("/test/test", new TestEntity { Name = "test-2", Age = 23, Height = 188.0f }); Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); } { using var response = await _httpClient.DeleteAsync("/test/test"); Assert.Equal(HttpStatusCode.Unauthorized, response.StatusCode); } } [Fact] public async Task NotFoundTest() { { using var response = await _authorizedHttpClient.GetAsync("/test/test"); Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } { using var response = await _authorizedHttpClient.PatchAsJsonAsync("/test/test", new TestEntity { Name = "test-2", Age = 23, Height = 188.0f }); Assert.Equal(HttpStatusCode.NotFound, response.StatusCode); } } }