public void AdverseEventViewModelToFormData_FullData()
        {
            //Arrange
            var aViewModel = new AdverseEventFormViewModel {
                Id = 6,
                AdverseExperience = "Broken arm",
                OnsetDate = new DateTime(2012, 3, 4),
                OnsetTime = new DateTime(2012, 4, 5, 12, 13, 14),
                EndDate = new DateTime(2011, 2, 3),
                EndTime = new DateTime(2011, 4, 5, 1, 2, 3),
                Outcome = 2,
                Intensity = 3,
                RelationshipToInvestigationalDrug = 4
            };
            var aFormData = CreateEmptyAdverseEventFormData();

            //Act
            formController.MapAdverseEventViewModelToFormData(aViewModel, aFormData);

            //Assert
            Assert.That(aFormData.AdverseExperience.Value, Is.EqualTo("Broken arm"));
            Assert.That(aFormData.OnsetDate.Value,
                        Is.EqualTo(new DateTime(2012, 3, 4).ToString(CultureInfo.InvariantCulture)));
            Assert.That(aFormData.OnsetTime.Value,
                        Is.EqualTo(new DateTime(2012, 4, 5, 12, 13, 14).ToString(CultureInfo.InvariantCulture)));
            Assert.That(aFormData.EndDate.Value,
                        Is.EqualTo(new DateTime(2011, 2, 3).ToString(CultureInfo.InvariantCulture)));
            Assert.That(aFormData.EndTime.Value,
                        Is.EqualTo(new DateTime(2011, 4, 5, 1, 2, 3).ToString(CultureInfo.InvariantCulture)));
            Assert.That(aFormData.Outcome.Value, Is.EqualTo("2"));
            Assert.That(aFormData.Intensity.Value, Is.EqualTo("3"));
            Assert.That(aFormData.RelationshipToInvestigationalDrug.Value, Is.EqualTo("4"));
        }
            public void PostEditAdverseEventFormData_NonExistingForm_Test()
            {
                //Arrange
                var model = new AdverseEventFormViewModel {
                    Id = 12,
                    FormId = 13,
                    OnsetDate = new DateTime(2010, 1, 2),
                    OnsetTime = new DateTime(2011, 1, 1, 5, 4, 3),
                    EndDate = new DateTime(2011, 11, 12),
                    EndTime = new DateTime(2012, 1, 1, 14, 15, 16),
                    Intensity = 4,
                    Outcome = 5,
                    RelationshipToInvestigationalDrug = 6
                };
                fRep.Setup(r => r.GetByKey(13)).Returns((Form) null);

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

                //Assert
                CheckErrorInfoViewResult(result);
            }
            public void PostEditAdverseEventFormData_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 AdverseEventFormData {
                    Id = 12,
                    Form = form,
                    OnsetDate = new Question() { Id = 101, Value = new DateTime(2011, 10, 11).ToString(CultureInfo.InvariantCulture) },
                    OnsetTime = new Question() { Id = 102, Value = new DateTime(2010, 11, 12, 12, 13, 14).ToString(CultureInfo.InvariantCulture) },
                    EndDate = new Question() { Id = 103, Value = new DateTime(2012, 1, 2).ToString(CultureInfo.InvariantCulture) },
                    EndTime = new Question() { Id = 104, Value = new DateTime(2011, 9, 3, 3, 4, 5).ToString(CultureInfo.InvariantCulture) },
                    AdverseExperience = new Question() { Id = 105, Value = "Broken neck" },
                    Intensity = new Question() { Id = 106, Value = "1" },
                    Outcome = new Question() { Id = 107, Value = "2" },
                    RelationshipToInvestigationalDrug = new Question() { Id = 108, Value = "3" }
                };
                var incomingModel = new AdverseEventFormViewModel {
                    Id = 12,
                    FormId = 13,
                    OnsetDate = new DateTime(2010, 1, 2),
                    OnsetTime = new DateTime(2011, 1, 1, 5, 4, 3),
                    EndDate = new DateTime(2011, 11, 12),
                    EndTime = new DateTime(2012, 1, 1, 14, 15, 16),
                    Intensity = 4,
                    Outcome = 5,
                    RelationshipToInvestigationalDrug = 6
                };

                bool isValid = true;
                Mock<IHtmlEditorAdapter> htmlHelper = new Mock<IHtmlEditorAdapter>();
                htmlHelper.Setup(hh => hh.GetActiveView(It.IsAny<string>())).Returns(null);
                htmlHelper.Setup(hh => hh.GetHtmlView(It.IsAny<string>(),
                                                      It.IsAny<ASPxHtmlEditorHtmlEditingSettings>(),
                                                      It.IsAny<HtmlEditorValidationSettings>(),
                                                      It.IsAny<EventHandler<HtmlEditorValidationEventArgs>>(),
                                                      out isValid)).Returns("Broken brain");

                formController.HtmlEditorAdapter = htmlHelper.Object;

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

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

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

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

                //Assert
                CheckEditFormDataRedirectRouteValues(result, form);

                afdRep.Verify(r => r.GetByKey(incomingModel.Id), Times.Once());
                afdRep.Verify(r => r.Edit(It.IsAny<AdverseEventFormData>()), Times.Once());
                afdRep.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.OnsetDate.Value,
                            Is.EqualTo(new DateTime(2010, 1, 2).ToString(CultureInfo.InvariantCulture)));
                Assert.That(savedFormData.OnsetTime.Value,
                            Is.EqualTo(new DateTime(2011, 1, 1, 5, 4, 3).ToString(CultureInfo.InvariantCulture)));
                Assert.That(savedFormData.EndDate.Value,
                            Is.EqualTo(new DateTime(2011, 11, 12).ToString(CultureInfo.InvariantCulture)));
                Assert.That(savedFormData.EndTime.Value,
                            Is.EqualTo(new DateTime(2012, 1, 1, 14, 15, 16).ToString(CultureInfo.InvariantCulture)));
                Assert.That(savedFormData.AdverseExperience.Value, Is.EqualTo("Broken brain"));
                Assert.That(savedFormData.Intensity.Value, Is.EqualTo("4"));
                Assert.That(savedFormData.Outcome.Value, Is.EqualTo("5"));
                Assert.That(savedFormData.RelationshipToInvestigationalDrug.Value, Is.EqualTo("6"));

                Assert.That(savedForm, Is.Not.Null);
                Assert.That(savedForm.Id, Is.EqualTo(incomingModel.FormId));
                Assert.That(savedForm.FormState, Is.EqualTo(FormState.Completed));
            }
            public void PostEditAdverseEventFormData_NonExistingFormData_Test()
            {
                //Arrange
                var form = new Form {
                    Id = 13,
                    FormState = FormState.Incomplete
                };
                var model = new AdverseEventFormViewModel {
                    Id = 12,
                    FormId = 13,
                    OnsetDate = new DateTime(2010, 1, 2),
                    OnsetTime = new DateTime(2011, 1, 1, 5, 4, 3),
                    EndDate = new DateTime(2011, 11, 12),
                    EndTime = new DateTime(2012, 1, 1, 14, 15, 16),
                    Intensity = 4,
                    Outcome = 5,
                    RelationshipToInvestigationalDrug = 6
                };
                fRep.Setup(r => r.GetByKey(13)).Returns(form);

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

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

                //Assert
                CheckErrorInfoViewResult(result);
            }
            public void PostEditAdverseEventFormData_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 AdverseEventFormData {
                    Id = 12,
                    Form = form,
                    OnsetDate = new Question() { Id = 101, Value = new DateTime(2011, 10, 11).ToString(CultureInfo.InvariantCulture) },
                    OnsetTime = new Question() { Id = 102, Value = new DateTime(2010, 11, 12, 12, 13, 14).ToString(CultureInfo.InvariantCulture) },
                    EndDate = new Question() { Id = 103, Value = new DateTime(2012, 1, 2).ToString(CultureInfo.InvariantCulture) },
                    EndTime = new Question() { Id = 104, Value = new DateTime(2011, 9, 3, 3, 4, 5).ToString(CultureInfo.InvariantCulture) },
                    AdverseExperience = new Question() { Id = 105, Value = "Broken neck" },
                    Intensity = new Question() { Id = 106, Value = "1" },
                    Outcome = new Question() { Id = 107, Value = "2" },
                    RelationshipToInvestigationalDrug = new Question() { Id = 108, Value = "3" }
                };
                var incomingModel = new AdverseEventFormViewModel {
                    Id = 12,
                    FormId = 13,
                    OnsetDate = new DateTime(2010, 1, 2),
                    OnsetTime = new DateTime(2011, 1, 1, 5, 4, 3),
                    EndDate = new DateTime(2011, 11, 12),
                    EndTime = new DateTime(2012, 1, 1, 14, 15, 16),
                    Intensity = 2,
                    Outcome = 1,
                    RelationshipToInvestigationalDrug = 2
                };

                bool isValid = true;
                Mock<IHtmlEditorAdapter> htmlHelper = new Mock<IHtmlEditorAdapter>();
                htmlHelper.Setup(hh => hh.GetActiveView(It.IsAny<string>())).Returns(null);
                htmlHelper.Setup(hh => hh.GetHtmlView(It.IsAny<string>(),
                                                      It.IsAny<ASPxHtmlEditorHtmlEditingSettings>(),
                                                      It.IsAny<HtmlEditorValidationSettings>(),
                                                      It.IsAny<EventHandler<HtmlEditorValidationEventArgs>>(),
                                                      out isValid)).Returns("Broken brain");

                formController.HtmlEditorAdapter = htmlHelper.Object;

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

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

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

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

                AssertChangeInfo(formData.OnsetDate, DateTime.Parse(formData.OnsetDate.Value).ToShortDateString(), incomingModel.OnsetDate.Value.ToShortDateString(), model);
                AssertChangeInfo(formData.OnsetTime, "12:13 PM", "5:04 AM", model);

                AssertChangeInfo(formData.EndDate, DateTime.Parse(formData.EndDate.Value).ToShortDateString(), incomingModel.EndDate.Value.ToShortDateString(), model);
                AssertChangeInfo(formData.EndTime, "3:04 AM", "2:15 PM", model);

                AssertChangeInfo(formData.AdverseExperience, "Broken neck", "Broken brain", model);
                AssertChangeInfo(formData.Intensity, "Mild", "Moderate", model);
                AssertChangeInfo(formData.Outcome, "Ongoing", "Resolved", model);
                AssertChangeInfo(formData.RelationshipToInvestigationalDrug, "Suspected (reasonably possible)", "Unlikely", model);
            }