public void DemographicViewModelToFormData_FullData()
        {
            //Arrange
            var dViewModel = new DemographicFormViewModel {
                Id          = 1,
                DateOfBirth = new DateTime(1978, 2, 3),
                Other       = "Some description - updated",
                Race        = 2,
                Sex         = 3
            };
            var dFormData = CreateEmptyDemographicFormData();

            //Act
            formController.MapDemographicViewModelToFormData(dViewModel, dFormData);

            //Assert
            Assert.That(dFormData.DateOfBirth.Value, Is.EqualTo(new DateTime(1978, 2, 3).ToString(CultureInfo.InvariantCulture)));
            Assert.That(dFormData.Other.Value, Is.EqualTo("Some description - updated"));
            Assert.That(dFormData.Race.Value, Is.EqualTo("2"));
            Assert.That(dFormData.Sex.Value, Is.EqualTo("3"));
        }
        public void DemographicViewModelToFormData_FullData()
        {
            //Arrange
            var dViewModel = new DemographicFormViewModel {
                Id = 1,
                DateOfBirth = new DateTime(1978, 2, 3),
                Other = "Some description - updated",
                Race = 2,
                Sex = 3
            };
            var dFormData = CreateEmptyDemographicFormData();

            //Act
            formController.MapDemographicViewModelToFormData(dViewModel, dFormData);

            //Assert
            Assert.That(dFormData.DateOfBirth.Value, Is.EqualTo(new DateTime(1978, 2, 3).ToString(CultureInfo.InvariantCulture)));
            Assert.That(dFormData.Other.Value, Is.EqualTo("Some description - updated"));
            Assert.That(dFormData.Race.Value, Is.EqualTo("2"));
            Assert.That(dFormData.Sex.Value, Is.EqualTo("3"));
        }
            public void PostEditDemographicFormData_NonExistingForm_Test()
            {
                //Arrange
                var model = new DemographicFormViewModel {
                    Id = 12,
                    FormId = 13,
                    DateOfBirth = new DateTime(2012, 1, 24),
                    Race = 1,
                    Sex = 2,
                    Other = "Some text"
                };
                fRep.Setup(r => r.GetByKey(13)).Returns((Form) null);

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

                //Assert
                CheckErrorInfoViewResult(result);
            }
            public void PostEditDemographicFormData_NonExistingFormData_Test()
            {
                //Arrange
                var form = new Form {
                    Id = 13,
                    FormState = FormState.Incomplete
                };
                var model = new DemographicFormViewModel {
                    Id = 12,
                    FormId = 13,
                    DateOfBirth = new DateTime(2012, 1, 24),
                    Race = 1,
                    Sex = 2,
                    Other = "Some text"
                };
                fRep.Setup(r => r.GetByKey(13)).Returns(form);

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

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

                //Assert
                CheckErrorInfoViewResult(result);
            }
            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));
            }