public void Given_consultant_exists_when_Post_then_consultant_is_updated()
        {
            Consultant savedConsultant = null;

            // Given
            var consultant = new Consultant() { Id = Guid.NewGuid() };
            var model = new ConsultantViewModel() { Id = consultant.Id, Forename = "Stansa", Surname = "Stark", Blacklisted= true, Email="*****@*****.**", QaAdvisorAssigned = Guid.NewGuid()};
            var target = GetTarget();

            _consultantRepository.Setup(x => x.GetById(consultant.Id))
                .Returns(() => consultant);

            _consultantRepository.Setup(x => x.SaveOrUpdate(It.IsAny<Consultant>()))
                .Callback<Consultant>(x => savedConsultant = x);

            // When
            target.Post(model);

            // Then
            Assert.That(savedConsultant.Id, Is.EqualTo(model.Id));
            Assert.That(savedConsultant.Forename, Is.EqualTo(model.Forename));
            Assert.That(savedConsultant.Surname, Is.EqualTo(model.Surname));
            Assert.That(savedConsultant.Email, Is.EqualTo(model.Email));
            Assert.That(savedConsultant.QaAdvisorAssigned, Is.EqualTo(model.QaAdvisorAssigned));
            Assert.That(savedConsultant.PercentageOfChecklistsToSendToQualityControl, Is.EqualTo(100));
        }
        public void Given_consultant_exists_when_Delete_then_consultant_deleted()
        {
            Consultant savedConsultant = null;

            // Given
            var consultant = new Consultant() { Id = Guid.NewGuid() };
            var model = new ConsultantViewModel() { Id = consultant.Id, Forename = "Stansa", Surname = "Stark", Blacklisted= true, Email="*****@*****.**", QaAdvisorAssigned = Guid.NewGuid()};
            var target = new ConsultantController(_dependencyFactory.Object);

            _consultantRepository.Setup(x => x.GetById(consultant.Id))
                .Returns(() => consultant);

            _consultantRepository.Setup(x => x.SaveOrUpdate(It.IsAny<Consultant>()))
                .Callback<Consultant>(x => savedConsultant = x);

            // When
            target.Delete(consultant.Id);

            // Then
            Assert.That(savedConsultant.Id, Is.EqualTo(model.Id));
            Assert.That(savedConsultant.Deleted, Is.EqualTo(true));
        }
        public void Given_username_doesnt_exist_when_Post_then_404_error_is_returned()
        {
            Consultant savedConsultant = null;

            // Given
            var model = new ConsultantViewModel() { Id = Guid.NewGuid(), Username = "******"};
            var target = GetTarget();

            _consultantRepository.Setup(x => x.GetById(It.IsAny<Guid>()))
                .Returns(() => null);

            _consultantRepository.Setup(x => x.SaveOrUpdate(It.IsAny<Consultant>()))
                .Callback<Consultant>(x => savedConsultant = x);

            _activeDirectoryService.Setup(x => x.DoesUserExist(It.IsAny<string>()))
                .Returns(false);

            // When
               var result = target.Post(model);

            // Then
               Assert.That(result.StatusCode, Is.EqualTo(HttpStatusCode.NotFound));
        }
        public void Given_username_exist_and_consultant_record_is_deleted_when_Post_then_consultant_restored()
        {
            // Given
            Consultant savedConsultant = null;
            var adUser = new User() { EmailAddress = "*****@*****.**", Forename = "Casey", Surname = "Stone" };
            var consultant = new Consultant() {Id = Guid.Parse("744905F7-62DC-4113-BB45-644E58F02D6A"), Deleted = true, Email = "*****@*****.**"};
            var model = new ConsultantViewModel() { Id = Guid.NewGuid(), Username = "******" };
            var target = GetTarget();

            _consultantRepository.Setup(x => x.GetById(It.IsAny<Guid>()))
                .Returns(() => null);

            _consultantRepository.Setup(x => x.GetByUsername(model.Username, true))
                .Returns(() => consultant);

            _consultantRepository.Setup(x => x.SaveOrUpdate(It.IsAny<Consultant>()))
                .Callback<Consultant>(x => savedConsultant = x);

            _activeDirectoryService.Setup(x => x.DoesUserExist(It.IsAny<string>()))
                .Returns(true);

            _activeDirectoryService.Setup(x => x.GetUser(It.IsAny<string>()))
              .Returns(() => adUser);

            // When

            var result = target.Put(model.Username);

            // Then
            Assert.That(savedConsultant.Deleted, Is.False);
            Assert.That(savedConsultant.Email, Is.EqualTo(adUser.EmailAddress));
            Assert.That(savedConsultant.Id, Is.EqualTo(consultant.Id));
        }
        public void Given_username_exist_when_Post_then_consultant_saved()
        {
            Consultant savedConsultant = null;
            User adUser = new User(){EmailAddress = "*****@*****.**",Forename = "Casey", Surname = "Stone"};
            // Given
            var model = new ConsultantViewModel() { Id = Guid.NewGuid(), Username = "******" };
            var target = GetTarget();

            _consultantRepository.Setup(x => x.GetById(It.IsAny<Guid>()))
                .Returns(() => null);

            _consultantRepository.Setup(x => x.SaveOrUpdate(It.IsAny<Consultant>()))
                .Callback<Consultant>(x => savedConsultant = x);

            _activeDirectoryService.Setup(x => x.DoesUserExist(It.IsAny<string>()))
                .Returns(true);

            _activeDirectoryService.Setup(x => x.GetUser(It.IsAny<string>()))
              .Returns(() => adUser);

            // When

            var result = target.Put(model.Username);

            // Then
            Assert.That(savedConsultant.Id, Is.Not.EqualTo(Guid.Empty));
            Assert.That(savedConsultant.Forename, Is.EqualTo(adUser.Forename));
            Assert.That(savedConsultant.Surname, Is.EqualTo(adUser.Surname));
            Assert.That(savedConsultant.Email, Is.EqualTo(adUser.EmailAddress));
            Assert.That(savedConsultant.PercentageOfChecklistsToSendToQualityControl, Is.EqualTo(20));
        }
        public HttpResponseMessage Post(ConsultantViewModel model)
        {
            try
            {
                var consultant = _consultantRepository.GetById(model.Id);
                if (consultant == null)
                {
                    return Request.CreateResponse(HttpStatusCode.NotFound);
                }
                else
                {
                    consultant.Forename = model.Forename;
                    consultant.Surname = model.Surname;
                    consultant.Email = model.Email;
                    consultant.QaAdvisorAssigned = model.QaAdvisorAssigned;
                    if (model.Blacklisted)
                    {
                        consultant.AddToBlacklist();
                    }
                    else
                    {
                        consultant.RemoveFromBlacklist();
                    }
                }

                _consultantRepository.SaveOrUpdate(consultant);
            }
            catch (Exception ex)
            {
                LogManager.GetLogger(typeof (ConsultantController)).Error(ex);
                throw;
            }

            return Request.CreateResponse(HttpStatusCode.OK);
        }