using System; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Json; using System.Threading.Tasks; using AsbCloudApp.Data; using AsbCloudApp.Services; using Microsoft.Extensions.DependencyInjection; using Xunit; namespace AsbCloudWebApi.Tests.IntegrationTests.Controllers; public abstract class CrudControllerTests : BaseIntegrationTest where T : class, IId where TRepository : ICrudRepository { private readonly TRepository repository; protected abstract string Uri { get; } protected abstract T GetFakerData(); protected CrudControllerTests(TestWebApplicationFactory factory) : base(factory) { repository = scope.ServiceProvider.GetRequiredService(); } [Fact] public virtual async Task InsertAsync_Should_ReturnsSuccess() { //arrange var fakerData = GetFakerData(); var request = new HttpRequestMessage { Content = JsonContent.Create(fakerData), Method = HttpMethod.Post, RequestUri = new Uri(Uri, UriKind.Relative) }; var user = await RegisterUserAsync(); SetToken(user.Token); //act var response = await httpClient.SendAsync(request); var result = await response.Content.ReadFromJsonAsync(); //assert Assert.True(result > 0); Assert.True(response.IsSuccessStatusCode); } [Fact] public virtual async Task InsertRangeAsync_Should_ReturnsSuccess() { //arrange var fakerData = GetFakerData(); var request = new HttpRequestMessage { Content = JsonContent.Create(new[] { fakerData }), Method = HttpMethod.Post, RequestUri = new Uri($"{Uri}/range", UriKind.Relative) }; var user = await RegisterUserAsync(); SetToken(user.Token); //act var response = await httpClient.SendAsync(request); var result = await response.Content.ReadFromJsonAsync(); //assert Assert.True(result > 0); Assert.True(response.IsSuccessStatusCode); } [Fact] public virtual async Task InsertRangeAsync_Should_ReturnsBadRequest_WhenInputCollectionFakerDataIsEmpty() { //arrange var request = new HttpRequestMessage { Content = JsonContent.Create(Enumerable.Empty()), Method = HttpMethod.Post, RequestUri = new Uri($"{Uri}/range", UriKind.Relative) }; var user = await RegisterUserAsync(); SetToken(user.Token); //act var response = await httpClient.SendAsync(request); //assert Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); } [Fact] public virtual async Task UpdateAsync_Should_ReturnsSuccess() { //arrange var fakerData = GetFakerData(); fakerData.Id = await repository.InsertAsync(fakerData, default); var request = new HttpRequestMessage { Content = JsonContent.Create(fakerData), Method = HttpMethod.Put, RequestUri = new Uri(Uri, UriKind.Relative) }; var user = await RegisterUserAsync(); SetToken(user.Token); //act var response = await httpClient.SendAsync(request); var result = await response.Content.ReadFromJsonAsync(); //assert Assert.Equal(fakerData.Id, result); Assert.True(response.IsSuccessStatusCode); } [Fact] public virtual async Task UpdateAsync_Should_ReturnsBadRequest_WhenFakerDataHasInvalidId() { //arrange var fakerData = GetFakerData(); var request = new HttpRequestMessage { Content = JsonContent.Create(fakerData), Method = HttpMethod.Put, RequestUri = new Uri(Uri, UriKind.Relative) }; var user = await RegisterUserAsync(); SetToken(user.Token); //act var response = await httpClient.SendAsync(request); //assert Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode); } [Fact] public virtual async Task DeleteAsync_Should_ReturnsSuccess() { //arrange var fakerData = GetFakerData(); fakerData.Id = await repository.InsertAsync(fakerData, default); var request = new HttpRequestMessage { Method = HttpMethod.Delete, RequestUri = new Uri($"{Uri}/{fakerData.Id}", UriKind.Relative) }; var user = await RegisterUserAsync(); SetToken(user.Token); //act var response = await httpClient.SendAsync(request); var result = await response.Content.ReadFromJsonAsync(); //assert Assert.True(result > 0); Assert.True(response.IsSuccessStatusCode); } [Fact] public virtual async Task DeleteAsync_Should_ReturnsNoContent_WhenFakerDataHasInvalidId() { //arrange const int fakerInvalidId = 0; var request = new HttpRequestMessage { Method = HttpMethod.Delete, RequestUri = new Uri($"{Uri}/{fakerInvalidId}", UriKind.Relative) }; var user = await RegisterUserAsync(); SetToken(user.Token); //act var response = await httpClient.SendAsync(request); //assert Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); } [Fact] public virtual async Task GetOrDefaultAsync_Should_ReturnsSuccess() { //arrange var fakerData = GetFakerData(); fakerData.Id = await repository.InsertAsync(fakerData, default); var request = new HttpRequestMessage { Method = HttpMethod.Get, RequestUri = new Uri($"{Uri}/{fakerData.Id}", UriKind.Relative) }; var user = await RegisterUserAsync(); SetToken(user.Token); //act var response = await httpClient.SendAsync(request); var result = await response.Content.ReadFromJsonAsync(); //assert Assert.NotNull(result); Assert.Equal(fakerData.Id, result.Id); Assert.True(response.IsSuccessStatusCode); } [Fact] public virtual async Task GetOrDefaultAsync_Should_ReturnsNoContent_WhenFakerDataHasInvalidId() { //arrange const int fakerInvalidId = 0; var request = new HttpRequestMessage { Method = HttpMethod.Get, RequestUri = new Uri($"{Uri}/{fakerInvalidId}", UriKind.Relative) }; var user = await RegisterUserAsync(); SetToken(user.Token); //act var response = await httpClient.SendAsync(request); //assert Assert.Equal(HttpStatusCode.NoContent, response.StatusCode); } [Fact] public virtual async Task GetAllAsync_Should_ReturnsSuccess() { //arrange var existingFakerDataIds = (await repository.GetAllAsync(default)).Select(f => f.Id); foreach (var existingFakerDataId in existingFakerDataIds) await repository.DeleteAsync(existingFakerDataId, default); var fakerData = GetFakerData(); fakerData.Id = await repository.InsertAsync(fakerData, default); var request = new HttpRequestMessage { Method = HttpMethod.Get, RequestUri = new Uri(Uri, UriKind.Relative) }; var user = await RegisterUserAsync(); SetToken(user.Token); //act var response = await httpClient.SendAsync(request); var result = await response.Content.ReadFromJsonAsync(); //assert Assert.NotNull(result); Assert.Single(result); Assert.True(response.IsSuccessStatusCode); } }