public async Task <ActionResult <CharacterAddJobResponse> > PostCharacterAddJobAsync( [FromServices] NaheulbookExecutionContext executionContext, [FromRoute] int characterId, CharacterAddJobRequest request ) { try { await _characterService.AddJobAsync(executionContext, characterId, request); return(new CharacterAddJobResponse { JobId = request.JobId }); } catch (CharacterAlreadyKnowThisJobException ex) { throw new HttpErrorException(StatusCodes.Status409Conflict, ex); } catch (JobNotFoundException ex) { throw new HttpErrorException(StatusCodes.Status400BadRequest, ex); } catch (ForbiddenAccessException ex) { throw new HttpErrorException(StatusCodes.Status403Forbidden, ex); } catch (CharacterNotFoundException ex) { throw new HttpErrorException(StatusCodes.Status404NotFound, ex); } }
public void AddJobAsync_AddNewJobToCharacterJobsAndNotifyIt() { const int characterId = 5; var jobId = Guid.NewGuid(); var executionContext = new NaheulbookExecutionContext(); var request = new CharacterAddJobRequest { JobId = jobId }; var character = new Character { Jobs = new List <CharacterJob>(), Id = characterId }; var job = new Job { Id = jobId }; _unitOfWorkFactory.GetUnitOfWork().Characters.GetWithOriginWithJobsAsync(characterId) .Returns(character); _unitOfWorkFactory.GetUnitOfWork().Jobs.GetAsync(jobId) .Returns(job); _unitOfWorkFactory.GetUnitOfWork().When(x => x.SaveChangesAsync()) .Do(_ => { character.Jobs.Should().HaveCount(1); character.Jobs.First().Job.Should().BeSameAs(job); }); _service.AddJobAsync(executionContext, characterId, request); Received.InOrder(() => { _notificationSessionFactory.NotificationSession.NotifyCharacterAddJob(characterId, jobId); _unitOfWorkFactory.GetUnitOfWork().SaveChangesAsync(); _notificationSessionFactory.NotificationSession.Received().CommitAsync(); }); }
public void AddJobAsync_WhenCharacterNotFound_Throw() { var jobId = Guid.NewGuid(); const int characterId = 5; var executionContext = new NaheulbookExecutionContext(); var request = new CharacterAddJobRequest { JobId = jobId }; _unitOfWorkFactory.GetUnitOfWork().Characters.GetWithOriginWithJobsAsync(characterId) .Returns((Character)null); Func <Task> act = () => _service.AddJobAsync(executionContext, characterId, request); act.Should().Throw <CharacterNotFoundException>(); }
public void AddJobAsync_EnsureCanAccessCharacter() { var jobId = Guid.NewGuid(); const int characterId = 5; var executionContext = new NaheulbookExecutionContext(); var request = new CharacterAddJobRequest { JobId = jobId }; var character = new Character { Jobs = new List <CharacterJob>(), Id = characterId }; _unitOfWorkFactory.GetUnitOfWork().Characters.GetWithOriginWithJobsAsync(characterId) .Returns(character); _authorizationUtil.When(x => x.EnsureCharacterAccess(executionContext, character)) .Throw(new TestException()); Func <Task> act = () => _service.AddJobAsync(executionContext, characterId, request); act.Should().Throw <TestException>(); }
public void AddJobAsync_WhenCharacterAlreadyKnowTheJob_Throw() { const int characterId = 5; var jobId = Guid.NewGuid(); var executionContext = new NaheulbookExecutionContext(); var request = new CharacterAddJobRequest { JobId = jobId }; var character = new Character { Jobs = new List <CharacterJob> { new CharacterJob { JobId = jobId } }, Id = characterId }; _unitOfWorkFactory.GetUnitOfWork().Characters.GetWithOriginWithJobsAsync(characterId) .Returns(character); Func <Task> act = () => _service.AddJobAsync(executionContext, characterId, request); act.Should().Throw <CharacterAlreadyKnowThisJobException>(); }
public async Task AddJobAsync(NaheulbookExecutionContext executionContext, int characterId, CharacterAddJobRequest request) { using (var uow = _unitOfWorkFactory.CreateUnitOfWork()) { var character = await uow.Characters.GetWithOriginWithJobsAsync(characterId); if (character == null) { throw new CharacterNotFoundException(characterId); } _authorizationUtil.EnsureCharacterAccess(executionContext, character); if (character.Jobs.Any(x => x.JobId == request.JobId)) { throw new CharacterAlreadyKnowThisJobException(character.Id, request.JobId); } var job = await uow.Jobs.GetAsync(request.JobId); if (job == null) { throw new JobNotFoundException(request.JobId); } character.Jobs.Add(new CharacterJob { Job = job }); var notificationSession = _notificationSessionFactory.CreateSession(); notificationSession.NotifyCharacterAddJob(character.Id, job.Id); await uow.SaveChangesAsync(); await notificationSession.CommitAsync(); } }