public void MappingTest()
        {
            //Arrange
            var dataStorage = new Mock<IDataStorage>();
            var entity = new DemographicFormData() {
                Id = 1,
                DateOfBirth = new Question {Id = 2, Value = "2"},
                Other = new Question {Id = 3, Value = "3"},
                Race = new Question {Id = 4, Value = "4"},
                Sex = new Question {Id = 5, Value = "5"}
            };
            var updatedEntity = new DemographicFormData() {
                Id = 1,
                DateOfBirth = new Question {Id = 2, Value = "2"},
                Other = new Question {Id = 3, Value = "3"},
                Race = new Question {Id = 4, Value = "4"},
                Sex = new Question {Id = 5, Value = "5"}
            };
            var repository = new DemographicFormDataRepository(dataStorage.Object);

            dataStorage.Setup(ds => ds.GetData<DemographicFormData>()).Returns(new List<DemographicFormData> {entity});
            //Act
            repository.Edit(updatedEntity);
            //Assert
            //Values are equal
            Assert.That(entity.DateOfBirth.Value, Is.EqualTo(updatedEntity.DateOfBirth.Value));
            Assert.That(entity.Other.Value, Is.EqualTo(updatedEntity.Other.Value));
            Assert.That(entity.Race.Value, Is.EqualTo(updatedEntity.Race.Value));
            Assert.That(entity.Sex.Value, Is.EqualTo(updatedEntity.Sex.Value));

            //Objects are not equal
            Assert.That(entity.DateOfBirth, Is.Not.EqualTo(updatedEntity.DateOfBirth));
            Assert.That(entity.Other, Is.Not.EqualTo(updatedEntity.Other));
            Assert.That(entity.Race, Is.Not.EqualTo(updatedEntity.Race));
            Assert.That(entity.Sex, Is.Not.EqualTo(updatedEntity.Sex));
        }
        public void DemographicFormDataToViewModel_FullData()
        {
            //Arrange
            var dFormData = new DemographicFormData {
                Id = 1,
                Form =
                    new Form {
                        Id = 11,
                        Caption = "Form11",
                        FormState = FormState.Completed,
                        Visit =
                            new Visit {Caption = "Visit11", Patient = new Patient {PatientNumber = 110}}
                    },
                DateOfBirth =
                    new Question {
                        Id = 3,
                        DataType = QuestionDataType.Date,
                        Value =
                            new DateTime(1980, 1, 1).
                                ToString(CultureInfo.InvariantCulture)
                    },
                Other =
                    new Question {
                        Id = 4,
                        DataType = QuestionDataType.String,
                        Value = "Some description"
                    },
                Race =
                    new Question {Id = 5, DataType = QuestionDataType.Enum, Value = "1"},
                Sex =
                    new Question {Id = 6, DataType = QuestionDataType.Enum, Value = "2"}
            };

            //Act
            var demog = formController.MapDemographicFormDataToViewModel(dFormData);

            //Assert
            Assert.That(demog.FormId, Is.EqualTo(11));
            Assert.That(demog.FormCaption, Is.EqualTo("Form11"));
            Assert.That(demog.IsCompleted, Is.True);
            Assert.That(demog.VisitName, Is.EqualTo("Visit11"));
            Assert.That(demog.PatientNumber, Is.EqualTo(110));
            Assert.That(demog.Id, Is.EqualTo(1));
            Assert.That(demog.DateOfBirth, Is.Not.Null);
            Assert.That(demog.DateOfBirth.Value.Date, Is.EqualTo(new DateTime(1980, 1, 1).Date));
            Assert.That(demog.Other, Is.EqualTo("Some description"));
            Assert.That(demog.Race, Is.EqualTo(1));
            Assert.That(demog.Sex, Is.EqualTo(2));

            Assert.That(demog.DateOfBirthQuestionId, Is.EqualTo(dFormData.DateOfBirth.Id));
            Assert.That(demog.OtherQuestionId, Is.EqualTo(dFormData.Other.Id));
            Assert.That(demog.SexQuestionId, Is.EqualTo(dFormData.Sex.Id));
            Assert.That(demog.RaceQuestionId, Is.EqualTo(dFormData.Race.Id));
        }
            private void ArrangeHappinessTestData(List<HappinessChangeDto> dtos, Dictionary<int, int> races,
			                                      Dictionary<int, int> genders, Dictionary<int, decimal> happinessChanges,
			                                      out AnalyticsController controller, out Mock<IPatientRepository> pRepository,
			                                      out Mock<IDemographicFormDataRepository> dfdRepository,
			                                      out Mock<IHappinessFormDataRepository> hfdRepository)
            {
                pRepository = new Mock<IPatientRepository>();
                dfdRepository = new Mock<IDemographicFormDataRepository>();
                hfdRepository = new Mock<IHappinessFormDataRepository>();
                controller = new AnalyticsController(pRepository.Object, null, dfdRepository.Object, hfdRepository.Object, null,
                                                     null);

                pRepository.Setup(r => r.GetHappinessChangeData()).Returns(dtos);

                foreach (var dto in dtos) {
                    var demog = new DemographicFormData {
                        Race = new Question {Value = races[dto.PatientId].ToString()},
                        Sex = new Question {Value = genders[dto.PatientId].ToString()}
                    };
                    dfdRepository.Setup(r => r.GetFormDataByFormId(dto.DemographicFormId)).Returns(demog);

                    var hap1 = new HappinessFormData {
                        HappinessLevel = new Question {Value = "25"}
                    };
                    var hap10 = new HappinessFormData {
                        HappinessLevel = new Question {Value = (25 + (100*happinessChanges[dto.PatientId])).ToString()}
                    };
                    hfdRepository.Setup(r => r.GetFormDataByFormId(dto.HappinessDay1FormId)).Returns(hap1);
                    hfdRepository.Setup(r => r.GetFormDataByFormId(dto.HappinessDay10FormId)).Returns(hap10);
                }
            }
            private BaseFormData CreateTestCrf(FormType formType, int formId, int question1, int question2)
            {
                BaseFormData formData;

                if (formType == FormType.Demographics) {
                    formData = new DemographicFormData {
                        Id = formId,
                        Race = new Question {Value = question1.ToString()},
                        Sex = new Question {Value = question2.ToString()}
                    };
                }
                else {
                    formData = new AdverseEventFormData {
                        Id = formId,
                        Intensity = new Question {Value = question1.ToString()},
                        RelationshipToInvestigationalDrug = new Question {Value = question2.ToString()}
                    };
                }

                return formData;
            }
            public void PostEditDemographicFormData_ChangedValues_IncompleteForm_Test()
            {
                //Arrange
                EmulateControllerContext(formController, false);
                var form = new Form {
                    Id = 13,
                    FormState = FormState.Incomplete,
                    Caption = "TestForm",
                    Visit = new Visit { Caption = "TestVisit", Patient = new Patient { PatientNumber = 123 } }
                };

                var formData = new DemographicFormData {
                    Id = 12,
                    Form = form,
                    DateOfBirth = new Question() { Value = new DateTime(2011, 10, 11).ToString(CultureInfo.InvariantCulture) },
                    Other = new Question() { Value = String.Empty },
                    Race = new Question() { Value = "4" },
                    Sex = new Question() { Value = "2" }
                };
                var model = new DemographicFormViewModel {
                    Id = 12,
                    FormId = 13,
                    DateOfBirth = new DateTime(2012, 1, 24),
                    Race = 3,
                    Sex = 1,
                    Other = "Some text"
                };

                fRep.Setup(r => r.GetByKey(model.FormId)).Returns(form);

                //here we return "formdata before editing" - this data should be overwritten from model
                dfdRep.Setup(r => r.GetByKey(model.Id)).Returns(formData);

                //as checking of saved formdata is quite complicated, we will save the passed object and inspect it later
                DemographicFormData demogFormData = null;
                dfdRep.Setup(r => r.Edit(It.IsAny<DemographicFormData>())).Callback<DemographicFormData>(fd => demogFormData = fd);

                Form demogForm = null;
                fRep.Setup(r => r.Edit(It.IsAny<Form>())).Callback<Form>(f => demogForm = f);

                //Act
                var result = formController.EditDemographicForm(model);

                //Assert
                CheckEditFormDataRedirectRouteValues(result, form);

                dfdRep.Verify(r => r.GetByKey(model.Id), Times.Once());
                dfdRep.Verify(r => r.Edit(It.IsAny<DemographicFormData>()), Times.Once());
                dfdRep.Verify(r => r.Save(), Times.Once());

                fRep.Verify(r => r.GetByKey(model.FormId), Times.Once());
                fRep.Verify(r => r.Edit(It.IsAny<Form>()), Times.Once());
                fRep.Verify(r => r.Save(), Times.Once());

                Assert.That(demogFormData, Is.Not.Null);
                Assert.That(demogFormData.Id, Is.EqualTo(model.Id));
                Assert.That(demogFormData.DateOfBirth.Value,
                            Is.EqualTo(new DateTime(2012, 1, 24).ToString(CultureInfo.InvariantCulture)));
                Assert.That(demogFormData.Race.Value, Is.EqualTo("3"));
                Assert.That(demogFormData.Sex.Value, Is.EqualTo("1"));
                Assert.That(demogFormData.Other.Value, Is.EqualTo("Some text"));

                Assert.That(demogForm, Is.Not.Null);
                Assert.That(demogForm.Id, Is.EqualTo(model.FormId));
                Assert.That(demogForm.FormState, Is.EqualTo(FormState.Completed));
            }
            public void PostEditDemographicFormData_ChangedUnconfirmedValues_Test()
            {
                //Arrange
                EmulateControllerContext(formController, false);
                var form = new Form {
                    Id = 13,
                    FormState = FormState.Completed,
                    Caption = "TestForm",
                    Visit = new Visit {Caption = "TestVisit", Patient = new Patient {PatientNumber = 123}}
                };

                var formData = new DemographicFormData {
                    Id = 12,
                    Form = form,
                    DateOfBirth = new Question() { Id = 14, Caption  = "Date of Birth", Value = new DateTime(2011, 10, 11).ToString(CultureInfo.InvariantCulture)},
                    Other = new Question() { Id = 15, Caption = "Other", Value = String.Empty },
                    Race = new Question() { Id = 16, Caption = "Race", Value = "4" },
                    Sex = new Question() { Id = 17, Caption = "Sex", Value = "1" }
                };
                var incomingModel = new DemographicFormViewModel {
                    Id = 12,
                    FormId = 13,
                    DateOfBirth = new DateTime(2012, 1, 24),
                    Race = 3,
                    Sex = 0,
                    Other = "Some text"
                };

                fRep.Setup(r => r.GetByKey(incomingModel.FormId)).Returns(form);
                //here we return "formdata before editing" - this data should not be overwritten from model as no any data change note provided
                dfdRep.Setup(r => r.GetByKey(incomingModel.Id)).Returns(formData);

                //Act
                var result = formController.EditDemographicForm(incomingModel);

                //Assert
                dfdRep.Verify(r => r.GetByKey(incomingModel.Id), Times.Once());
                dfdRep.Verify(r => r.Edit(It.IsAny<DemographicFormData>()), Times.Never());
                dfdRep.Verify(r => r.Save(), Times.Never());

                fRep.Verify(r => r.GetByKey(incomingModel.FormId), Times.Once());
                fRep.Verify(r => r.Edit(It.IsAny<Form>()), Times.Never());
                fRep.Verify(r => r.Save(), Times.Never());

                Assert.That(result, Is.Not.Null);
                Assert.That(result is ViewResultBase);
                var viewResultBase = result as ViewResultBase;
                Assert.That(viewResultBase.Model, Is.Not.Null);
                DemographicFormViewModel model = viewResultBase.Model as DemographicFormViewModel;
                Assert.That(model, Is.Not.Null);

                Assert.That(model.DataChangeReasonRequired);
                Assert.That(model.ChangeInfos, Is.Not.Null);
                Assert.That(model.ChangeInfos.Count, Is.EqualTo(4));

                AssertChangeInfo(formData.DateOfBirth, DateTime.Parse(formData.DateOfBirth.Value).ToShortDateString(), incomingModel.DateOfBirth.Value.ToShortDateString(), model);
                AssertChangeInfo(formData.Race, "American Indian", "Asian", model);
                AssertChangeInfo(formData.Sex, "Female", "Male", model);
                AssertChangeInfo(formData.Other, string.Empty, "Some text", model);
            }
            public void PostEditDemographicFormData_ChangedConfirmedValues_Test()
            {
                //Arrange
                EmulateControllerContext(formController, false);
                var form = new Form {
                    Id = 13,
                    FormState = FormState.Completed,
                    Caption = "TestForm",
                    Visit = new Visit { Caption = "TestVisit", Patient = new Patient { PatientNumber = 123 } }
                };

                var formData = new DemographicFormData {
                    Id = 12,
                    Form = form,
                    DateOfBirth = new Question() { Id = 14, Caption = "Date of Birth", Value = new DateTime(2011, 10, 11).ToString(CultureInfo.InvariantCulture) },
                    Other = new Question() { Id = 15, Caption = "Other", Value = String.Empty },
                    Race = new Question() { Id = 16, Caption = "Race", Value = "4" },
                    Sex = new Question() { Id = 17, Caption = "Sex", Value = "1" }
                };
                var incomingModel = new DemographicFormViewModel {
                    Id = 12,
                    FormId = 13,
                    DateOfBirth = new DateTime(2012, 1, 24),
                    Race = 3,
                    Sex = 0,
                    Other = "Some text"
                };
                incomingModel.ChangeInfos = new List<ChangeNoteViewModel> {
                    new ChangeNoteViewModel{QuestionId = formData.DateOfBirth.Id, ChangeReason = "DateOfBirth Reason"},
                    new ChangeNoteViewModel{QuestionId = formData.Race.Id, ChangeReason = "Race Reason"},
                    new ChangeNoteViewModel{QuestionId = formData.Sex.Id, ChangeReason = "Sex Reason"},
                    new ChangeNoteViewModel{QuestionId = formData.Other.Id, ChangeReason = "Other Reason"},
                };

                fRep.Setup(r => r.GetByKey(incomingModel.FormId)).Returns(form);
                //here we return "formdata before editing" - this data should not be overwritten from model as no any data change note provided
                dfdRep.Setup(r => r.GetByKey(incomingModel.Id)).Returns(formData);

                //as checking of saved formdata is quite complicated, we will save the passed object and inspect it later
                DemographicFormData demogFormData = null;
                dfdRep.Setup(r => r.Edit(It.IsAny<DemographicFormData>())).Callback<DemographicFormData>(fd => demogFormData = fd);
                //Act
                var result = formController.EditDemographicForm(incomingModel);

                //Assert
                CheckEditFormDataRedirectRouteValues(result, form);

                dfdRep.Verify(r => r.GetByKey(incomingModel.Id), Times.Once());
                dfdRep.Verify(r => r.Edit(It.IsAny<DemographicFormData>()), Times.Once());
                dfdRep.Verify(r => r.Save(), Times.Once());

                fRep.Verify(r => r.GetByKey(incomingModel.FormId), Times.Once());
                fRep.Verify(r => r.Edit(It.IsAny<Form>()), Times.Once());
                fRep.Verify(r => r.Save(), Times.Once());

                Assert.That(demogFormData, Is.Not.Null);
                Assert.That(demogFormData.Id, Is.EqualTo(incomingModel.Id));

                Assert.That(demogFormData.DateOfBirth.Value,
                            Is.EqualTo(new DateTime(2012, 1, 24).ToString(CultureInfo.InvariantCulture)));
                Assert.That(demogFormData.Race.Value, Is.EqualTo("3"));
                Assert.That(demogFormData.Sex.Value, Is.EqualTo("0"));
                Assert.That(demogFormData.Other.Value, Is.EqualTo("Some text"));
                changeNoteBuilder.Verify(b => b.CreateChangeNote(It.IsAny<Question>(),
                    It.IsAny<string>(),
                    It.IsAny<string>(),
                    It.IsAny<string>()), Times.Exactly(4));
            }
 private DemographicFormData AddDemographicFormData(Form form)
 {
     var formData = new DemographicFormData() {
         Form = form,
         DateOfBirth = new Question { Caption = "Date Of Birth", DataType = QuestionDataType.Date, Form = form },
         Other = new Question { Caption = "Other", DataType = QuestionDataType.String, Form = form },
         Race = new Question { Caption = "Race", DataType = QuestionDataType.Enum, Form = form },
         Sex = new Question { Caption = "Sex", DataType = QuestionDataType.Enum, Form = form }
     };
     DemographicFormDataRepository.Add(formData);
     QuestionRepository.Add(formData.DateOfBirth);
     QuestionRepository.Add(formData.Other);
     QuestionRepository.Add(formData.Race);
     QuestionRepository.Add(formData.Sex);
     return formData;
 }