public void CreateChecklistAnswerShouldFailWhenNameIsNull()
 {
     // Arrange
     string _answer = null;
     // Act
     var result = new ChecklistAnswer(id, _answer, imageUrl, videoUrl, action, linksTo);
 }
        public void Given_an_answer_has_been_changed_when_UpdateAnswers_then_answers_update()
        {
            // Given
            var originalAnswer = new ChecklistAnswer()
            {
                Id = Guid.NewGuid(),
                ActionRequired = "the action required",
                AssignedTo = new BusinessSafe.Domain.Entities.Employee() { Id = Guid.NewGuid() }
                ,
                EmployeeNotListed = "employee not listed",
                GuidanceNotes = "the guidance notes",
                SupportingEvidence = "the supporting evidence",
                Question = new Question() { Id = new Guid() }
                ,
                Response = new QuestionResponse() { Id = Guid.NewGuid() }
                ,
                Timescale = new Timescale() { Id = 2L }
            };

            var newAnswer = new ChecklistAnswer()
            {
                Id = originalAnswer.Id,
                ActionRequired = "the action required updated",
                AssignedTo = new BusinessSafe.Domain.Entities.Employee() { Id = Guid.NewGuid() }
                ,
                EmployeeNotListed = "employee not listed updated",
                GuidanceNotes = "the guidance notes updated",
                SupportingEvidence = "the supporting evidence updated",
                Question = originalAnswer.Question
                ,
                Response = new QuestionResponse() { Id = Guid.NewGuid() }
                ,
                Timescale = new Timescale() { Id = 5L }
            };

            var newAnswers = new List<ChecklistAnswer>() { newAnswer };

            var checklist = new Checklist();
            checklist.Answers.Add(originalAnswer);
            checklist.UpdateAnswers(newAnswers, new UserForAuditing());

            // When
            Assert.That(checklist.Answers.Count, Is.EqualTo(1));
            Assert.That(checklist.Answers.First().ActionRequired, Is.EqualTo(newAnswer.ActionRequired));
            Assert.That(checklist.Answers.First().AssignedTo, Is.EqualTo(newAnswer.AssignedTo));
            Assert.That(checklist.Answers.First().EmployeeNotListed, Is.EqualTo(newAnswer.EmployeeNotListed));
            Assert.That(checklist.Answers.First().GuidanceNotes, Is.EqualTo(newAnswer.GuidanceNotes));
            Assert.That(checklist.Answers.First().SupportingEvidence, Is.EqualTo(newAnswer.SupportingEvidence));
            Assert.That(checklist.Answers.First().Question, Is.EqualTo(originalAnswer.Question));
            Assert.That(checklist.Answers.First().Response, Is.EqualTo(newAnswer.Response));
            Assert.That(checklist.Answers.First().Timescale, Is.EqualTo(newAnswer.Timescale));
            Assert.That(checklist.Answers.First().LastModifiedBy, Is.Not.Null);
            Assert.That(checklist.Answers.First().LastModifiedOn, Is.Not.Null);

        }
        public void CreateChecklistAnswerShouldSucceed()
        {
            // Arrange

            // Act
            var result = new ChecklistAnswer(id, answer, imageUrl, videoUrl, action, linksTo);

            // Assert
            result.Action.Should().Be(action);
            result.Answer.Should().Be(answer);
            result.Image.Should().Be(imageUrl);
            result.LinksTo.Should().Be(linksTo);
            result.QuestionId.Should().Be(id);
            result.Video.Should().Be(videoUrl);
        }
        private List<ChecklistAnswer> ChecklistAnswers(ChecklistViewModel model, List<QuestionResponse> allResponses,
            List<Question> allQuestions, UserForAuditing user)
        {
            var checklistAnswers = new List<ChecklistAnswer>();

            foreach (var questionAnswerViewModel in model.Questions.Where(x => x.Answer != null))
            {
                var checklistAnswer = new ChecklistAnswer();
                checklistAnswer.SupportingEvidence = questionAnswerViewModel.Answer.SupportingEvidence;
                checklistAnswer.ActionRequired = questionAnswerViewModel.Answer.ActionRequired;
                checklistAnswer.GuidanceNotes = questionAnswerViewModel.Answer.GuidanceNotes;

                checklistAnswer.Timescale = questionAnswerViewModel.Answer.Timescale != null
                    ? _timescaleRepository.GetById(questionAnswerViewModel.Answer.Timescale.Id)
                    : null;

                checklistAnswer.Response =
                    allResponses.SingleOrDefault(
                        response => response.Id == questionAnswerViewModel.Answer.SelectedResponseId);
                checklistAnswer.Question =
                    allQuestions.Single(question => question.Id == questionAnswerViewModel.Question.Id);

                checklistAnswer.AssignedTo = (questionAnswerViewModel.Answer.AssignedTo != null) &&
                                             (questionAnswerViewModel.Answer.AssignedTo.Id.HasValue) &&
                                             (questionAnswerViewModel.Answer.AssignedTo.Id.Value != Guid.Empty)
                    ? _employeeRespository.GetById((questionAnswerViewModel.Answer.AssignedTo.Id.GetValueOrDefault()))
                    : null;

                checklistAnswer.EmployeeNotListed = (questionAnswerViewModel.Answer.AssignedTo != null) &&
                                                    (questionAnswerViewModel.Answer.AssignedTo.Id.HasValue) &&
                                                    (questionAnswerViewModel.Answer.AssignedTo.Id.Value == Guid.Empty)
                    ? questionAnswerViewModel.Answer.AssignedTo.NonEmployeeName
                    : null;

                checklistAnswer.QaComments = questionAnswerViewModel.Answer.QaComments;

                if (questionAnswerViewModel.Answer.QaSignedOffBy != null)
                {
                    checklistAnswer.QaSignedOffBy = questionAnswerViewModel.Answer.QaSignedOffBy + "_" +
                                                    DateTime.Now.Date;
                }

                checklistAnswer.CreatedBy = user;
                checklistAnswer.CreatedOn = DateTime.Now;

                checklistAnswer.LastModifiedBy = user;
                checklistAnswer.LastModifiedOn = DateTime.Now;

                checklistAnswers.Add(checklistAnswer);
            }
            return checklistAnswers;
        }
        private static AnswerViewModel Map(ChecklistAnswer answer, Question question)
        {
            if (answer != null)
            {
                AnswerViewModel model = new AnswerViewModel()
                {
                    SupportingEvidence = answer.SupportingEvidence,
                    ActionRequired = answer.ActionRequired,
                    SelectedResponseId = answer.Response != null ? (Guid?) answer.Response.Id : null,
                    QuestionId = answer.Question.Id,
                    GuidanceNotes = answer.GuidanceNotes,
                    Timescale =
                        answer.Timescale == null
                            ? null
                            : new TimescaleViewModel() {Id = answer.Timescale.Id, Name = answer.Timescale.Name},
                    AssignedTo = null,
                    QaComments = answer.QaComments,
                    QaSignedOffBy = answer.QaSignedOffBy,
                    ReportLetterStatement = answer.Response != null ? answer.Response.ReportLetterStatement : ""
                };

                if (answer.AssignedTo != null)
                {
                    model.AssignedTo = new AssignedToViewModel()
                    {
                        Id = (Guid?) answer.AssignedTo.Id,
                        NonEmployeeName = answer.AssignedTo.FullName
                    };
                }
                else if (!string.IsNullOrEmpty(answer.EmployeeNotListed))
                {
                    model.AssignedTo = new AssignedToViewModel()
                    {
                        Id = (Guid?) Guid.Empty,
                        NonEmployeeName = answer.EmployeeNotListed
                    };
                }



                return model;
            }
            else
            {
                return new AnswerViewModel()
                {
                    QuestionId = question.Id
                };
            }
        }
        public void given_checklist_when_copyWithResponses_with_question_marked_as_acceptable_then_SupportingDocumentationDate_is_not_set()
        {
            //given
            var siteId = 213123;
            var clientId = 54321;
            var userForAuditing = new UserForAuditing() { Id = Guid.NewGuid() };
            var copiedByUserName = "******";

            var question = Question.Create(Guid.NewGuid(), "Title",
              new Category() { Id = Guid.NewGuid(), Title = "Care" }, false, userForAuditing);
            
            var answer = new ChecklistAnswer()
            {
                Id = Guid.NewGuid(),
                AssignedTo = new BusinessSafe.Domain.Entities.Employee() { Id = Guid.NewGuid() },
                EmployeeNotListed = "employee not listed",
                Timescale = new Timescale() { Id = 2L },
                Question = question,
                Response = new QuestionResponse()
                {
                    Id = Guid.NewGuid(),
                    SupportingEvidence = "sp",
                    GuidanceNotes = "the guidance notes",
                    ActionRequired = "the action required",
                    ResponseType = "Positive",
                    Question = question

                },
                SupportingDocumentationDate = DateTime.Now.Date,
                SupportingDocumentationStatus = "SS",
                SupportingEvidence = "se"
            };

            var answersList = new List<ChecklistAnswer>() { answer };
            var checklist = new Checklist() { Id = Guid.NewGuid() };

            checklist.Questions.Add(new ChecklistQuestion() { Id = Guid.NewGuid(), Question = question, Checklist = checklist, CategoryNumber = 1, QuestionNumber = 4 });
            checklist.UpdateAnswers(answersList, new UserForAuditing());

            //when
            var result = checklist.CopyToSiteWithResponses(siteId, clientId, userForAuditing, copiedByUserName, false);

            //then
            Assert.That(result.Answers.Count, Is.EqualTo(1));
            Assert.That(result.Answers[0].Question.Id, Is.EqualTo(checklist.Answers[0].Question.Id));
            Assert.AreEqual(null, result.Answers[0].SupportingDocumentationDate);            
        }
        public void given_checklist_when_copyWithResponses_then_Answers_to_all_non_mandatory_questions_are_set()
        {
            //given
            var siteId = 213123;
            var clientId = 54321;
            var userForAuditing = new UserForAuditing() { Id = Guid.NewGuid() };
            var copiedByUserName = "******";
            

            var question1 = Question.Create(Guid.NewGuid(), "Title",
               new Category() { Id = Guid.NewGuid(), Title = "Care" }, true, userForAuditing);

            var responseId = Guid.NewGuid();
            var questionResponse1 = new QuestionResponse() {
                    Id = responseId,
                    Title = "Acceptable",
                    SupportingEvidence = "sp",
                    GuidanceNotes = "the guidance notes",
                    ActionRequired = "the action required",
                    ResponseType = "Positive",
                    Question = question1,
                };
            var questionResponse2 = new QuestionResponse() { Id = Guid.NewGuid(), Question = question1, Title = "Unacceptable", ResponseType = "Negative"};

            question1.PossibleResponses.Add(questionResponse1);
            question1.PossibleResponses.Add(questionResponse2);

           
            var answer = new ChecklistAnswer()
            {
                Id = Guid.NewGuid(),
                AssignedTo = new BusinessSafe.Domain.Entities.Employee() { Id = Guid.NewGuid() },
                EmployeeNotListed = "employee not listed",
                Timescale = new Timescale() { Id = 2L },
                Question = question1,
                Response = new QuestionResponse()
                {
                    Id = responseId,
                    Title = "Acceptable",
                    SupportingEvidence = "sp",
                    GuidanceNotes = "the guidance notes",
                    ActionRequired = "the action required",
                    ResponseType = "Positive",
                    Question = question1,
                },
                SupportingDocumentationDate = DateTime.Now.Date,
                SupportingDocumentationStatus = "SS",
                SupportingEvidence = "se"
            };

            
            var answersList = new List<ChecklistAnswer>() { answer };
            var checklist = new Checklist() { Id = Guid.NewGuid() };

            checklist.Questions.Add(new ChecklistQuestion() { Id = Guid.NewGuid(), Question = question1, Checklist = checklist, CategoryNumber = 1, QuestionNumber = 4 });
            
            checklist.UpdateAnswers(answersList, new UserForAuditing());

            //when
            var result = checklist.CopyToSiteWithResponses(siteId, clientId, userForAuditing, copiedByUserName, false);

            Assert.That(result.Answers.Count, Is.EqualTo(checklist.Answers.Count()));

            Assert.That(result.Answers[0].Id, Is.Not.EqualTo(checklist.Answers[0].Id));
            Assert.That(result.Answers[0].Question.Id, Is.Not.EqualTo(checklist.Answers[0].Question.Id));
            Assert.That(result.Answers[0].Timescale, Is.EqualTo(null));
            Assert.That(result.Answers[0].AssignedTo, Is.EqualTo(null));
            Assert.That(result.Answers[0].EmployeeNotListed, Is.EqualTo(checklist.Answers[0].EmployeeNotListed));


            Assert.That(result.Answers[0].Response.Question.Id, Is.Not.EqualTo(checklist.Answers[0].Question.Id));
            Assert.That(result.Answers[0].Response.Title, Is.EqualTo(checklist.Answers[0].Response.Title));
            Assert.That(result.Answers[0].Response.ActionRequired, Is.EqualTo(checklist.Answers[0].Response.ActionRequired));
            Assert.That(result.Answers[0].Response.GuidanceNotes, Is.EqualTo(checklist.Answers[0].Response.GuidanceNotes));
            Assert.That(result.Answers[0].Response.SupportingEvidence, Is.EqualTo(checklist.Answers[0].Response.SupportingEvidence));
            Assert.That(result.Answers[0].Response.SupportingEvidence, Is.EqualTo(checklist.Answers[0].Response.SupportingEvidence));
            Assert.That(result.Answers[0].Response.ResponseType, Is.EqualTo(checklist.Answers[0].Response.ResponseType));
            
        }
        public void Given_answer_has_previously_been_given_when_a_question_without_an_answer_is_saved_then_original_answer_is_not_removed()
        {
            var originalResponseId = Guid.NewGuid();
            var originalLastModifiedOn = DateTime.Now.AddDays(-5);

            // Given
            var originalAnswer = new ChecklistAnswer()
            {
                Id = Guid.NewGuid(),
                Question = new Question() {Id = new Guid()},
                LastModifiedOn = originalLastModifiedOn,
                SupportingDocumentationStatus = "Reported",
                Response = new QuestionResponse() {Id = originalResponseId}
            };

            var newAnswer = new ChecklistAnswer()
            {
                Id = originalAnswer.Id,
                Question = originalAnswer.Question,
                Response = null
            };

            var newAnswers = new List<ChecklistAnswer>() {newAnswer};

            var checklist = new Checklist();
            checklist.Answers.Add(originalAnswer);
            checklist.UpdateAnswers(newAnswers, new UserForAuditing());


            Assert.That(checklist.Answers.First().SupportingDocumentationStatus, Is.EqualTo("Reported"));
            Assert.That(checklist.Answers.First().LastModifiedOn.Value, Is.EqualTo(originalLastModifiedOn));
            Assert.That(checklist.Answers.First().Response.Id, Is.EqualTo(originalResponseId));
        }
        public void Given_answer_supporting_documentation_date_changed_then_supporting_documentation_date_updated()
        {
            var originalLastModifiedOn = DateTime.Now.AddDays(-5);

            // Given
            var originalAnswer = new ChecklistAnswer()
            {
                Id = Guid.NewGuid(),
                Question = new Question() { Id = new Guid() },
                Response = new QuestionResponse() { Id = Guid.NewGuid() }
                ,
                LastModifiedOn = originalLastModifiedOn,
                SupportingDocumentationStatus = "Reported"
            };

            var newAnswer = new ChecklistAnswer()
            {
                Id = originalAnswer.Id,
                Question = originalAnswer.Question,
                SupportingDocumentationStatus = "Reported",
                SupportingDocumentationDate =  DateTime.Now.AddDays(-51),
                Response = originalAnswer.Response

            };

            var newAnswers = new List<ChecklistAnswer>() { newAnswer };

            var checklist = new Checklist();
            checklist.Answers.Add(originalAnswer);
            checklist.UpdateAnswers(newAnswers, new UserForAuditing());

            Assert.That(checklist.Answers.First().SupportingDocumentationDate, Is.EqualTo(newAnswer.SupportingDocumentationDate));
            Assert.That(checklist.Answers.First().LastModifiedOn.Value.Date, Is.EqualTo(DateTime.Now.Date));
        }
        private List<ChecklistAnswer> ChecklistAnswers(Checklist checklist, ChecklistViewModel model,
            UserForAuditing user)
        {
            var allResponses = GetAllResponses(checklist);
            var allQuestions = GetAllQuestions(checklist);

            var checklistAnswers = new List<ChecklistAnswer>();

            foreach (var questionAnswerViewModel in model.Questions.Where(x => x.Answer != null))
            {
                var checklistAnswer = new ChecklistAnswer();
                checklistAnswer.SupportingEvidence = questionAnswerViewModel.Answer.SupportingEvidence;
                checklistAnswer.ActionRequired = questionAnswerViewModel.Answer.ActionRequired;
                checklistAnswer.GuidanceNotes = questionAnswerViewModel.Answer.GuidanceNotes;
                checklistAnswer.Timescale = questionAnswerViewModel.Answer.Timescale != null
                    ? _timescaleRepository.GetById(questionAnswerViewModel.Answer.Timescale.Id)
                    : null;
                checklistAnswer.Response =
                    allResponses.SingleOrDefault(
                        response => response.Id == questionAnswerViewModel.Answer.SelectedResponseId);
                checklistAnswer.Question =
                    allQuestions.Single(question => question.Id == questionAnswerViewModel.Question.Id);
                checklistAnswer.AssignedTo = AssignedToHasValue(questionAnswerViewModel)
                    ? _employeeRespository.GetById((questionAnswerViewModel.Answer.AssignedTo.Id.GetValueOrDefault()))
                    : null;
                checklistAnswer.EmployeeNotListed = (questionAnswerViewModel.Answer.AssignedTo != null) &&
                                                    (questionAnswerViewModel.Answer.AssignedTo.Id.HasValue) &&
                                                    (questionAnswerViewModel.Answer.AssignedTo.Id.Value == Guid.Empty)
                    ? questionAnswerViewModel.Answer.AssignedTo.NonEmployeeName
                    : null;

                checklistAnswer.QaComments = questionAnswerViewModel.Answer.QaComments;
                checklistAnswer.QaCommentsResolved = questionAnswerViewModel.Answer.QaCommentsResolved;
                checklistAnswer.AreaOfNonCompliance = questionAnswerViewModel.Answer.AreaOfNonCompliance;

                if (questionAnswerViewModel.Answer.QaSignedOffBy != null)
                {

                    if (IsOldQaSignedOffFormat(questionAnswerViewModel))
                    {
                        checklistAnswer.QaSignedOffBy = GetQaAdvisorFromOldQaSignedOffFormat(questionAnswerViewModel);
                        checklistAnswer.QaSignedOffDate =
                            GetSignOffDateFromOldQaSignedOffFormat(questionAnswerViewModel).HasValue
                                ? GetSignOffDateFromOldQaSignedOffFormat(questionAnswerViewModel).Value
                                : DateTime.Now;
                    }
                    else
                    {
                        checklistAnswer.QaSignedOffBy = questionAnswerViewModel.Answer.QaSignedOffBy;
                        checklistAnswer.QaSignedOffDate = questionAnswerViewModel.Answer.QaSignedOffDate.HasValue
                            ? questionAnswerViewModel.Answer.QaSignedOffDate.Value.ToLocalTime()
                            : DateTime.Now;
                    }
                }

                checklistAnswer.CreatedBy = user;
                checklistAnswer.CreatedOn = DateTime.Now;
                checklistAnswer.LastModifiedBy = user;
                checklistAnswer.LastModifiedOn = DateTime.Now;
                checklistAnswer.SupportingDocumentationStatus = questionAnswerViewModel.Answer.SupportingDocumentationStatus;
                checklistAnswer.SupportingDocumentationDate = questionAnswerViewModel.Answer.SupportingDocumentationDate.ToLocalTime();

                checklistAnswers.Add(checklistAnswer);
            }
            return checklistAnswers;
        }
        public void Given_answer_QA_signed_off_date_is_null_then_lastmodifed_not_changed()
        {
            var originalLastModifiedOn = DateTime.Now.AddDays(-5);

            // Given
            var originalAnswer = new ChecklistAnswer()
            {
                Id = Guid.NewGuid(),
                Question = new Question() { Id = new Guid() }
                ,
                LastModifiedOn = originalLastModifiedOn
            };

            var newAnswer = new ChecklistAnswer()
            {
                Id = originalAnswer.Id,
                Question = originalAnswer.Question,
            };

            var newAnswers = new List<ChecklistAnswer>() { newAnswer };

            var checklist = new Checklist();
            checklist.Answers.Add(originalAnswer);
            checklist.UpdateAnswers(newAnswers, new UserForAuditing());

            Assert.That(checklist.Answers.First().LastModifiedOn, Is.EqualTo(originalLastModifiedOn));
        }
        public void Given_answer_QA_signed_off_date_has_been_removed_then_date_is_null()
        {
            var originalQaSignedOffDate = new DateTime(2013, 12, 01, 15, 15, 15, 123);

            // Given
            var originalAnswer = new ChecklistAnswer()
            {
                Id = Guid.NewGuid(),
                Question = new Question() { Id = new Guid() },
                LastModifiedBy = new UserForAuditing() { Id = Guid.NewGuid() },
                LastModifiedOn = DateTime.Now.AddDays(-5),
                QaSignedOffBy = "David Brieley",
                QaSignedOffDate = originalQaSignedOffDate,
                Response = new QuestionResponse() { Id = Guid.NewGuid() },
            };

            var newAnswer = new ChecklistAnswer()
            {
                Id = originalAnswer.Id,
                Question = originalAnswer.Question,
                QaSignedOffBy = "David Brieley",
                QaSignedOffDate = null,
                Response = originalAnswer.Response
            };

            var newAnswers = new List<ChecklistAnswer>() { newAnswer };

            var checklist = new Checklist();
            checklist.Answers.Add(originalAnswer);
            checklist.UpdateAnswers(newAnswers, new UserForAuditing());

            Assert.That(checklist.Answers.First().QaSignedOffDate, Is.Null);
        }
        public void Given_answer_QA_signed_off_date_hasnt_change_then_qa_name_and_date_are_not_saved()
        {
            var originalQaSignedOffDate = new DateTime(2013, 12, 01, 15, 15, 15, 123);
            var originalLastModifiedOn = DateTime.Now.AddDays(-5);


            // Given
            var originalAnswer = new ChecklistAnswer()
            {
                Id = Guid.NewGuid(),
                Question = new Question() { Id = new Guid() },
                LastModifiedBy = new UserForAuditing() { Id = Guid.NewGuid() },
                LastModifiedOn = originalLastModifiedOn,
                QaSignedOffBy = "David Brieley"
                ,
                QaSignedOffDate = originalQaSignedOffDate
            };

            var newAnswer = new ChecklistAnswer()
            {
                Id = originalAnswer.Id,
                Question = originalAnswer.Question,
                QaSignedOffBy = "David Brieley"
                ,
                QaSignedOffDate = new DateTime(2013, 12, 01, 15, 15, 15, 12)

            };

            var newAnswers = new List<ChecklistAnswer>() { newAnswer };

            var checklist = new Checklist();
            checklist.Answers.Add(originalAnswer);
            checklist.UpdateAnswers(newAnswers, new UserForAuditing());

            Assert.That(checklist.Answers.First().LastModifiedOn, Is.EqualTo(originalLastModifiedOn));
            Assert.That(checklist.Answers.First().QaSignedOffDate.Value, Is.EqualTo(originalQaSignedOffDate));
        }
        public void Given_answer_is_signed_off_by_a_QA_then_qa_name_and_date_are_saved()
        {

            // Given
            var originalAnswer = new ChecklistAnswer()
            {
                Id = Guid.NewGuid(),
                Question = new Question() { Id = new Guid() },
                Response = new QuestionResponse(){Id = Guid.NewGuid()}
                ,LastModifiedBy = new UserForAuditing() { Id = Guid.NewGuid() },
                LastModifiedOn = DateTime.Now.AddDays(-5)
            };

            var newAnswer = new ChecklistAnswer()
            {
                Id = originalAnswer.Id,
                Question = originalAnswer.Question,
                QaSignedOffBy = "David Brieley"
                ,QaSignedOffDate = DateTime.Now
                ,Response= originalAnswer.Response
            };

            
            var newAnswers = new List<ChecklistAnswer>() { newAnswer };

            var checklist = new Checklist();
            checklist.Answers.Add(originalAnswer);
            checklist.UpdateAnswers(newAnswers, new UserForAuditing());


            Assert.That(checklist.Answers.First().QaSignedOffBy, Is.EqualTo(newAnswer.QaSignedOffBy));
            Assert.That(checklist.Answers.First().QaSignedOffDate.Value, Is.EqualTo(newAnswer.QaSignedOffDate.Value));

        }
        public void Given_timescale_changed_when_UpdateAnswers_then_lastmodifiedDate_updated()
        {
            var originalLastModifiedByDate = DateTime.Now.AddDays(-5);

            // Given
            var originalAnswer = new ChecklistAnswer()
            {
                Id = Guid.NewGuid(),
                ActionRequired = null,
                AssignedTo = new BusinessSafe.Domain.Entities.Employee() { Id = Guid.NewGuid() },
                EmployeeNotListed = "employee not listed",
                GuidanceNotes = "the guidance notes",
                SupportingEvidence = "the supporting evidence",
                Question = new Question() { Id = new Guid() },
                Response = new QuestionResponse() { Id = Guid.NewGuid() },
                Timescale = new Timescale() { Id = 2L },
                LastModifiedBy = new UserForAuditing() { Id = Guid.NewGuid() },
                LastModifiedOn = originalLastModifiedByDate
            };

            var newAnswer = new ChecklistAnswer()
            {
                Id = originalAnswer.Id,
                ActionRequired = originalAnswer.ActionRequired,
                AssignedTo = originalAnswer.AssignedTo,
                EmployeeNotListed = originalAnswer.EmployeeNotListed,
                GuidanceNotes = originalAnswer.GuidanceNotes,
                SupportingEvidence = originalAnswer.SupportingEvidence,
                Question = originalAnswer.Question,
                Response = originalAnswer.Response,
                Timescale = new Timescale() { Id = 12L }
            };

            var newAnswers = new List<ChecklistAnswer>() { newAnswer };

            var checklist = new Checklist();
            checklist.Answers.Add(originalAnswer);
            checklist.UpdateAnswers(newAnswers, new UserForAuditing());

            // When
            Assert.That(checklist.Answers.Count, Is.EqualTo(1));
            Assert.That(checklist.Answers.First().Timescale, Is.EqualTo(newAnswer.Timescale));
            Assert.That(checklist.Answers.First().LastModifiedOn.Value.Date, Is.EqualTo(DateTime.Now.Date));
        }
        public void Given_answer_area_of_non_compliance_changed_then_area_of_non_compliance_updated()
        {
            var originalLastModifiedOn = DateTime.Now.AddDays(-5);

            // Given
            var originalAnswer = new ChecklistAnswer()
            {
                Id = Guid.NewGuid(),
                Question = new Question() { Id = new Guid() }
                ,Response = new QuestionResponse(){Id = Guid.NewGuid()}
                ,LastModifiedOn = originalLastModifiedOn
            };

            var newAnswer = new ChecklistAnswer()
            {
                Id = originalAnswer.Id,
                Question = originalAnswer.Question,
                Response = originalAnswer.Response,
                AreaOfNonCompliance = "you have 1 second to comply"
            };

            var newAnswers = new List<ChecklistAnswer>() { newAnswer };

            var checklist = new Checklist();
            checklist.Answers.Add(originalAnswer);
            checklist.UpdateAnswers(newAnswers, new UserForAuditing());

            Assert.That(checklist.Answers.First().AreaOfNonCompliance, Is.EqualTo(newAnswer.AreaOfNonCompliance));
            Assert.That(checklist.Answers.First().LastModifiedOn.Value.Date, Is.EqualTo(DateTime.Now.Date));
        }
        private static AnswerViewModel Map(ChecklistAnswer answer, Question question)
        {
            if (answer != null)
            {
                AnswerViewModel model = new AnswerViewModel()
                {
                    SupportingEvidence = answer.SupportingEvidence,
                    ActionRequired = answer.ActionRequired,
                    SelectedResponseId = answer.Response != null ? (Guid?) answer.Response.Id : null,
                    QuestionId = answer.Question.Id,
                    GuidanceNotes = answer.GuidanceNotes,
                    Timescale =
                        answer.Timescale == null
                            ? null
                            : new TimescaleViewModel() {Id = answer.Timescale.Id, Name = answer.Timescale.Name},
                    AssignedTo = null,
                    QaComments = answer.QaComments,
                    QaSignedOffBy = answer.QaSignedOffBy,
                    QaSignedOffDate = answer.QaSignedOffDate,
                    ReportLetterStatement = answer.Response != null ? answer.Response.ReportLetterStatement : "",
                    QaCommentsResolved = answer.QaCommentsResolved,
                    AreaOfNonCompliance = answer.AreaOfNonCompliance,
                    SupportingDocumentationStatus = answer.SupportingDocumentationStatus,
                    SupportingDocumentationDate = answer.SupportingDocumentationDate.ToUniversalTime()

                };

                if (answer.AssignedTo != null)
                {
                    model.AssignedTo = new AssignedToViewModel()
                    {
                        Id = (Guid?) answer.AssignedTo.Id,
                        ForeName = answer.AssignedTo.Forename,
                        Surname = answer.AssignedTo.Surname,
                        FullName = answer.AssignedTo.FullName,
                        EmailAddress = answer.AssignedTo.HasEmail ? answer.AssignedTo.GetEmail() : string.Empty
                    };
                }
                else if (!string.IsNullOrEmpty(answer.EmployeeNotListed))
                {
                    model.AssignedTo = new AssignedToViewModel()
                    {
                        Id = (Guid?) Guid.Empty,
                        NonEmployeeName = answer.EmployeeNotListed
                    };
                }

                return model;
            }
            else
            {
                return new AnswerViewModel()
                {
                    QuestionId = question.Id
                };
            }
        }