public void Validate_ValidatesAsExpected(CalculationCreateModel model, bool expectedResult, IEnumerable <string> expectedErrors)
        {
            //Arrange
            ISpecificationsRepository specsRepo     = CreateSpecificationsRepository(false);
            Specification             specification = new Specification
            {
                Current = new SpecificationVersion()
            };

            specsRepo
            .GetSpecificationById(specificationId)
            .Returns(specification);

            CalculationCreateModelValidator validator = CreateValidator(specsRepo);

            //Act
            ValidationResult result = validator.Validate(model);

            //Assert
            result
            .IsValid
            .Should()
            .Be(expectedResult);

            foreach (var error in expectedErrors)
            {
                result.Errors.Count(e => e.ErrorMessage == error).Should().Be(1, $"Expected to find error message '{error}'");
            }

            result
            .Errors
            .Count
            .Should()
            .Be(expectedErrors.Count());
        }
        public void ValidateWithSpecificationAndFundingStreams_ValidatesAsExpected(CalculationCreateModel model,
                                                                                   Specification specification,
                                                                                   IEnumerable <FundingStream> fundingStreams,
                                                                                   bool expectedResult,
                                                                                   IEnumerable <string> expectedErrors)
        {
            //Arrange
            ISpecificationsRepository specsRepo = CreateSpecificationsRepository(false);

            specsRepo
            .GetSpecificationById(specificationId)
            .Returns(specification);

            specsRepo
            .GetFundingStreams()
            .Returns(fundingStreams);

            CalculationCreateModelValidator validator = CreateValidator(specsRepo);

            //Act
            ValidationResult result = validator.Validate(model);

            //Assert
            result
            .IsValid
            .Should()
            .Be(expectedResult);

            foreach (var error in expectedErrors)
            {
                result
                .Errors
                .Select(e => e.ErrorMessage)
                .Distinct()
                .Count(e => e == error)
                .Should()
                .Be(1, $"Expected to find error message '{error}'");
            }

            result
            .Errors
            .Count
            .Should()
            .Be(expectedErrors.Count());
        }
        public void Validate_GivenNameAlreadyExists_ValidIsFalse()
        {
            //Arrange
            CalculationCreateModel model = CreateModel();

            ISpecificationsRepository repository    = CreateSpecificationsRepository(true);
            Specification             specification = new Specification
            {
                Current = new SpecificationVersion()
            };

            repository
            .GetSpecificationById(specificationId)
            .Returns(specification);

            ICalculationsRepository calculationsRepository = Substitute.For <ICalculationsRepository>();

            calculationsRepository
            .IsCalculationNameValid(Arg.Any <string>(), Arg.Any <string>(), Arg.Any <string>())
            .Returns(false);

            CalculationCreateModelValidator validator = CreateValidator(repository, calculationsRepository);

            //Act
            ValidationResult result = validator.Validate(model);

            //Assert
            result
            .IsValid
            .Should()
            .BeFalse();

            result
            .Errors
            .Count
            .Should()
            .Be(1);

            result.Errors.Single().ErrorMessage.Should().Be("Calculation with the same generated source code name already exists in this specification");

            calculationsRepository
            .Received(1)
            .IsCalculationNameValid(specificationId, name);
        }