public async Task Then_If_There_Is_A_Location_Supplied_It_Is_Searched_And_Passed_To_The_Provider_Search(
            string locationName,
            string authorityName,
            GetTrainingCourseProvidersQuery query,
            GetProvidersListResponse apiResponse,
            IEnumerable <GetApprenticeFeedbackResponse> apprenticeFeedbackResponse,
            GetStandardsListItem apiCourseResponse,
            LocationItem locationServiceResponse,
            [Frozen] Mock <ILocationLookupService> mockLocationLookupService,
            [Frozen] Mock <ICoursesApiClient <CoursesApiConfiguration> > mockCoursesApiClient,
            [Frozen] Mock <ICourseDeliveryApiClient <CourseDeliveryApiConfiguration> > mockApiClient,
            [Frozen] Mock <IApprenticeFeedbackApiClient <ApprenticeFeedbackApiConfiguration> > mockApprenticeFeedbackApiClient,
            GetTrainingCourseProvidersQueryHandler handler)
        {
            query.Location = $"{locationName}, {authorityName} ";
            query.Lat      = 0;
            query.Lon      = 0;

            var providerUkprns = apiResponse.Providers.Select(s => s.Ukprn);

            for (var i = 0; i < apprenticeFeedbackResponse.Count(); i++)
            {
                apprenticeFeedbackResponse.ToArray()[i].Ukprn = providerUkprns.ToArray()[i];
            }

            mockLocationLookupService
            .Setup(service => service.GetLocationInformation(query.Location, query.Lat, query.Lon, false))
            .ReturnsAsync(locationServiceResponse);
            mockApiClient
            .Setup(client => client.Get <GetProvidersListResponse>(It.Is <GetProvidersByCourseRequest>(c =>
                                                                                                       c.GetUrl.Contains(query.Id.ToString()) &&
                                                                                                       c.GetUrl.Contains(locationServiceResponse.GeoPoint.First().ToString()) &&
                                                                                                       c.GetUrl.Contains(locationServiceResponse.GeoPoint.Last().ToString()) &&
                                                                                                       c.GetUrl.Contains($"&sortOrder={query.SortOrder}")
                                                                                                       )))
            .ReturnsAsync(apiResponse);
            mockCoursesApiClient
            .Setup(client => client.Get <GetStandardsListItem>(It.Is <GetStandardRequest>(c => c.GetUrl.Contains(query.Id.ToString()))))
            .ReturnsAsync(apiCourseResponse);
            mockApprenticeFeedbackApiClient
            .Setup(s => s.PostWithResponseCode <IEnumerable <GetApprenticeFeedbackResponse> >(It.Is <PostApprenticeFeedbackRequest>
                                                                                                  (t =>
                                                                                                  ((PostApprenticeFeedbackRequestData)t.Data).Ukprns.Except(apiResponse.Providers.Select(s => s.Ukprn)).Count() == 0 &&
                                                                                                  apiResponse.Providers.Select(s => s.Ukprn).Except(((PostApprenticeFeedbackRequestData)t.Data).Ukprns).Count() == 0
                                                                                                  ))).ReturnsAsync(new ApiResponse <IEnumerable <GetApprenticeFeedbackResponse> >(apprenticeFeedbackResponse, HttpStatusCode.OK, string.Empty));

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

            result.Providers.Should().BeEquivalentTo(apiResponse.Providers, options => options.Excluding(s => s.ApprenticeFeedback));
            result.Total.Should().Be(apiResponse.TotalResults);
            result.Course.Should().BeEquivalentTo(apiCourseResponse);
            result.Location.Name.Should().Be(locationServiceResponse.Name);
            result.Location.GeoPoint.Should().BeEquivalentTo(locationServiceResponse.GeoPoint);

            foreach (var provider in result.Providers)
            {
                provider.ApprenticeFeedback.Should().BeEquivalentTo(apprenticeFeedbackResponse.First(s => s.Ukprn == provider.Ukprn));
            }
        }
        public async Task Then_Gets_The_Standard_And_The_List_Of_Providers_For_That_Course_From_Course_Delivery_Api_Client_With_No_Location_And_ShortlistItem_Count(
            GetTrainingCourseProvidersQuery query,
            GetProvidersListResponse apiResponse,
            GetStandardsListItem apiCourseResponse,
            IEnumerable <GetApprenticeFeedbackResponse> apprenticeFeedbackResponse,
            int shortlistItemCount,
            [Frozen] Mock <ICoursesApiClient <CoursesApiConfiguration> > mockCoursesApiClient,
            [Frozen] Mock <ICourseDeliveryApiClient <CourseDeliveryApiConfiguration> > mockApiClient,
            [Frozen] Mock <IApprenticeFeedbackApiClient <ApprenticeFeedbackApiConfiguration> > mockApprenticeFeedbackApiClient,
            [Frozen] Mock <IShortlistService> shortlistService,
            [Frozen] Mock <ILocationLookupService> mockLocationLookup,
            GetTrainingCourseProvidersQueryHandler handler)
        {
            apiCourseResponse.Level = 1;
            query.Location          = "";
            query.Lat = 0;
            query.Lon = 0;

            var providerUkprns = apiResponse.Providers.Select(s => s.Ukprn);

            for (var i = 0; i < apprenticeFeedbackResponse.Count(); i++)
            {
                apprenticeFeedbackResponse.ToArray()[i].Ukprn = providerUkprns.ToArray()[i];
            }

            mockApiClient
            .Setup(client => client.Get <GetProvidersListResponse>(It.Is <GetProvidersByCourseRequest>(c =>
                                                                                                       c.GetUrl.Contains(query.Id.ToString()) &&
                                                                                                       c.GetUrl.Contains($"sectorSubjectArea={apiCourseResponse.SectorSubjectAreaTier2Description}&level={apiCourseResponse.Level}")
                                                                                                       )))
            .ReturnsAsync(apiResponse);
            mockCoursesApiClient
            .Setup(client => client.Get <GetStandardsListItem>(It.Is <GetStandardRequest>(c => c.GetUrl.Contains(query.Id.ToString()))))
            .ReturnsAsync(apiCourseResponse);
            shortlistService.Setup(x => x.GetShortlistItemCount(query.ShortlistUserId))
            .ReturnsAsync(shortlistItemCount);
            mockLocationLookup
            .Setup(service => service.GetLocationInformation(query.Location, query.Lat, query.Lon, false))
            .ReturnsAsync((LocationItem)null);
            mockApprenticeFeedbackApiClient
            .Setup(s => s.PostWithResponseCode <IEnumerable <GetApprenticeFeedbackResponse> >(It.Is <PostApprenticeFeedbackRequest>
                                                                                                  (t =>
                                                                                                  ((PostApprenticeFeedbackRequestData)t.Data).Ukprns.Except(apiResponse.Providers.Select(s => s.Ukprn)).Count() == 0 &&
                                                                                                  apiResponse.Providers.Select(s => s.Ukprn).Except(((PostApprenticeFeedbackRequestData)t.Data).Ukprns).Count() == 0
                                                                                                  ))).ReturnsAsync(new ApiResponse <IEnumerable <GetApprenticeFeedbackResponse> >(apprenticeFeedbackResponse, HttpStatusCode.OK, string.Empty));

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

            result.Providers.Should().BeEquivalentTo(apiResponse.Providers, options => options.Excluding(s => s.ApprenticeFeedback));
            result.Total.Should().Be(apiResponse.TotalResults);
            result.Course.Should().BeEquivalentTo(apiCourseResponse);
            result.ShortlistItemCount.Should().Be(shortlistItemCount);
            result.Location.Should().BeNull();

            foreach (var provider in result.Providers)
            {
                provider.ApprenticeFeedback.Should().BeEquivalentTo(apprenticeFeedbackResponse.First(s => s.Ukprn == provider.Ukprn));
            }
        }
        public async Task Then_Gets_The_Standard_And_The_List_Of_Providers_For_That_Course_From_Course_Delivery_Api_Client_With_No_Location_And_ShortlistItem_Count(
            GetTrainingCourseProvidersQuery query,
            GetProvidersListResponse apiResponse,
            GetStandardsListItem apiCourseResponse,
            GetShowEmployerDemandResponse showEmployerDemandResponse,
            int shortlistItemCount,
            [Frozen] Mock <IOptions <FindApprenticeshipTrainingConfiguration> > config,
            [Frozen] Mock <ICoursesApiClient <CoursesApiConfiguration> > mockCoursesApiClient,
            [Frozen] Mock <ICourseDeliveryApiClient <CourseDeliveryApiConfiguration> > mockApiClient,
            [Frozen] Mock <IEmployerDemandApiClient <EmployerDemandApiConfiguration> > mockEmployerDemandApiClient,
            [Frozen] Mock <IShortlistService> shortlistService,
            [Frozen] Mock <ILocationLookupService> mockLocationLookup,
            GetTrainingCourseProvidersQueryHandler handler)
        {
            config.Object.Value.EmployerDemandFeatureToggle = true;
            apiCourseResponse.Level = 1;
            query.Location          = "";
            query.Lat = 0;
            query.Lon = 0;
            mockApiClient
            .Setup(client => client.Get <GetProvidersListResponse>(It.Is <GetProvidersByCourseRequest>(c =>
                                                                                                       c.GetUrl.Contains(query.Id.ToString()) &&
                                                                                                       c.GetUrl.Contains($"sectorSubjectArea={apiCourseResponse.SectorSubjectAreaTier2Description}&level={apiCourseResponse.Level}")
                                                                                                       )))
            .ReturnsAsync(apiResponse);
            mockCoursesApiClient
            .Setup(client => client.Get <GetStandardsListItem>(It.Is <GetStandardRequest>(c => c.GetUrl.Contains(query.Id.ToString()))))
            .ReturnsAsync(apiCourseResponse);
            mockEmployerDemandApiClient
            .Setup(client => client.GetResponseCode(It.IsAny <GetShowEmployerDemandRequest>()))
            .ReturnsAsync(HttpStatusCode.OK);
            shortlistService.Setup(x => x.GetShortlistItemCount(query.ShortlistUserId))
            .ReturnsAsync(shortlistItemCount);
            mockLocationLookup
            .Setup(service => service.GetLocationInformation(query.Location, query.Lat, query.Lon))
            .ReturnsAsync((LocationItem)null);

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

            result.Providers.Should().BeEquivalentTo(apiResponse.Providers);
            result.Total.Should().Be(apiResponse.TotalResults);
            result.Course.Should().BeEquivalentTo(apiCourseResponse);
            result.ShowEmployerDemand.Should().BeTrue();
            result.ShortlistItemCount.Should().Be(shortlistItemCount);
            result.Location.Should().BeNull();
        }
        public async Task Then_If_There_Is_A_Location_Supplied_It_Is_Searched_And_Passed_To_The_Provider_Search(
            string locationName,
            string authorityName,
            GetTrainingCourseProvidersQuery query,
            GetProvidersListResponse apiResponse,
            GetStandardsListItem apiCourseResponse,
            LocationItem locationServiceResponse,
            [Frozen] Mock <IOptions <FindApprenticeshipTrainingConfiguration> > config,
            [Frozen] Mock <ILocationLookupService> mockLocationLookupService,
            [Frozen] Mock <ICoursesApiClient <CoursesApiConfiguration> > mockCoursesApiClient,
            [Frozen] Mock <ICourseDeliveryApiClient <CourseDeliveryApiConfiguration> > mockApiClient,
            GetTrainingCourseProvidersQueryHandler handler)
        {
            config.Object.Value.EmployerDemandFeatureToggle = true;
            query.Location = $"{locationName}, {authorityName} ";
            query.Lat      = 0;
            query.Lon      = 0;

            mockLocationLookupService
            .Setup(service => service.GetLocationInformation(query.Location, query.Lat, query.Lon))
            .ReturnsAsync(locationServiceResponse);
            mockApiClient
            .Setup(client => client.Get <GetProvidersListResponse>(It.Is <GetProvidersByCourseRequest>(c =>
                                                                                                       c.GetUrl.Contains(query.Id.ToString()) &&
                                                                                                       c.GetUrl.Contains(locationServiceResponse.GeoPoint.First().ToString()) &&
                                                                                                       c.GetUrl.Contains(locationServiceResponse.GeoPoint.Last().ToString()) &&
                                                                                                       c.GetUrl.Contains($"&sortOrder={query.SortOrder}")
                                                                                                       )))
            .ReturnsAsync(apiResponse);
            mockCoursesApiClient
            .Setup(client => client.Get <GetStandardsListItem>(It.Is <GetStandardRequest>(c => c.GetUrl.Contains(query.Id.ToString()))))
            .ReturnsAsync(apiCourseResponse);

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

            result.Providers.Should().BeEquivalentTo(apiResponse.Providers);
            result.Total.Should().Be(apiResponse.TotalResults);
            result.Course.Should().BeEquivalentTo(apiCourseResponse);
            result.Location.Name.Should().Be(locationServiceResponse.Name);
            result.Location.GeoPoint.Should().BeEquivalentTo(locationServiceResponse.GeoPoint);
        }
        public async Task Then_Gets_The_Standard_And_The_List_Of_Providers_For_That_Course_From_Course_Delivery_Api_Client(
            GetTrainingCourseProvidersQuery query,
            GetProvidersListResponse apiResponse,
            GetStandardsListItem apiCourseResponse,
            [Frozen] Mock <ICoursesApiClient <CoursesApiConfiguration> > mockCoursesApiClient,
            [Frozen] Mock <ICourseDeliveryApiClient <CourseDeliveryApiConfiguration> > mockApiClient,
            GetTrainingCourseProvidersQueryHandler handler)
        {
            mockApiClient
            .Setup(client => client.Get <GetProvidersListResponse>(It.Is <GetProvidersByCourseRequest>(c => c.GetUrl.Contains(query.Id.ToString()))))
            .ReturnsAsync(apiResponse);
            mockCoursesApiClient
            .Setup(client => client.Get <GetStandardsListItem>(It.Is <GetStandardRequest>(c => c.GetUrl.Contains(query.Id.ToString()))))
            .ReturnsAsync(apiCourseResponse);

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

            result.Providers.Should().BeEquivalentTo(apiResponse.Providers);
            result.Total.Should().Be(apiResponse.TotalResults);
            result.Course.Should().BeEquivalentTo(apiCourseResponse);
        }
        public async Task And_If_Feature_Not_Enabled_For_Employer_Demand_Then_Show_Demand_False(
            GetTrainingCourseProvidersQuery query,
            GetProvidersListResponse apiResponse,
            GetStandardsListItem apiCourseResponse,
            int shortlistItemCount,
            [Frozen] Mock <IOptions <FindApprenticeshipTrainingConfiguration> > config,
            [Frozen] Mock <ICoursesApiClient <CoursesApiConfiguration> > mockCoursesApiClient,
            [Frozen] Mock <ICourseDeliveryApiClient <CourseDeliveryApiConfiguration> > mockApiClient,
            [Frozen] Mock <IEmployerDemandApiClient <EmployerDemandApiConfiguration> > mockEmployerDemandApiClient,
            [Frozen] Mock <IShortlistService> shortlistService,
            GetTrainingCourseProvidersQueryHandler handler)
        {
            config.Object.Value.EmployerDemandFeatureToggle = false;
            apiCourseResponse.Level = 1;
            query.Location          = "";
            query.Lat = 0;
            query.Lon = 0;
            mockApiClient
            .Setup(client => client.Get <GetProvidersListResponse>(It.Is <GetProvidersByCourseRequest>(c =>
                                                                                                       c.GetUrl.Contains(query.Id.ToString()) &&
                                                                                                       c.GetUrl.Contains($"sectorSubjectArea={apiCourseResponse.SectorSubjectAreaTier2Description}&level={apiCourseResponse.Level}")
                                                                                                       )))
            .ReturnsAsync(apiResponse);
            mockCoursesApiClient
            .Setup(client => client.Get <GetStandardsListItem>(It.Is <GetStandardRequest>(c => c.GetUrl.Contains(query.Id.ToString()))))
            .ReturnsAsync(apiCourseResponse);
            mockEmployerDemandApiClient
            .Setup(client => client.GetResponseCode(It.IsAny <GetShowEmployerDemandRequest>()))
            .ReturnsAsync(HttpStatusCode.Forbidden);
            shortlistService.Setup(x => x.GetShortlistItemCount(query.ShortlistUserId))
            .ReturnsAsync(shortlistItemCount);

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

            result.ShowEmployerDemand.Should().BeFalse();
            mockEmployerDemandApiClient
            .Verify(client => client.GetResponseCode(It.IsAny <GetShowEmployerDemandRequest>()), Times.Never);
        }