public async Task Then_Will_Return_Error_If_Course_Has_Active_Rules()
        {
            //Arrange
            var request = new ValidateReservationQuery
            {
                CourseCode    = CourseId,
                ReservationId = ReservationId,
                StartDate     = _reservation.StartDate.Value.AddDays(1)
            };

            _course.Rules.Add(new Rule
            {
                ActiveFrom = request.StartDate.AddDays(-2),
                ActiveTo   = request.StartDate.AddDays(2)
            });

            //Act
            var result = await _handler.Handle(request, CancellationToken.None);

            //Assert
            var error = result?.Errors.FirstOrDefault();

            Assert.IsNotNull(error);
            Assert.AreEqual(nameof(ValidateReservationQuery.CourseCode), error.PropertyName);
        }
        public void Arrange()
        {
            _validator = new ValidateReservationValidator();

            _query = new ValidateReservationQuery
            {
                ReservationId = Guid.NewGuid(),
                CourseCode    = "1",
                StartDate     = DateTime.Now
            };
        }
        public async Task Then_Validates_Given_Course()
        {
            //Arrange
            var request = new ValidateReservationQuery
            {
                CourseCode    = CourseId,
                ReservationId = ReservationId,
                StartDate     = _reservation.StartDate.Value.AddDays(1)
            };

            //Act
            await _handler.Handle(request, CancellationToken.None);

            //Assert
            _courseService.Verify(s => s.GetCourseById(CourseId), Times.Once);
        }
        public async Task Then_The_Query_Is_Validated()
        {
            //Assert
            var request = new ValidateReservationQuery
            {
                CourseCode    = CourseId,
                ReservationId = ReservationId,
                StartDate     = _reservation.StartDate.Value.AddDays(-1)
            };

            //Act
            await _handler.Handle(request, CancellationToken.None);

            //Assert
            _validator.Verify(x => x.ValidateAsync(request), Times.Once);
        }
        public async Task Then_Will_Return_No_Errors_Reservation_Is_Valid()
        {
            //Arrange
            var request = new ValidateReservationQuery
            {
                CourseCode    = CourseId,
                ReservationId = ReservationId,
                StartDate     = _reservation.StartDate.Value.AddDays(1)
            };

            //Act
            var result = await _handler.Handle(request, CancellationToken.None);

            //Assert
            Assert.IsNotNull(result);
            Assert.IsEmpty(result.Errors);
        }
        public async Task Then_Will_Return_Error_If_Training_Start_Date_Is_After_Reservation_Expiry_Date()
        {
            //Arrange
            var request = new ValidateReservationQuery
            {
                CourseCode    = CourseId,
                ReservationId = ReservationId,
                StartDate     = _reservation.ExpiryDate.Value.AddDays(1)
            };

            //Act
            var result = await _handler.Handle(request, CancellationToken.None);

            //Assert
            Assert.IsNotNull(result);
            Assert.AreEqual(1, result.Errors.Count);
        }
예제 #7
0
        public async Task <IActionResult> Validate(Guid id, string courseCode, DateTime startDate)
        {
            try
            {
                var request = new ValidateReservationQuery
                {
                    ReservationId = id,
                    CourseCode    = courseCode,
                    StartDate     = startDate
                };

                var response = await _mediator.Send(request);

                if (response == null)
                {
                    return(NotFound());
                }

                return(Ok(new ValidateReservationViewModel
                {
                    ValidationErrors = response.Errors
                                       .Select(e => new ReservationValidationErrorViewModel
                    {
                        PropertyName = e.PropertyName,
                        Reason = e.Reason
                    })
                                       .ToList()
                }));
            }
            catch (ArgumentException e)
            {
                _logger.LogWarning(e, e.Message);
                return(BadRequest(new ArgumentErrorViewModel
                {
                    Message = e.Message,
                    Params = e.ParamName
                }));
            }
            catch (EntityNotFoundException <Domain.Reservations.Reservation> e)
            {
                _logger.LogError(e, e.Message);
                return(NotFound());
            }
        }
        public void And_No_Reservation_Found_Then_Throws_EntityNotFoundException()
        {
            //Arrange
            var request = new ValidateReservationQuery
            {
                CourseCode    = CourseId,
                ReservationId = ReservationId,
                StartDate     = _reservation.StartDate.Value.AddDays(1)
            };

            _reservationService
            .Setup(r => r.GetReservation(It.IsAny <Guid>()))
            .ReturnsAsync((Reservation)null);

            //Act
            Func <Task> act = async() => await _handler.Handle(request, CancellationToken.None);

            //Assert
            act.Should().Throw <EntityNotFoundException <Reservation> >();
        }
        public void Then_If_The_Query_Fails_Validation_Then_An_Argument_Exception_Is_Thrown()
        {
            //Arrange
            var request = new ValidateReservationQuery
            {
                CourseCode    = CourseId,
                ReservationId = ReservationId,
                StartDate     = _reservation.StartDate.Value.AddDays(-1)
            };

            //Arrange
            _validator.Setup(x => x.ValidateAsync(It.IsAny <ValidateReservationQuery>()))
            .ReturnsAsync(new ValidationResult {
                ValidationDictionary = new Dictionary <string, string> {
                    { "", "" }
                }
            });

            //Act Assert
            Assert.ThrowsAsync <ArgumentException>(async() => await _handler.Handle(request, CancellationToken.None));
        }
        public async Task Then_Will_Return_Error_Messages_If_No_Course_Found()
        {
            //Arrange
            var request = new ValidateReservationQuery
            {
                CourseCode    = CourseId,
                ReservationId = ReservationId,
                StartDate     = _reservation.StartDate.Value.AddDays(1)
            };

            _courseService.Setup(s => s.GetCourseById(It.IsAny <string>())).ReturnsAsync((Course)null);

            //Act
            var result = await _handler.Handle(request, CancellationToken.None);

            //Assert
            var error = result?.Errors.FirstOrDefault();

            Assert.IsNotNull(error);
            Assert.AreEqual(nameof(ValidateReservationQuery.CourseCode), error.PropertyName);
            Assert.AreEqual("Selected course cannot be found", error.Reason);
        }
        public async Task Then_Will_Return_No_Error_Messages_If_Course_Has_No_Active_Rules()
        {
            //Arrange
            var request = new ValidateReservationQuery
            {
                CourseCode    = CourseId,
                ReservationId = ReservationId,
                StartDate     = _reservation.StartDate.Value.AddDays(1)
            };

            _course.Rules.Add(new Rule
            {
                ActiveFrom = _reservation.StartDate.Value.AddDays(-10),
                ActiveTo   = _reservation.StartDate.Value.AddDays(-5)
            });

            //Act
            var result = await _handler.Handle(request, CancellationToken.None);

            //Assert
            Assert.IsNotNull(result);
            Assert.IsEmpty(result.Errors);
        }
        public async Task Then_Will_Not_Cause_A_Validation_Error_On_Start_Date_If_It_Is_A_Change_Reservation()
        {
            //Arrange
            var startDate = new DateTime(DateTime.Now.Year, DateTime.Now.Month, 1).AddMonths(-6);

            _reservation = new Reservation(time => Task.FromResult(new List <Rule>() as IList <Rule>), ReservationId, 1, false, DateTime.Now, startDate, startDate.AddMonths(3), ReservationStatus.Change, new Domain.Entities.Course(), 1, 1, "Legal Entity", 0, null);
            _reservationService
            .Setup(r => r.GetReservation(It.IsAny <Guid>()))
            .ReturnsAsync(_reservation);
            var request = new ValidateReservationQuery
            {
                CourseCode    = CourseId,
                ReservationId = ReservationId,
                StartDate     = _reservation.ExpiryDate.Value.AddMonths(1)
            };


            //Act
            var result = await _handler.Handle(request, CancellationToken.None);

            //Assert
            Assert.IsNotNull(result);
            Assert.IsEmpty(result.Errors);
        }
        public async Task Then_Will_Return_Error_Messages_If_Course_Is_A_Framework()
        {
            //Arrange
            var request = new ValidateReservationQuery
            {
                CourseCode    = CourseId,
                ReservationId = ReservationId,
                StartDate     = _reservation.StartDate.Value
            };

            var course = new Course("12-34", "Test Course", "1", DateTime.Today);

            _courseService.Setup(s => s.GetCourseById(It.IsAny <string>())).ReturnsAsync(course);

            //Act
            var result = await _handler.Handle(request, CancellationToken.None);

            //Assert
            var error = result?.Errors.FirstOrDefault();

            Assert.IsNotNull(error);
            Assert.AreEqual(nameof(ValidateReservationQuery.CourseCode), error.PropertyName);
            Assert.AreEqual("Select an apprenticeship training course standard", error.Reason);
        }
        public async Task Then_Will_Return_Error_Message_If_Training_Start_Date_Is_After_Reservation_Expiry_Date()
        {
            //Arrange
            var request = new ValidateReservationQuery
            {
                CourseCode    = CourseId,
                ReservationId = ReservationId,
                StartDate     = _reservation.ExpiryDate.Value.AddDays(1)
            };

            var expectedErrorMessage = "Training start date must be between the funding reservation dates " +
                                       $"{_reservation.StartDate.Value:MM yyyy} to " +
                                       $"{_reservation.ExpiryDate.Value:MM yyyy}";

            //Act
            var result = await _handler.Handle(request, CancellationToken.None);

            //Assert
            var error = result?.Errors.FirstOrDefault();

            Assert.IsNotNull(error);
            Assert.AreEqual(nameof(ValidateReservationQuery.StartDate), error.PropertyName);
            Assert.AreEqual(expectedErrorMessage, error.Reason);
        }
        public async Task And_Reservation_Is_Levy_Then_Valid()
        {
            //Arrange
            var request = new ValidateReservationQuery
            {
                CourseCode    = CourseId,
                ReservationId = ReservationId,
                StartDate     = _reservation.StartDate.Value.AddDays(1)
            };

            _reservation = new Reservation(
                time => Task.FromResult(new List <Rule>() as IList <Rule>),
                ReservationId,
                1,
                true,
                DateTime.Now,
                null,
                null,
                ReservationStatus.Pending,
                null,
                null,
                1,
                "Legal Entity",
                null,
                null);
            _reservationService
            .Setup(r => r.GetReservation(It.IsAny <Guid>()))
            .ReturnsAsync(_reservation);

            //Act
            var result = await _handler.Handle(request, CancellationToken.None);

            //Assert
            Assert.IsNotNull(result);
            Assert.IsEmpty(result.Errors);
        }