using FluentAssertions; using FluentValidation.Results; using NSubstitute; using Vegasco.Server.Api.Consumptions; namespace Vegasco.Server.Api.Tests.Unit.Consumptions; public class CreateConsumptionRequestValidatorTests { private readonly CreateConsumption.Validator _sut; private readonly TimeProvider _timeProvider = Substitute.For(); 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.Date.AddDays(1).AddTicks(-1), 1, 1, 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_WhenDateTimeIsGreaterThanUtcToday() { // Arrange CreateConsumption.Request request = _validRequest with { DateTime = _utcNow.Date.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)); } }