forked from ddrilling/AsbCloudServer
275 lines
6.6 KiB
C#
275 lines
6.6 KiB
C#
|
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);
|
||
|
}
|
||
|
}
|