public async Task ShouldNotChangeEmployerDescriptionIfNotSpecifiedInCommand()
        {
            var expectedDescription = "initial description";
            var vacancy             = new Vacancy
            {
                Id = Guid.NewGuid(),
                EmployerDescription = expectedDescription,
                IsDeleted           = false,
                Status           = VacancyStatus.Draft,
                VacancyReference = 1234567890,
                TrainingProvider = new TrainingProvider
                {
                    Ukprn = 12345678
                }
            };

            vacancy.OwnerType = OwnerType.Provider;
            var user    = new VacancyUser();
            var now     = DateTime.Now;
            var message = new ReviewVacancyCommand(vacancy.Id, user, OwnerType.Provider);

            var sut = GetSut(vacancy.Id, vacancy, now);
            await sut.Handle(message, new CancellationToken());

            vacancy.Status.Should().Be(VacancyStatus.Review);
            vacancy.ReviewDate.Should().Be(now);
            vacancy.ReviewByUser.Should().Be(user);
            vacancy.ReviewCount.Should().Be(1);
            vacancy.LastUpdatedDate.Should().Be(now);
            vacancy.LastUpdatedByUser.Should().Be(user);
            vacancy.EmployerDescription.Should().Be(expectedDescription);
        }
        public async Task WhenVacancyNotFound_ShouldRaiseException()
        {
            var id   = Guid.NewGuid();
            var user = new VacancyUser();
            var now  = DateTime.Now;
            var expectedExceptionMessage = string.Format(ReviewVacancyCommandHandler.VacancyNotFoundExceptionMessageFormat, id);
            var message = new ReviewVacancyCommand(id, user, OwnerType.Provider);

            var sut       = GetSut(id, null, now);
            var exception = await Assert.ThrowsAsync <ArgumentException>(async() => await sut.Handle(message, new CancellationToken()));

            exception.Message.Should().Be(expectedExceptionMessage);
        }
        public async Task WhenOwnerHasChanged_ShouldRaiseException()
        {
            var vacancy = new Vacancy
            {
                Id = Guid.NewGuid(),
                EmployerDescription = "initial description",
                IsDeleted           = false,
                Status           = VacancyStatus.Draft,
                VacancyReference = 1234567890
            };

            vacancy.OwnerType = OwnerType.Employer;
            var user    = new VacancyUser();
            var now     = DateTime.Now;
            var message = new ReviewVacancyCommand(vacancy.Id, user, OwnerType.Provider);
            var expectedExceptionMessage = string.Format(ReviewVacancyCommandHandler.InvalidOwnerExceptionMessageFormat, vacancy.Id, message.SubmissionOwner, vacancy.OwnerType);

            var sut       = GetSut(vacancy.Id, vacancy, now);
            var exception = await Assert.ThrowsAsync <InvalidOperationException>(async() => await sut.Handle(message, new CancellationToken()));

            exception.Message.Should().Be(expectedExceptionMessage);
        }
        private async Task <SubmitVacancyResponse> SubmitActionAsync(Vacancy vacancy, VacancyUser user)
        {
            var hasLegalEntityAgreementTask = _legalEntityAgreementService.HasLegalEntityAgreementAsync(vacancy.EmployerAccountId, vacancy.AccountLegalEntityPublicHashedId);
            var hasProviderAgreementTask    = _trainingProviderAgreementService.HasAgreementAsync(vacancy.TrainingProvider.Ukprn.Value);

            await Task.WhenAll(hasLegalEntityAgreementTask, hasProviderAgreementTask);

            var hasProviderReviewPermission = await _providerRelationshipsService.HasProviderGotEmployersPermissionAsync(vacancy.TrainingProvider.Ukprn.Value, vacancy.EmployerAccountId, vacancy.AccountLegalEntityPublicHashedId, OperationType.RecruitmentRequiresReview);

            var response = new SubmitVacancyResponse
            {
                HasLegalEntityAgreement = hasLegalEntityAgreementTask.Result,
                HasProviderAgreement    = hasProviderAgreementTask.Result,
                IsSubmitted             = false
            };

            if (response.HasLegalEntityAgreement && response.HasProviderAgreement)
            {
                if (hasProviderReviewPermission)
                {
                    var command = new ReviewVacancyCommand(vacancy.Id, user, OwnerType.Provider);
                    await _messaging.SendCommandAsync(command);

                    response.IsSentForReview = true;
                }
                else
                {
                    var command = new SubmitVacancyCommand(vacancy.Id, user, OwnerType.Provider);
                    await _messaging.SendCommandAsync(command);

                    response.IsSubmitted = true;
                }
            }

            return(response);
        }