Newer
Older
Warehouse / tests / Application.UnitTests / Common / Exceptions / InputValidationExceptionTests.cs
@Derek Comartin Derek Comartin on 22 Aug 2023 2 KB Init
using FluentAssertions;
using FluentValidation.Results;
using MyWarehouse.Application.Common.Exceptions;
using NUnit.Framework;
using System;
using System.Collections.Generic;
using System.Linq;

namespace MyWarehouse.Application.UnitTests.Common.Exceptions
{
    public class InputValidationExceptionTests
    {

        [Test]
        public void Instantiation_Blank_SetsProperties()
        {
            var innerException = new Exception();
            
            var sut = new InputValidationException(innerException);

            sut.InnerException.Should().Be(innerException);
            sut.Message.Should().Contain("validation");
            sut.Errors.Should().NotBeNull();
        }

        [Test]
        public void Instantiation_WithValidationFailures_SetsProperties()
        {
            var failures = new List<ValidationFailure>()
            {
                new ValidationFailure("Prop", "Prop not good, mister."),
                new ValidationFailure("Prop", "Prop really not good, mister.")
            };

            var sut = new InputValidationException(failures);

            sut.InnerException.Should().BeNull();
            sut.Message.Should().Contain("validation");
            sut.Errors.Should().HaveCount(1).And.ContainKey("Prop");
            sut.Errors.First().Should().BeEquivalentTo(
                new {
                    Key = "Prop",
                    Value = new[] {
                        failures[0].ErrorMessage,
                        failures[1].ErrorMessage
                    }
                },
                because: "Validations failured are expected to be grouped by property name."
            );
        }

        [Test]
        public void Instantiation_WithTuples_SetsProperties()
        {
            var failureTuples = new[]
            {
                ("Prop", "Prop not good, mister."),
                ("Prop", "Prop really not good, mister.")
            };

            var sut = new InputValidationException(failureTuples);

            sut.InnerException.Should().BeNull();
            sut.Message.Should().Contain("validation");
            sut.Errors.Should().HaveCount(1).And.ContainKey("Prop");
            sut.Errors.First().Should().BeEquivalentTo(
                new
                {
                    Key = "Prop",
                    Value = new[] {
                        failureTuples[0].Item2,
                        failureTuples[1].Item2
                    }
                },
                because: "Validations failured are expected to be grouped by property name."
            );
        }
    }
}