public async Task <IActionResult> FindVacancy(FindVacancyEditModel m)
        {
            if (ModelState.IsValid)
            {
                var result = await _orchestrator.PostFindVacancyEditModelAsync(m);

                TempData[TempDataKeys.WithdrawVacancyReference] = result.VacancyReference;

                switch (result.ResultType)
                {
                case PostFindVacancyEditModelResultType.AlreadyClosed:
                    return(RedirectToRoute(RouteNames.WithdrawVacancy_AlreadyClosed_Get, result.VacancyReference.Value));

                case PostFindVacancyEditModelResultType.CanClose:
                    return(RedirectToRoute(RouteNames.WithdrawVacancy_Confirm_Get, result.VacancyReference.Value));

                case PostFindVacancyEditModelResultType.NotFound:
                    ModelState.AddModelError(nameof(FindVacancyViewModel.VacancyReference), $"There are no live vacancies with the reference '{m.VacancyReference}'");
                    break;

                case PostFindVacancyEditModelResultType.NotLive:
                    ModelState.AddModelError(nameof(FindVacancyViewModel.VacancyReference), $"There are no live vacancies with the reference 'VAC{result.VacancyReference}'");
                    break;

                default:
                    throw new NotImplementedException($"{result.ResultType.ToString()} is not handled");
                }
            }

            var vm = _orchestrator.GetFindVacancyViewModel(m);

            return(View(vm));
        }
        public FindVacancyViewModel GetFindVacancyViewModel(FindVacancyEditModel m)
        {
            var vm = GetFindVacancyViewModel();

            vm.VacancyReference = m.VacancyReference;

            return(vm);
        }
        public async Task ShouldReturnNotFoundIfVacancyDoesNotExist()
        {
            _clientMock.Setup(c => c.GetVacancyAsync(VacancyReference))
            .ThrowsAsync(new VacancyNotFoundException("not found"));

            var orch = _sut;

            var m = new FindVacancyEditModel
            {
                VacancyReference = VacancyReference.ToString()
            };

            var result = await orch.PostFindVacancyEditModelAsync(m);

            result.ResultType.Should().Be(PostFindVacancyEditModelResultType.NotFound);
        }
        public async Task ShouldReturnCanCloseIfVacancyCanBeClosed()
        {
            _clientMock.Setup(c => c.GetVacancyAsync(VacancyReference))
            .ReturnsAsync(new Vacancy {
                Status = VacancyStatus.Live
            });

            var orch = _sut;

            var m = new FindVacancyEditModel
            {
                VacancyReference = VacancyReference.ToString()
            };

            var result = await orch.PostFindVacancyEditModelAsync(m);

            result.ResultType.Should().Be(PostFindVacancyEditModelResultType.CanClose);
        }
        public async Task ShouldReturnNotLiveIfVacancyExistsAndIsNotLive(VacancyStatus status)
        {
            _clientMock.Setup(c => c.GetVacancyAsync(VacancyReference))
            .ReturnsAsync(new Vacancy {
                Status = status
            });

            var orch = _sut;

            var m = new FindVacancyEditModel
            {
                VacancyReference = VacancyReference.ToString()
            };

            var result = await orch.PostFindVacancyEditModelAsync(m);

            result.ResultType.Should().Be(PostFindVacancyEditModelResultType.NotLive);
        }
        public async Task <PostFindVacancyEditModelResult> PostFindVacancyEditModelAsync(FindVacancyEditModel m)
        {
            var vacancyReference = m.VacancyReference.ToUpper().Replace("VAC", "");

            Vacancy vacancy = null;

            if (long.TryParse(vacancyReference, out var vacancyReferenceNumber))
            {
                vacancy = await GetVacancyAsync(vacancyReferenceNumber);
            }

            if (vacancy != null && vacancy.CanClose)
            {
                return new PostFindVacancyEditModelResult {
                           ResultType = PostFindVacancyEditModelResultType.CanClose, VacancyReference = vacancy.VacancyReference
                }
            }
            ;

            if (vacancy != null && vacancy.Status == VacancyStatus.Closed)
            {
                return new PostFindVacancyEditModelResult {
                           ResultType = PostFindVacancyEditModelResultType.AlreadyClosed, VacancyReference = vacancy.VacancyReference
                }
            }
            ;

            if (vacancy != null && vacancy.Status != VacancyStatus.Live)
            {
                return new PostFindVacancyEditModelResult {
                           ResultType = PostFindVacancyEditModelResultType.NotLive, VacancyReference = vacancy.VacancyReference
                }
            }
            ;

            return(new PostFindVacancyEditModelResult {
                ResultType = PostFindVacancyEditModelResultType.NotFound
            });
        }