DD.WellWorkover.Cloud/AsbCloudWebApi.Tests/IntegrationTests/Controllers/CrudControllerTests.cs

275 lines
6.6 KiB
C#
Raw Normal View History

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<T, TRepository> : BaseIntegrationTest
where T : class, IId
where TRepository : ICrudRepository<T>
{
private readonly TRepository repository;
protected abstract string Uri { get; }
protected abstract T GetFakerData();
protected CrudControllerTests(TestWebApplicationFactory factory)
: base(factory)
{
repository = scope.ServiceProvider.GetRequiredService<TRepository>();
}
[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<int>();
//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<int>();
//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<T>()),
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<int>();
//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<int>();
//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<T>();
//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<T[]>();
//assert
Assert.NotNull(result);
Assert.Single(result);
Assert.True(response.IsSuccessStatusCode);
}
}