public async Task <SearchApprenticeshipsResult> SearchApprenticeships(SearchApprenticeshipsRequest request, CancellationToken token)
        {
            try
            {
                CommitmentsV2.Types.ApprenticeshipStatus?status = null;
                if (int.TryParse(request.ApprenticeshipStatus, out var statusInt))
                {
                    status = (CommitmentsV2.Types.ApprenticeshipStatus)statusInt;
                }

                var result = await _commitmentApi.GetApprenticeships(new GetApprenticeshipsRequest
                {
                    CourseName    = request.CourseName,
                    EmployerName  = request.EmployerName,
                    ProviderName  = request.ProviderName,
                    ProviderId    = request.Ukprn,
                    SearchTerm    = request.SearchTerm,
                    StartDate     = request.StartDate,
                    EndDate       = request.EndDate,
                    Status        = status,
                    PageNumber    = 1,
                    PageItemCount = 99_999 //HACK: The CommitmentsV2 API has a "DownLoad" limit applied to it when you ask for page 0 that returns only apprenticeships with an EndDate within the last 12 months. This hack circumvents having that limit applied
                }, token);

                return(new SearchApprenticeshipsResult
                {
                    Apprenticeships = _mapper.Map <IEnumerable <GetApprenticeshipsResponse.ApprenticeshipDetailsResponse>, List <ApprenticeshipDto> >(result.Apprenticeships),
                    ResultCount = result.TotalApprenticeshipsFound
                });
            }
        public async Task SearchApprenticeships_ReturnsSearchResults_WhenApiCallSucceeds([Frozen] Mock <ICommitmentsApiClient> apiClient, EmployerCommitmentsService sut, SearchApprenticeshipsRequest request, GetApprenticeshipsResponse response)
        {
            //Given
            apiClient.Setup(s => s.GetApprenticeships(It.Is <GetApprenticeshipsRequest>(s =>
                                                                                        s.CourseName == request.CourseName &&
                                                                                        s.EmployerName == request.EmployerName &&
                                                                                        s.ProviderName == request.ProviderName &&
                                                                                        s.ProviderId == request.Ukprn &&
                                                                                        s.SearchTerm == request.SearchTerm &&
                                                                                        s.StartDate == request.StartDate &&
                                                                                        s.EndDate == request.EndDate)
                                                      , It.IsAny <CancellationToken>())).ReturnsAsync(response);

            //When
            var result = await sut.SearchApprenticeships(request, new CancellationToken());

            //Then
            result.HasError.Should().BeFalse();
            result.Apprenticeships.Count.Should().Be(response.Apprenticeships.Count());
            result.Apprenticeships.Should().BeEquivalentTo(response.Apprenticeships.
                                                           Select(s => new
            {
                s.ApprenticeshipStatus,
                s.EndDate,
                s.StartDate,
                s.CourseName,
                s.ProviderName,
                Ukprn = s.ProviderId,
                s.EmployerName,
                s.Uln,
                s.LastName,
                s.FirstName,
                s.Id,
                s.AccountLegalEntityId,
                s.ProviderRef,
                s.EmployerRef,
                s.DateOfBirth,
                s.PauseDate,
                s.CohortReference
            }));
        }
        public async Task SearchApprenticeships_ReturnsErrorMessage_WhenApiCallFails([Frozen] Mock <ICommitmentsApiClient> apiClient, EmployerCommitmentsService sut, SearchApprenticeshipsRequest request, List <ErrorDetail> errors)
        {
            //Given
            apiClient.Setup(s => s.GetApprenticeships(It.Is <GetApprenticeshipsRequest>(s =>
                                                                                        s.CourseName == request.CourseName &&
                                                                                        s.EmployerName == request.EmployerName &&
                                                                                        s.ProviderName == request.ProviderName &&
                                                                                        s.ProviderId == request.Ukprn &&
                                                                                        s.SearchTerm == request.SearchTerm &&
                                                                                        s.StartDate == request.StartDate &&
                                                                                        s.EndDate == request.EndDate)
                                                      , It.IsAny <CancellationToken>())).Throws(new CommitmentsApiModelException(errors));

            //When
            var result = await sut.SearchApprenticeships(request, new CancellationToken());

            //Then
            var errorMessage = GetErrorMessages(errors);

            result.ErrorMessage.Should().Be(errorMessage);
        }