public async Task <bool> AddProjectAttendant(PersonInProjectParameterDto parameters)
        {
            if (await projectRepository.GetSingleByCondition(x => x.ProjectId == parameters.ProjectId) == null)
            {
                return(false);
            }

            bool notFound = false;

            foreach (var personId in parameters.AttendantIds)
            {
                var newAttendant = await personRepository.GetSingleByCondition(x => x.PersonId == personId);

                if (newAttendant == null)
                {
                    notFound = true;
                    break;
                }
            }

            if (notFound)
            {
                return(false);
            }

            foreach (var attendantId in parameters.AttendantIds)
            {
                PersonInProject personInProject = new PersonInProject {
                    PersonId = attendantId, ProjectId = parameters.ProjectId
                };
                await personInProjectRepository.Create(personInProject);
            }

            return(await personInProjectRepository.SaveChanges());
        }
        public async System.Threading.Tasks.Task AddProjectAttendant_GivenExistingProjectIdAndAttendantIds_ShouldAddAttendantToProject()
        {
            var parameters = new PersonInProjectParameterDto
            {
                ProjectId    = Guid.NewGuid(),
                AttendantIds = new Guid[] { Guid.NewGuid() }
            };

            mockProjectRepository.Setup(x => x.GetSingleByCondition(It.IsAny <Expression <Func <Project, bool> > >()))
            .ReturnsAsync(mockProject);
            mockPersonRepository.Setup(x => x.GetSingleByCondition(It.IsAny <Expression <Func <Person, bool> > >()))
            .ReturnsAsync(mockPerson);
            mockPersonInProjectRepository.Setup(s => s.Create(It.IsAny <Domain.Entities.PersonInProject>()))
            .Returns(System.Threading.Tasks.Task.CompletedTask);
            mockPersonInProjectRepository.Setup(s => s.SaveChanges())
            .ReturnsAsync(true);

            var personInProjectService = new PersonInProjectService(mapper,
                                                                    mockPersonInProjectRepository.Object,
                                                                    mockPersonRepository.Object,
                                                                    mockProjectRepository.Object);

            var result = await personInProjectService.AddProjectAttendant(parameters);

            mockProjectRepository.Verify(v => v.GetSingleByCondition(It.IsAny <Expression <Func <Project, bool> > >()), Times.Once);
            mockPersonRepository.Verify(v => v.GetSingleByCondition(It.IsAny <Expression <Func <Person, bool> > >()), Times.AtLeastOnce);
            mockPersonInProjectRepository.Verify(v => v.SaveChanges(), Times.Once);

            Assert.IsTrue(result);
        }
        public async Task <bool> RemoveProjectAttendant(PersonInProjectParameterDto parameters)
        {
            foreach (var personId in parameters.AttendantIds)
            {
                var entity = await personInProjectRepository.GetSingleByCondition(x => x.PersonId == personId &&
                                                                                  x.ProjectId == parameters.ProjectId);

                if (entity != null)
                {
                    await personInProjectRepository.Delete(entity);
                }
            }

            return(await personInProjectRepository.SaveChanges());
        }
        public async Task <IActionResult> RemoveProjectAttendants(PersonInProjectParameterDto parameter)
        {
            try
            {
                if (parameter == null || !ModelState.IsValid)
                {
                    return(BadRequest());
                }

                var result = await personInProjectService.RemoveProjectAttendant(parameter);

                return(Ok(result));
            }
            catch (Exception ex)
            {
                return(HandleException(ex.Message));
            }
        }
        public async System.Threading.Tasks.Task RemoveProjectAttendant_TheAttendantDoesNotExists_ShouldReturnFalse()
        {
            var parameters = new PersonInProjectParameterDto
            {
                ProjectId    = Guid.NewGuid(),
                AttendantIds = new Guid[] { Guid.NewGuid() }
            };

            mockPersonInProjectRepository.Setup(x => x.GetSingleByCondition(It.IsAny <Expression <Func <PersonInProject, bool> > >()))
            .Returns(System.Threading.Tasks.Task.FromResult <PersonInProject>(null));
            mockPersonInProjectRepository.Setup(x => x.SaveChanges())
            .ReturnsAsync(false);

            var personInProjectService = new PersonInProjectService(mapper,
                                                                    mockPersonInProjectRepository.Object,
                                                                    mockPersonRepository.Object,
                                                                    mockProjectRepository.Object);

            var result = await personInProjectService.RemoveProjectAttendant(parameters);

            Assert.IsFalse(result);
        }
        public async System.Threading.Tasks.Task AddProjectAttendant_GivenAnUnexistingProjectId_ShouldntAddNewAttendantAndReturnFalse()
        {
            var parameters = new PersonInProjectParameterDto
            {
                ProjectId    = Guid.NewGuid(),
                AttendantIds = new Guid[] { Guid.NewGuid() }
            };

            mockProjectRepository.Setup(x => x.GetSingleByCondition(It.IsAny <Expression <Func <Project, bool> > >()))
            .Returns(System.Threading.Tasks.Task.FromResult <Project>(null));


            var personInProjectService = new PersonInProjectService(mapper,
                                                                    mockPersonInProjectRepository.Object,
                                                                    mockPersonRepository.Object,
                                                                    mockProjectRepository.Object);

            var result = await personInProjectService.AddProjectAttendant(parameters);

            mockProjectRepository.Verify(v => v.GetSingleByCondition(It.IsAny <Expression <Func <Project, bool> > >()), Times.Once);

            Assert.IsFalse(result);
        }