public void MappingTest()
        {
            //Arrange
            var dataStorage = new Mock<IDataStorage>();
            var entity = new VitalsFormData() {
                Id = 1,
                ActualTime = new Question {Id = 2, Value = "2"},
                HeartRate = new Question {Id = 3, Value = "3"},
                Height = new Question {Id = 4, Value = "4"},
                Weight = new Question {Id = 5, Value = "5"},
                Temperature = new Question {Id = 6, Value = "6"},
                BloodPressureDiastolic = new Question {Id = 7, Value = "7"},
                BloodPressureSystolic = new Question {Id = 8, Value = "8"}
            };
            var updatedEntity = new VitalsFormData() {
                Id = 1,
                ActualTime = new Question {Id = 3, Value = "3"},
                HeartRate = new Question {Id = 4, Value = "4"},
                Height = new Question {Id = 5, Value = "5"},
                Weight = new Question {Id = 6, Value = "6"},
                Temperature = new Question {Id = 7, Value = "7"},
                BloodPressureDiastolic = new Question {Id = 8, Value = "8"},
                BloodPressureSystolic = new Question {Id = 9, Value = "9"}
            };
            var repository = new VitalsFormDataRepository(dataStorage.Object);

            dataStorage.Setup(ds => ds.GetData<VitalsFormData>()).Returns(new List<VitalsFormData> {entity});
            //Act
            repository.Edit(updatedEntity);
            //Assert
            //Values are equal
            Assert.That(entity.ActualTime.Value, Is.EqualTo(updatedEntity.ActualTime.Value));
            Assert.That(entity.HeartRate.Value, Is.EqualTo(updatedEntity.HeartRate.Value));
            Assert.That(entity.Height.Value, Is.EqualTo(updatedEntity.Height.Value));
            Assert.That(entity.Weight.Value, Is.EqualTo(updatedEntity.Weight.Value));
            Assert.That(entity.Temperature.Value, Is.EqualTo(updatedEntity.Temperature.Value));
            Assert.That(entity.BloodPressureDiastolic.Value, Is.EqualTo(updatedEntity.BloodPressureDiastolic.Value));
            Assert.That(entity.BloodPressureSystolic.Value, Is.EqualTo(updatedEntity.BloodPressureSystolic.Value));

            //Objects are not equal
            Assert.That(entity.ActualTime, Is.Not.EqualTo(updatedEntity.ActualTime));
            Assert.That(entity.HeartRate, Is.Not.EqualTo(updatedEntity.HeartRate));
            Assert.That(entity.Height, Is.Not.EqualTo(updatedEntity.Height));
            Assert.That(entity.Weight, Is.Not.EqualTo(updatedEntity.Weight));
            Assert.That(entity.Temperature, Is.Not.EqualTo(updatedEntity.Temperature));
            Assert.That(entity.BloodPressureDiastolic, Is.Not.EqualTo(updatedEntity.BloodPressureDiastolic));
            Assert.That(entity.BloodPressureSystolic, Is.Not.EqualTo(updatedEntity.BloodPressureSystolic));
        }
        private void FillVitalsBasedOnPreviousVisit(VitalsFormData vitalsOriginalFormData, VitalsFormData vitalsFormData,
		                                            Form vitalsForm)
        {
            vitalsForm.FormState = FormState.Completed;
            vitalsFormData.Height.Value = vitalsOriginalFormData.Height.Value;
            double weight = double.Parse(vitalsOriginalFormData.Weight.Value);
            weight = Math.Round(weight + randomGenerator.NextDouble()*3 - 1.5d, 1);
            vitalsFormData.Weight.Value = weight.ToString();

            vitalsFormData.BloodPressureDiastolic.Value = vitalsOriginalFormData.BloodPressureDiastolic.Value;
            vitalsFormData.BloodPressureSystolic.Value = vitalsOriginalFormData.BloodPressureSystolic.Value;

            var temperature = GetRandomTemperature();
            vitalsFormData.Temperature.Value = temperature.ToString();
            var heartRate = GetRandomHeartRate();
            vitalsFormData.HeartRate.Value = heartRate.ToString();
        }
        public void VitalsFormDataToViewModel_FullData()
        {
            //Arrange
            var vFormData = new VitalsFormData {
                Id = 2,
                Form =
                    new Form {
                        Id = 12,
                        Caption = "Form12",
                        FormState = FormState.Completed,
                        Visit =
                            new Visit {Caption = "Visit12", Patient = new Patient {PatientNumber = 120}}
                    },
                ActualTime =
                    new Question {
                        Id = 2,
                        DataType = QuestionDataType.Date,
                        Value =
                            new DateTime(2012, 1, 1, 10, 11, 12).ToString(
                                CultureInfo.InvariantCulture)
                    },
                Height = new Question {Id = 3, DataType = QuestionDataType.Number, Value = "177"},
                Weight = new Question {Id = 4, DataType = QuestionDataType.Number, Value = "90"},
                Temperature =
                    new Question {
                        Id = 5,
                        DataType = QuestionDataType.Number,
                        Value = (36.6m).ToString(CultureInfo.InvariantCulture)
                    },
                HeartRate = new Question {Id = 6, DataType = QuestionDataType.Integer, Value = "66"},
                BloodPressureSystolic =
                    new Question {Id = 7, DataType = QuestionDataType.String, Value = "120"},
                BloodPressureDiastolic =
                    new Question {Id = 8, DataType = QuestionDataType.String, Value = "70"}
            };
            //Act
            var vitals = formController.MapVitalsFormDataToViewModel(vFormData);

            //Assert
            Assert.That(vitals.FormId, Is.EqualTo(12));
            Assert.That(vitals.FormCaption, Is.EqualTo("Form12"));
            Assert.That(vitals.IsCompleted, Is.True);
            Assert.That(vitals.VisitName, Is.EqualTo("Visit12"));
            Assert.That(vitals.PatientNumber, Is.EqualTo(120));
            Assert.That(vitals.Id, Is.EqualTo(2));
            Assert.That(vitals.ActualTime, Is.Not.Null);
            Assert.That(vitals.ActualTime.Value.ToLongTimeString(),
                        Is.EqualTo(new DateTime(1980, 1, 1, 10, 11, 12).ToLongTimeString()));
            Assert.That(vitals.Height, Is.EqualTo(177));
            Assert.That(vitals.Weight, Is.EqualTo(90));
            Assert.That(vitals.Temperature, Is.EqualTo(36.6m));
            Assert.That(vitals.HeartRate, Is.EqualTo(66));
            Assert.That(vitals.BloodPressureSystolic, Is.EqualTo("120"));
            Assert.That(vitals.BloodPressureDiastolic, Is.EqualTo("70"));

            Assert.That(vitals.ActualTimeQuestionId, Is.EqualTo(vFormData.ActualTime.Id));
            Assert.That(vitals.HeightQuestionId, Is.EqualTo(vFormData.Height.Id));
            Assert.That(vitals.WeightQuestionId, Is.EqualTo(vFormData.Weight.Id));
            Assert.That(vitals.TemperatureQuestionId, Is.EqualTo(vFormData.Temperature.Id));
            Assert.That(vitals.HeartRateQuestionId, Is.EqualTo(vFormData.HeartRate.Id));
            Assert.That(vitals.BloodPressureSystolicQuestionId, Is.EqualTo(vFormData.BloodPressureSystolic.Id));
            Assert.That(vitals.BloodPressureDiastolicQuestionId, Is.EqualTo(vFormData.BloodPressureDiastolic.Id));
        }
            public void PostEditVitalsFormData_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 VitalsFormData {
                    Id = 12,
                    Form = form,
                    ActualTime = new Question() { Id = 100, Value = new DateTime(2011, 10, 11, 12, 13, 14).ToString(CultureInfo.InvariantCulture) },
                    Height = new Question() { Id = 101, Value = "170" },
                    Weight = new Question() { Id = 102, Value = "50" },
                    HeartRate = new Question() { Id = 103, Value = "20" },
                    Temperature = new Question() { Id = 104, Value = "30" },
                    BloodPressureSystolic = new Question() { Id = 105, Value = "120" },
                    BloodPressureDiastolic = new Question() { Id = 106, Value = "70" }
                };
                var incomingModel = new VitalsFormViewModel {
                    Id = 12,
                    FormId = 13,
                    ActualTime = new DateTime(2012, 10, 11, 15, 16, 17),
                    Height = 171,
                    Weight = 51,
                    HeartRate = 21,
                    Temperature = 31,
                    BloodPressureSystolic = "121",
                    BloodPressureDiastolic = "71"
                };

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

                //here we return "formdata before editing" - this data should be overwritten from model
                vfdRep.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
                VitalsFormData savedFormData = null;
                vfdRep.Setup(r => r.Edit(It.IsAny<VitalsFormData>())).Callback<VitalsFormData>(fd => savedFormData = fd);

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

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

                //Assert
                CheckEditFormDataRedirectRouteValues(result, form);

                vfdRep.Verify(r => r.GetByKey(incomingModel.Id), Times.Once());
                vfdRep.Verify(r => r.Edit(It.IsAny<VitalsFormData>()), Times.Once());
                vfdRep.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(savedFormData, Is.Not.Null);
                Assert.That(savedFormData.Id, Is.EqualTo(incomingModel.Id));
                Assert.That(savedFormData.ActualTime.Value,
                            Is.EqualTo(new DateTime(2012, 10, 11, 15, 16, 17).ToString(CultureInfo.InvariantCulture)));
                Assert.That(savedFormData.Height.Value, Is.EqualTo("171"));
                Assert.That(savedFormData.Weight.Value, Is.EqualTo("51"));
                Assert.That(savedFormData.HeartRate.Value, Is.EqualTo("21"));
                Assert.That(savedFormData.Temperature.Value, Is.EqualTo("31"));
                Assert.That(savedFormData.BloodPressureSystolic.Value, Is.EqualTo("121"));
                Assert.That(savedFormData.BloodPressureDiastolic.Value, Is.EqualTo("71"));

                Assert.That(savedForm, Is.Not.Null);
                Assert.That(savedForm.Id, Is.EqualTo(incomingModel.FormId));
                Assert.That(savedForm.FormState, Is.EqualTo(FormState.Completed));
            }
            public void PostEditVitalsFormData_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 VitalsFormData {
                    Id = 12,
                    Form = form,
                    ActualTime = new Question() { Id = 100, Value = new DateTime(2011, 10, 11, 12, 13, 14).ToString(CultureInfo.InvariantCulture) },
                    Height = new Question() { Id = 101, Value = "170" },
                    Weight = new Question() { Id = 102, Value = "50" },
                    HeartRate = new Question() { Id = 103, Value = "20" },
                    Temperature = new Question() { Id = 104, Value = "30" },
                    BloodPressureSystolic = new Question() { Id = 105, Value = "120" },
                    BloodPressureDiastolic = new Question() { Id = 106, Value = "70" }
                };
                var incomingModel = new VitalsFormViewModel {
                    Id = 12,
                    FormId = 13,
                    ActualTime = new DateTime(2012, 10, 11, 15, 16, 17),
                    Height = 171,
                    Weight = 51,
                    HeartRate = 21,
                    Temperature = 31,
                    BloodPressureSystolic = "121",
                    BloodPressureDiastolic = "71"
                };

                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
                vfdRep.Setup(r => r.GetByKey(incomingModel.Id)).Returns(formData);

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

                //Assert
                vfdRep.Verify(r => r.GetByKey(incomingModel.Id), Times.Once());
                vfdRep.Verify(r => r.Edit(It.IsAny<VitalsFormData>()), Times.Never());
                vfdRep.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);
                VitalsFormViewModel model = viewResultBase.Model as VitalsFormViewModel;
                Assert.That(model, Is.Not.Null);

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

                AssertChangeInfo(formData.Height, "170", "171", model);
                AssertChangeInfo(formData.Weight, "50", "51", model);
                AssertChangeInfo(formData.HeartRate, "20", "21", model);
                AssertChangeInfo(formData.Temperature, "30", "31", model);
                AssertChangeInfo(formData.BloodPressureSystolic, "120", "121", model);
                AssertChangeInfo(formData.BloodPressureDiastolic, "70", "71", model);
                AssertChangeInfo(formData.ActualTime, "12:13 PM", "3:16 PM", model);
            }
 private VitalsFormData AddVitalsFormData(Form form)
 {
     var formData = new VitalsFormData() {
         Form = form,
         ActualTime = new Question { Caption = "Actual Time", DataType = QuestionDataType.Date, Form = form },
         Height = new Question { Caption = "Height", DataType = QuestionDataType.Number, Form = form },
         Weight = new Question { Caption = "Weight", DataType = QuestionDataType.Number, Form = form },
         Temperature = new Question { Caption = "Temperature", DataType = QuestionDataType.Number, Form = form },
         HeartRate = new Question { Caption = "Heart Rate", DataType = QuestionDataType.Integer, Form = form },
         BloodPressureSystolic = new Question { Caption = "Systolic Blood Pressure, mmHg", DataType = QuestionDataType.String, Form = form },
         BloodPressureDiastolic = new Question { Caption = "Diastolic Blood Pressure, mmHg", DataType = QuestionDataType.String, Form = form }
     };
     VitalsFormDataRepository.Add(formData);
     QuestionRepository.Add(formData.ActualTime);
     QuestionRepository.Add(formData.Height);
     QuestionRepository.Add(formData.Weight);
     QuestionRepository.Add(formData.Temperature);
     QuestionRepository.Add(formData.HeartRate);
     QuestionRepository.Add(formData.BloodPressureSystolic);
     QuestionRepository.Add(formData.BloodPressureDiastolic);
     return formData;
 }