100 lines
2.7 KiB
C#
100 lines
2.7 KiB
C#
|
|
using FluentAssertions;
|
|||
|
|
using FluentValidation.Results;
|
|||
|
|
using NSubstitute;
|
|||
|
|
using Vegasco.WebApi.Consumptions;
|
|||
|
|
|
|||
|
|
namespace WebApi.Tests.Unit.Consumptions;
|
|||
|
|
public class CreateConsumptionRequestValidatorTests
|
|||
|
|
{
|
|||
|
|
private readonly CreateConsumption.Validator _sut;
|
|||
|
|
private readonly TimeProvider _timeProvider = Substitute.For<TimeProvider>();
|
|||
|
|
|
|||
|
|
private readonly DateTimeOffset _utcNow = new DateTimeOffset(2024, 8, 18, 13, 2, 53, TimeSpan.Zero);
|
|||
|
|
|
|||
|
|
private readonly CreateConsumption.Request _validRequest;
|
|||
|
|
|
|||
|
|
public CreateConsumptionRequestValidatorTests()
|
|||
|
|
{
|
|||
|
|
_timeProvider.GetUtcNow().Returns(_utcNow);
|
|||
|
|
_sut = new CreateConsumption.Validator(_timeProvider);
|
|||
|
|
|
|||
|
|
_validRequest = new CreateConsumption.Request(
|
|||
|
|
_utcNow.AddDays(-1),
|
|||
|
|
1,
|
|||
|
|
1,
|
|||
|
|
false,
|
|||
|
|
Guid.NewGuid());
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[Fact]
|
|||
|
|
public async Task ValidateAsync_ShouldBeValid_WhenRequestIsValid()
|
|||
|
|
{
|
|||
|
|
// Arrange
|
|||
|
|
|
|||
|
|
// Act
|
|||
|
|
ValidationResult? result = await _sut.ValidateAsync(_validRequest);
|
|||
|
|
|
|||
|
|
// Assert
|
|||
|
|
result.IsValid.Should().BeTrue();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[Fact]
|
|||
|
|
public async Task ValidateAsync_ShouldBeInvalid_WhenDateTimeIsGreaterThanUtcNow()
|
|||
|
|
{
|
|||
|
|
// Arrange
|
|||
|
|
CreateConsumption.Request request = _validRequest with { DateTime = _utcNow.AddDays(1) };
|
|||
|
|
|
|||
|
|
// Act
|
|||
|
|
ValidationResult? result = await _sut.ValidateAsync(request);
|
|||
|
|
|
|||
|
|
// Assert
|
|||
|
|
result.IsValid.Should().BeFalse();
|
|||
|
|
result.Errors.Should().ContainSingle(x => x.PropertyName == nameof(CreateConsumption.Request.DateTime));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[Theory]
|
|||
|
|
[InlineData(0)]
|
|||
|
|
[InlineData(-1)]
|
|||
|
|
public async Task ValidateAsync_ShouldBeInvalid_WhenDistanceIsLessThanOrEqualToZero(double distance)
|
|||
|
|
{
|
|||
|
|
// Arrange
|
|||
|
|
CreateConsumption.Request request = _validRequest with { Distance = distance };
|
|||
|
|
|
|||
|
|
// Act
|
|||
|
|
ValidationResult? result = await _sut.ValidateAsync(request);
|
|||
|
|
|
|||
|
|
// Assert
|
|||
|
|
result.IsValid.Should().BeFalse();
|
|||
|
|
result.Errors.Should().ContainSingle(x => x.PropertyName == nameof(CreateConsumption.Request.Distance));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[Theory]
|
|||
|
|
[InlineData(0)]
|
|||
|
|
[InlineData(-1)]
|
|||
|
|
public async Task ValidateAsync_ShouldBeInvalid_WhenAmountIsLessThanOrEqualToZero(double amount)
|
|||
|
|
{
|
|||
|
|
// Arrange
|
|||
|
|
CreateConsumption.Request request = _validRequest with { Amount = amount };
|
|||
|
|
|
|||
|
|
// Act
|
|||
|
|
ValidationResult? result = await _sut.ValidateAsync(request);
|
|||
|
|
|
|||
|
|
// Assert
|
|||
|
|
result.IsValid.Should().BeFalse();
|
|||
|
|
result.Errors.Should().ContainSingle(x => x.PropertyName == nameof(CreateConsumption.Request.Amount));
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
[Fact]
|
|||
|
|
public async Task ValidateAsync_ShouldBeInvalid_WhenCarIdIsEmpty()
|
|||
|
|
{
|
|||
|
|
// Arrange
|
|||
|
|
CreateConsumption.Request request = _validRequest with { CarId = Guid.Empty };
|
|||
|
|
|
|||
|
|
// Act
|
|||
|
|
ValidationResult? result = await _sut.ValidateAsync(request);
|
|||
|
|
|
|||
|
|
// Assert
|
|||
|
|
result.IsValid.Should().BeFalse();
|
|||
|
|
result.Errors.Should().ContainSingle(x => x.PropertyName == nameof(CreateConsumption.Request.CarId));
|
|||
|
|
}
|
|||
|
|
}
|