using FluentAssertions; using FluentValidation.Results; using NSubstitute; using Vegasco.Server.Api.Consumptions; namespace Vegasco.Server.Api.Tests.Unit.Consumptions; public class UpdateConsumptionRequestValidatorTests { private readonly UpdateConsumption.Validator _sut; private readonly TimeProvider _timeProvider = Substitute.For(); private readonly DateTimeOffset _utcNow = new DateTimeOffset(2024, 8, 18, 13, 2, 53, TimeSpan.Zero); private readonly UpdateConsumption.Request _validRequest; public UpdateConsumptionRequestValidatorTests() { _timeProvider.GetUtcNow().Returns(_utcNow); _sut = new UpdateConsumption.Validator(_timeProvider); _validRequest = new UpdateConsumption.Request( _utcNow.AddDays(-1), 1, 1); } [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 UpdateConsumption.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(UpdateConsumption.Request.DateTime)); } [Theory] [InlineData(0)] [InlineData(-1)] public async Task ValidateAsync_ShouldBeInvalid_WhenDistanceIsLessThanOrEqualToZero(double distance) { // Arrange UpdateConsumption.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(UpdateConsumption.Request.Distance)); } [Theory] [InlineData(0)] [InlineData(-1)] public async Task ValidateAsync_ShouldBeInvalid_WhenAmountIsLessThanOrEqualToZero(double amount) { // Arrange UpdateConsumption.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(UpdateConsumption.Request.Amount)); } }