public async Task Then_If_There_Is_No_Course_Or_Provider_Then_Not_Found_Returned(
            int standardCode,
            int providerId,
            string location,
            double lat,
            double lon,
            Guid?shortlistUserId,
            GetTrainingCourseProviderResult mediatorResult,
            [Frozen] Mock <IMediator> mockMediator,
            [Greedy] TrainingCoursesController controller)
        {
            mediatorResult.ProviderStandard         = null;
            mediatorResult.Course                   = null;
            mediatorResult.TotalProviders           = 0;
            mediatorResult.TotalProvidersAtLocation = 0;
            mockMediator
            .Setup(mediator => mediator.Send(
                       It.Is <GetTrainingCourseProviderQuery>(
                           c
                           => c.CourseId.Equals(standardCode) &&
                           c.ProviderId.Equals(providerId) &&
                           c.Location.Equals(location) &&
                           c.Lat.Equals(lat) &&
                           c.Lon.Equals(lon) &&
                           c.ShortlistUserId.Equals(shortlistUserId)
                           ),
                       It.IsAny <CancellationToken>()))
            .ReturnsAsync(mediatorResult);

            var controllerResult = await controller.GetProviderCourse(standardCode, providerId, location, lat, lon, shortlistUserId) as StatusCodeResult;

            Assert.IsNotNull(controllerResult);
            controllerResult.StatusCode.Should().Be((int)HttpStatusCode.NotFound);
        }
        public GetProviderCourseItem Map(GetTrainingCourseProviderResult source, string sectorSubjectArea, int level, bool hasLocation)
        {
            var achievementRate            = GetAchievementRateItem(source.ProviderStandard.AchievementRates, sectorSubjectArea, level);
            var nationalRate               = GetAchievementRateItem(source.OverallAchievementRates, sectorSubjectArea, level);
            var deliveryModes              = FilterDeliveryModes(source.ProviderStandard.DeliveryTypes);
            var employerFeedbackResponse   = EmployerFeedbackResponse(source.ProviderStandard.EmployerFeedback);
            var apprenticeFeedbackResponse = ApprenticeFeedbackResponse(source.ProviderStandard.ApprenticeFeedback);

            return(new GetProviderCourseItem
            {
                ProviderAddress = new GetProviderAddress().Map(source.ProviderStandard.ProviderAddress, hasLocation),
                Website = source.ProviderStandard.StandardInfoUrl,
                Phone = source.ProviderStandard.Phone,
                Email = source.ProviderStandard.Email,
                Name = source.ProviderStandard.Name,
                TradingName = source.ProviderStandard.TradingName,
                MarketingInfo = source.ProviderStandard.MarketingInfo,
                ProviderId = source.ProviderStandard.Ukprn,
                OverallCohort = achievementRate?.OverallCohort,
                NationalOverallCohort = nationalRate?.OverallCohort,
                OverallAchievementRate = achievementRate?.OverallAchievementRate,
                NationalOverallAchievementRate = nationalRate?.OverallAchievementRate,
                DeliveryModes = deliveryModes,
                EmployerFeedback = employerFeedbackResponse,
                ApprenticeFeedback = apprenticeFeedbackResponse,
                ShortlistId = source.ProviderStandard.ShortlistId
            });
        }
        public async Task Then_Gets_Training_Course_And_Providers_From_Mediator(
            int standardCode,
            int providerId,
            string location,
            double lat,
            double lon,
            Guid?shortlistUserId,
            GetTrainingCourseProviderResult mediatorResult,
            [Frozen] Mock <IMediator> mockMediator,
            [Greedy] TrainingCoursesController controller)
        {
            mockMediator
            .Setup(mediator => mediator.Send(
                       It.Is <GetTrainingCourseProviderQuery>(
                           c
                           => c.CourseId.Equals(standardCode) &&
                           c.ProviderId.Equals(providerId) &&
                           c.Location.Equals(location) &&
                           c.Lat.Equals(lat) &&
                           c.Lon.Equals(lon) &&
                           c.ShortlistUserId.Equals(shortlistUserId)
                           ),
                       It.IsAny <CancellationToken>()))
            .ReturnsAsync(mediatorResult);

            var controllerResult = await controller.GetProviderCourse(standardCode, providerId, location, lat, lon, shortlistUserId) as ObjectResult;

            Assert.IsNotNull(controllerResult);
            controllerResult.StatusCode.Should().Be((int)HttpStatusCode.OK);
            var model = controllerResult.Value as GetTrainingCourseProviderResponse;

            Assert.IsNotNull(model);
            model.TrainingCourse.Should().BeEquivalentTo((GetTrainingCourseListItem)mediatorResult.Course);
            model.TrainingCourseProvider.Should()
            .BeEquivalentTo(mediatorResult.ProviderStandard,
                            options => options
                            .Excluding(c => c.StandardInfoUrl)
                            .Excluding(c => c.StandardId)
                            .Excluding(c => c.AchievementRates)
                            .Excluding(c => c.Ukprn)
                            .Excluding(c => c.DeliveryTypes)
                            .Excluding(c => c.EmployerFeedback)
                            .Excluding(c => c.ApprenticeFeedback)
                            .Excluding(c => c.ProviderAddress)
                            );

            model.AdditionalCourses.Courses.Should().BeEquivalentTo(mediatorResult.AdditionalCourses);
            model.TrainingCourse.Should().NotBeNull();
            model.TrainingCourse.Id.Should().Be(mediatorResult.Course.LarsCode);
            model.ProvidersCount.ProvidersAtLocation.Should().Be(mediatorResult.TotalProvidersAtLocation);
            model.ProvidersCount.TotalProviders.Should().Be(mediatorResult.TotalProviders);
            model.Location.Location.GeoPoint.Should().BeEquivalentTo(mediatorResult.Location.GeoPoint);
            model.Location.Name.Should().Be(mediatorResult.Location.Name);
            model.TrainingCourseProvider.EmployerFeedback.Should().NotBeNull();
            model.TrainingCourseProvider.ApprenticeFeedback.Should().NotBeNull();
            model.TrainingCourseProvider.ProviderAddress.Should().BeEquivalentTo(mediatorResult.ProviderStandard.ProviderAddress);
            model.ShortlistItemCount.Should().Be(mediatorResult.ShortlistItemCount);
        }
        public async Task Then_If_There_Is_No_Provider_For_That_Standard_Then_Null_Is_Returned(
            int standardCode,
            int providerId,
            string location,
            double lat,
            double lon,
            GetTrainingCourseProviderResult mediatorResult,
            [Frozen] Mock <IMediator> mockMediator,
            [Greedy] TrainingCoursesController controller)
        {
            mediatorResult.ProviderStandard         = null;
            mediatorResult.TotalProviders           = 0;
            mediatorResult.TotalProvidersAtLocation = 0;
            mockMediator
            .Setup(mediator => mediator.Send(
                       It.Is <GetTrainingCourseProviderQuery>(
                           c
                           => c.CourseId.Equals(standardCode) &&
                           c.ProviderId.Equals(providerId) &&
                           c.Location.Equals(location) &&
                           c.Lat.Equals(lat) &&
                           c.Lon.Equals(lon)
                           ),
                       It.IsAny <CancellationToken>()))
            .ReturnsAsync(mediatorResult);

            var controllerResult = await controller.GetProviderCourse(standardCode, providerId, location, lat, lon) as ObjectResult;

            Assert.IsNotNull(controllerResult);
            controllerResult.StatusCode.Should().Be((int)HttpStatusCode.OK);
            var model = controllerResult.Value as GetTrainingCourseProviderResponse;

            Assert.IsNotNull(model);
            model.TrainingCourse.Should().NotBeNull();
            model.Location.Should().NotBeNull();
            model.TrainingCourseProvider.Should().BeNull();
        }
        public void Then_The_Fields_Are_Mapped(GetTrainingCourseProviderResult providerStandardItem)
        {
            providerStandardItem.ProviderStandard.FeedbackRatings = new List <GetFeedbackRatingItem>
            {
                new GetFeedbackRatingItem
                {
                    FeedbackName  = "Good",
                    FeedbackCount = 92,
                },
                new GetFeedbackRatingItem
                {
                    FeedbackName  = "Excellent",
                    FeedbackCount = 29,
                },
                new GetFeedbackRatingItem
                {
                    FeedbackName  = "Poor",
                    FeedbackCount = 7,
                },
                new GetFeedbackRatingItem
                {
                    FeedbackName  = "Very Poor",
                    FeedbackCount = 1,
                }
            };
            var actual = new GetProviderCourseItem().Map(providerStandardItem, "", 1, true);

            actual.Should().BeEquivalentTo(providerStandardItem.Course, options => options.ExcludingMissingMembers());

            actual.Website.Should().Be(providerStandardItem.ProviderStandard.StandardInfoUrl);
            actual.ProviderId.Should().Be(providerStandardItem.ProviderStandard.Ukprn);
            actual.ProviderAddress.Should().BeEquivalentTo(providerStandardItem.ProviderStandard.ProviderAddress);
            actual.Feedback.TotalEmployerResponses.Should().Be(129);
            actual.Feedback.TotalFeedbackRating.Should().Be(3);
            actual.MarketingInfo.Should().Be(providerStandardItem.ProviderStandard.MarketingInfo);
        }
        public void Then_Maps_Fields_Appropriately_Matching_AchievementRates_With_Sector_And_Level_Higher_Than_Three(string sectorSubjectArea,
                                                                                                                     GetTrainingCourseProviderResult source, GetAchievementRateItem item, GetAchievementRateItem item2)
        {
            item.SectorSubjectArea = sectorSubjectArea;
            item.Level             = "AllLevels";
            source.ProviderStandard.AchievementRates = new List <GetAchievementRateItem>
            {
                item,
                item2
            };

            var response = new GetProviderCourseItem().Map(source, sectorSubjectArea, 5, true);

            response.Name.Should().Be(source.ProviderStandard.Name);
            response.TradingName.Should().Be(source.ProviderStandard.TradingName);
            response.ProviderId.Should().Be(source.ProviderStandard.Ukprn);
            response.OverallCohort.Should().Be(item.OverallCohort);
            response.OverallAchievementRate.Should().Be(item.OverallAchievementRate);
        }
        public void Then_Maps_Fields_Appropriately_Returning_Null_For_AchievementRate_Data_If_No_Matching_No_AchievementRates(string sectorSubjectArea,
                                                                                                                              GetTrainingCourseProviderResult source, GetAchievementRateItem item, GetAchievementRateItem item2)
        {
            source.ProviderStandard.AchievementRates = new List <GetAchievementRateItem>
            {
                item,
                item2
            };
            source.OverallAchievementRates = new List <GetAchievementRateItem>
            {
                item,
                item2
            };

            var response = new GetProviderCourseItem().Map(source, sectorSubjectArea, 1, true);

            response.Name.Should().Be(source.ProviderStandard.Name);
            response.TradingName.Should().Be(source.ProviderStandard.TradingName);
            response.ProviderId.Should().Be(source.ProviderStandard.Ukprn);
            response.OverallCohort.Should().BeNull();
            response.NationalOverallCohort.Should().BeNull();
            response.OverallAchievementRate.Should().BeNull();
            response.NationalOverallAchievementRate.Should().BeNull();
        }