public async Task Then_Gets_CourseEpaos_From_Service(
            GetCourseEpaosQuery query,
            CourseEpaos courseEpaos,
            DeliveryAreaList deliveryAreas,
            [Frozen] Mock <IValidator <GetCourseEpaosQuery> > mockValidator,
            [Frozen] Mock <ICourseService> mockCourseService,
            [Frozen] Mock <IEpaoService> mockEpaoService,
            GetCourseEpaosQueryHandler handler)
        {
            mockValidator
            .Setup(validator => validator.ValidateAsync(query))
            .ReturnsAsync(new ValidationResult());
            mockCourseService
            .Setup(service => service.GetCourseEpaos(query.CourseId))
            .ReturnsAsync(courseEpaos);
            mockEpaoService
            .Setup(service => service.GetDeliveryAreas())
            .ReturnsAsync(deliveryAreas);

            var result = await handler.Handle(query, CancellationToken.None);

            result.Course.Should().BeEquivalentTo(courseEpaos.Course);
            result.Epaos.Should().BeEquivalentTo(courseEpaos.Epaos);
            result.DeliveryAreas.Should().BeEquivalentTo(deliveryAreas.DeliveryAreas);
        }
        public async Task Then_Gets_Epaos_From_Assessors_Api_And_Course_From_Courses_Api_And_Filters_Epaos(
            GetCourseEpaosQuery query,
            List <GetCourseEpaoListItem> epaoApiResponse,
            GetStandardsListItem coursesApiResponse,
            [Frozen] Mock <IAssessorsApiClient <AssessorsApiConfiguration> > mockAssessorsApiClient,
            [Frozen] Mock <ICoursesApiClient <CoursesApiConfiguration> > mockCoursesApiClient,
            [Frozen] Mock <ICourseEpaoIsValidFilterService> mockCourseEpaoFilter,
            GetCourseEpaosQueryHandler handler)
        {
            mockAssessorsApiClient
            .Setup(client => client.GetAll <GetCourseEpaoListItem>(
                       It.Is <GetCourseEpaosRequest>(request => request.CourseId == query.CourseId)))
            .ReturnsAsync(epaoApiResponse);
            mockCoursesApiClient
            .Setup(client => client.Get <GetStandardsListItem>(
                       It.Is <GetStandardRequest>(request => request.StandardId == query.CourseId)))
            .ReturnsAsync(coursesApiResponse);
            mockCourseEpaoFilter
            .Setup(service => service.IsValidCourseEpao(It.Is <GetCourseEpaoListItem>(item => item.EpaoId == epaoApiResponse[0].EpaoId)))
            .Returns(true);

            var result = await handler.Handle(query, CancellationToken.None);

            result.Epaos.Should().BeEquivalentTo(epaoApiResponse.Where(item => item.EpaoId == epaoApiResponse[0].EpaoId).ToList());
            result.Epaos.Should().BeInAscendingOrder(item => item.Name);
            result.Course.Should().BeEquivalentTo(coursesApiResponse);
        }
        public async Task Then_Gets_Epaos_From_Assessors_Api_And_Course_From_Courses_Api_And_Filters_Epaos(
            GetCourseEpaosQuery query,
            List <GetCourseEpaoListItem> epaoApiResponse,
            GetStandardsListItem coursesApiResponse,
            IEnumerable <GetStandardsExtendedListItem> standardsResponse,
            [Frozen] Mock <IAssessorsApiClient <AssessorsApiConfiguration> > mockAssessorsApiClient,
            [Frozen] Mock <ICoursesApiClient <CoursesApiConfiguration> > mockCoursesApiClient,
            [Frozen] Mock <ICourseEpaoIsValidFilterService> mockCourseEpaoFilter,
            GetCourseEpaosQueryHandler handler)
        {
            mockAssessorsApiClient
            .Setup(client => client.GetAll <GetCourseEpaoListItem>(
                       It.Is <GetCourseEpaosRequest>(request => request.CourseId == query.CourseId)))
            .ReturnsAsync(epaoApiResponse);

            mockCoursesApiClient
            .Setup(client => client.Get <GetStandardsListItem>(
                       It.Is <GetStandardRequest>(request => request.StandardId == query.CourseId)))
            .ReturnsAsync(coursesApiResponse);

            foreach (var epao in epaoApiResponse)
            {
                mockAssessorsApiClient
                .Setup(client => client.Get <IEnumerable <GetStandardsExtendedListItem> >(
                           It.Is <GetCourseEpaosStandardVersionsRequest>(request => request.LarsCode == query.CourseId &&
                                                                         request.organisationId == epao.EpaoId)))
                .ReturnsAsync(standardsResponse);
            }

            mockCourseEpaoFilter
            .Setup(service => service.IsValidCourseEpao(It.Is <GetCourseEpaoListItem>(item => item.EpaoId == epaoApiResponse[0].EpaoId)))
            .Returns(true);
            mockCourseEpaoFilter
            .Setup(service => service.ValidateEpaoStandardDates(It.IsAny <DateTime>(), It.IsAny <DateTime>(), It.IsAny <DateTime>()))
            .Returns(true);
            mockCourseEpaoFilter
            .Setup(service => service.ValidateVersionDates(It.IsAny <DateTime>(), It.IsAny <DateTime>(), It.IsAny <DateTime>()))
            .Returns(true);

            var result = await handler.Handle(query, CancellationToken.None);

            result.Epaos.Select(x => x.CourseEpaoDetails.StandardVersions)
            .FirstOrDefault().Should().BeEquivalentTo(standardsResponse.Select(x => x.Version));
            result.Epaos.Should().BeEquivalentTo(epaoApiResponse.Where(item => item.EpaoId == epaoApiResponse[0].EpaoId).ToList());
            result.Epaos.Should().BeInAscendingOrder(item => item.Name);
            result.Course.Should().BeEquivalentTo(coursesApiResponse);
        }
        public async Task And_Query_InValid_Then_Throws_ValidationException(
            GetCourseEpaosQuery query,
            string propertyName,
            ValidationResult validationResult,
            [Frozen] Mock <IValidator <GetCourseEpaosQuery> > mockValidator,
            GetCourseEpaosQueryHandler handler)
        {
            validationResult.AddError(propertyName);
            mockValidator
            .Setup(validator => validator.ValidateAsync(query))
            .ReturnsAsync(validationResult);

            var act = new Func <Task>(async() => await handler.Handle(query, CancellationToken.None));

            act.Should().Throw <ValidationException>()
            .WithMessage($"*{propertyName}*");
        }
        public async Task If_No_Valid_Standards_Found_Returns_Zero_Epaos(
            GetCourseEpaosQuery query,
            List <GetCourseEpaoListItem> epaoApiResponse,
            GetStandardsListItem coursesApiResponse,
            IEnumerable <GetStandardsExtendedListItem> standardsResponse,
            [Frozen] Mock <IAssessorsApiClient <AssessorsApiConfiguration> > mockAssessorsApiClient,
            [Frozen] Mock <ICoursesApiClient <CoursesApiConfiguration> > mockCoursesApiClient,
            [Frozen] Mock <ICourseEpaoIsValidFilterService> mockCourseEpaoFilter,
            GetCourseEpaosQueryHandler handler)
        {
            mockAssessorsApiClient
            .Setup(client => client.GetAll <GetCourseEpaoListItem>(
                       It.Is <GetCourseEpaosRequest>(request => request.CourseId == query.CourseId)))
            .ReturnsAsync(epaoApiResponse);
            mockCoursesApiClient
            .Setup(client => client.Get <GetStandardsListItem>(
                       It.Is <GetStandardRequest>(request => request.StandardId == query.CourseId)))
            .ReturnsAsync(coursesApiResponse);
            foreach (var epao in epaoApiResponse)
            {
                mockAssessorsApiClient
                .Setup(client => client.Get <IEnumerable <GetStandardsExtendedListItem> >(
                           It.Is <GetCourseEpaosStandardVersionsRequest>(request => request.LarsCode == query.CourseId &&
                                                                         request.organisationId == epao.EpaoId)))
                .ReturnsAsync(standardsResponse);
            }
            mockCourseEpaoFilter
            .Setup(service => service.IsValidCourseEpao(It.IsAny <GetCourseEpaoListItem>()))
            .Returns(true);
            mockCourseEpaoFilter
            .Setup(service => service.ValidateVersionDates(It.IsAny <DateTime>(), It.IsAny <DateTime>(), It.IsAny <DateTime>()))
            .Returns(false);

            var result = await handler.Handle(query, CancellationToken.None);

            result.Epaos.Should().BeEmpty();
        }