2024-08-23 18:02:18 +02:00
|
|
|
|
using FluentAssertions;
|
|
|
|
|
|
using FluentValidation.Results;
|
|
|
|
|
|
using NSubstitute;
|
2025-06-12 18:22:37 +02:00
|
|
|
|
using Vegasco.Server.Api.Consumptions;
|
2024-08-23 18:02:18 +02:00
|
|
|
|
|
2025-06-12 18:22:37 +02:00
|
|
|
|
namespace Vegasco.Server.Api.Tests.Unit.Consumptions;
|
2024-08-23 18:02:18 +02:00
|
|
|
|
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));
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|