public void GetOpenQueries()
        {
            //Arrange
            var dataStorage = new Mock<IDataStorage>();
            var clinic = new Clinic {Caption = "Clinic1"};
            var doctor1 = new User {FirstName = "DoctorFirst1", LastName = "DoctorLast1", Clinic = clinic};
            var doctor2 = new User {FirstName = "DoctorFirst2", LastName = "DoctorLast2", Clinic = clinic};
            var patient1 = new Patient {PatientNumber = 11, Doctor = doctor1};
            var patient2 = new Patient {PatientNumber = 12, Doctor = doctor2};
            var visit1 = new Visit {Caption = "Visit1", Patient = patient1};
            var visit2 = new Visit {Caption = "Visit2", Patient = patient2};
            var form1 = new Form {FormType = FormType.Happiness, Visit = visit1};
            var form2 = new Form {FormType = FormType.Demographics, Visit = visit2};
            var question1 = new Question {Form = form1};
            var question2 = new Question {Form = form2};
            var query1 = new Query {Id = 1, QueryText = "Text1", Question = question1};
            var query2 = new Query {Id = 2, QueryText = "Text2", AnswerText = "Answer1", Question = question2};

            var repository = new QueryRepository(dataStorage.Object);
            dataStorage.Setup(ds => ds.GetData<Query>()).Returns(new List<Query> {query1, query2});

            //Act
            var result = repository.GetOpenQueries();

            //Assert
            Assert.That(result, Is.Not.Null);
            Assert.That(result.Count(), Is.EqualTo(1));
            var query = result.ToList()[0];
            Assert.That(query.FormType, Is.EqualTo(FormType.Happiness));
            Assert.That(query.ClinicName, Is.EqualTo("Clinic1"));
            Assert.That(query.DoctorName, Is.EqualTo("DoctorLast1"));
            Assert.That(query.QuestionText, Is.EqualTo("Text1"));
            Assert.That(query.PatientNumber, Is.EqualTo(11));
            Assert.That(query.VisitName, Is.EqualTo("Visit1"));
        }
        public List<Query> BuildQueries(User doctor, User supervisor)
        {
            var list = new List<Query>();

            int firstPatientNumber = doctor.Patients.First().PatientNumber;

            var query = new Query {
                Id = queryId++,
                QueryText = "Please use Country Name, not Code",
                QueryAuthor = supervisor,
                QueryTime = DateTime.Now.AddDays(-1),
                AnswerAuthor = doctor,
                AnswerText = "Corrected from “CAR” to “Central African Republic”",
                AnswerTime = DateTime.Now.AddDays(-0.75)
            };
            AssociateQueryWithQuestion(query, firstPatientNumber, VisitType.Baseline, FormType.Demographics,
                                       (formId) => DemographicFormDatas.Find(d => d.Form.Id == formId).Other);

            list.Add(query);

            query = new Query {
                Id = queryId++,
                QueryText = "Please specify the reason for high temperature",
                QueryAuthor = supervisor,
                QueryTime = DateTime.Now.AddDays(-1),
                AnswerAuthor = doctor,
                AnswerText = "Patient had flu-like symptoms occurr a day before the visit",
                AnswerTime = DateTime.Now.AddDays(-0.75)
            };
            AssociateQueryWithQuestion(query, firstPatientNumber, VisitType.Day1, FormType.Vitals,
                                       (formId) => VitalsFormDatas.Find(d => d.Form.Id == formId).Temperature);

            list.Add(query);

            query = new Query {
                Id = queryId++,
                QueryText = "Cardiogram image is not full",
                QueryAuthor = supervisor,
                QueryTime = DateTime.Now.AddDays(-1),
                AnswerAuthor = null,
                AnswerText = null,
                AnswerTime = null
            };
            AssociateQueryWithQuestion(query, firstPatientNumber, VisitType.Day1, FormType.Electrocardiogram,
                                       (formId) =>
                                       ElectrocardiogramFormDatas.Find(d => d.Form.Id == formId).ElectrocardiogramAttachment);

            list.Add(query);

            query = new Query {
                Id = queryId++,
                QueryText = "Was the measurement performed in regular conditions?",
                QueryAuthor = supervisor,
                QueryTime = DateTime.Now.AddDays(-1),
                AnswerAuthor = null,
                AnswerText = null,
                AnswerTime = null
            };
            AssociateQueryWithQuestion(query, firstPatientNumber, VisitType.Day10, FormType.Vitals,
                                       (formId) => VitalsFormDatas.Find(d => d.Form.Id == formId).HeartRate);

            list.Add(query);

            AddTemparatureQueries(list);
            AddHappinessChangeQueries(list);
            AddDemographicQueries(list);
            AddInventoryQueries(list);
            return list;
        }
        private void AssociateQueryWithQuestion(Query query, int patientNumber, VisitType visitType, FormType formType,
		                                        Func<int, Question> questionFinder)
        {
            var patient = Patients.First(p => p.PatientNumber == patientNumber);
            var visit = patient.Visits.First(v => v.VisitType == visitType);
            var form = visit.Forms.First(f => f.FormType == formType);
            query.Question = questionFinder(form.Id);
        }
        private void AddTemparatureQueries(List<Query> list)
        {
            Query query;
            foreach (var formData in VitalsFormDatas) {
                if (formData.Temperature.Value != null) {
                    double temperature = double.Parse(formData.Temperature.Value);
                    int dice = randomGenerator.Next(100);
                    if (temperature < 36.6 && dice < 90) {
                        query = new Query {
                            Id = queryId++,
                            QueryText = "Please specify the reason for reduced body temperature",
                            QueryAuthor = GetClinicSupervisor(formData.Form.Visit.Patient),
                            QueryTime = GetRandomQueryTime(formData),
                            AnswerAuthor = null,
                            AnswerText = null,
                            AnswerTime = null,
                            Question = formData.Temperature
                        };

                        dice = randomGenerator.Next(100);
                        if (dice > 60) {
                            query.AnswerAuthor = formData.Form.Visit.Patient.Doctor;
                            query.AnswerText = "It is the patient's regular body temperature";
                            query.AnswerTime = query.QueryTime.AddHours(randomGenerator.Next(5) + 1);
                        }
                        list.Add(query);
                    }
                    if (temperature > 36.6 && dice < 80) {
                        query = new Query {
                            Id = queryId++,
                            QueryText = "Please specify the reason for high body temperature",
                            QueryAuthor = GetClinicSupervisor(formData.Form.Visit.Patient),
                            QueryTime = GetRandomQueryTime(formData),
                            AnswerAuthor = null,
                            AnswerText = null,
                            AnswerTime = null,
                            Question = formData.Temperature
                        };

                        dice = randomGenerator.Next(100);
                        if (dice > 60) {
                            query.AnswerAuthor = formData.Form.Visit.Patient.Doctor;
                            query.AnswerText = "Patient had flu-like symptoms occurr a day before the visit";
                            query.AnswerTime = query.QueryTime.AddHours(randomGenerator.Next(5) + 1);
                        }
                        list.Add(query);
                    }
                }
            }
        }
        private void AddInventoryQueries(List<Query> list)
        {
            Query query;
            int dice;
            foreach (var data in InventoryFormDatas.Where(d=> d.Form.FormStateValue == (int)FormState.Completed)) {
                dice = randomGenerator.Next(100);
                if (dice < 2) {
                    query = new Query {
                        Id = queryId++,
                        QueryText = "This Batch Number is registered as Unshipped, please check",
                        QueryAuthor = GetClinicSupervisor(data.Form.Visit.Patient),
                        QueryTime = GetRandomQueryTime(data),
                        AnswerAuthor = null,
                        AnswerText = null,
                        AnswerTime = null,
                        Question = data.BatchNumber
                    };

                    dice = randomGenerator.Next(100);
                    if (dice > 70) {
                        query.AnswerAuthor = data.Form.Visit.Patient.Doctor;
                        query.AnswerText = "Marked as Shipped";
                        query.AnswerTime = query.QueryTime.AddHours(randomGenerator.Next(5) + 1);
                    }
                    if (dice > 60) {
                        query.AnswerAuthor = data.Form.Visit.Patient.Doctor;
                        query.AnswerText = "Batch Number was corrected";
                        query.AnswerTime = query.QueryTime.AddHours(randomGenerator.Next(5) + 1);
                    }
                    list.Add(query);
                }
            }
        }
        private void AddHappinessChangeQueries(List<Query> list)
        {
            Query query;
            var happinessFormPairs = from day1Happiness in HappinessFormDatas
                                     from day10Happiness in HappinessFormDatas
                                     where day1Happiness.Form.Visit.VisitTypeValue == (int) VisitType.Day1
                                           && day10Happiness.Form.Visit.VisitTypeValue == (int) VisitType.Day10
                                           && day1Happiness.Form.FormStateValue == (int)FormState.Completed
                                           && day10Happiness.Form.FormStateValue == (int)FormState.Completed
                                           && day1Happiness.Form.Visit.Patient.Id == day10Happiness.Form.Visit.Patient.Id
                                     select new {OriginalHappinessData = day1Happiness, ChangedHappinessData = day10Happiness};

            foreach (var happinessFormPair in happinessFormPairs) {
                int originalLevel;
                if(!int.TryParse(happinessFormPair.OriginalHappinessData.HappinessLevel.Value, out originalLevel))
                    continue;
                int changedLevel;
                if(!int.TryParse(happinessFormPair.ChangedHappinessData.HappinessLevel.Value, out changedLevel))
                    continue;

                if(changedLevel < originalLevel) {
                    query = new Query {
                        Id = queryId++,
                        QueryText = "Has patient explained this drop of happiness level?",
                        QueryAuthor = GetClinicSupervisor(happinessFormPair.ChangedHappinessData.Form.Visit.Patient),
                        QueryTime = GetRandomQueryTime(happinessFormPair.ChangedHappinessData),
                        AnswerAuthor = null,
                        AnswerText = null,
                        AnswerTime = null,
                        Question = happinessFormPair.ChangedHappinessData.HappinessLevel
                    };
                    list.Add(query);
                }

                if(originalLevel == 0) {
                    query = new Query {
                        Id = queryId++,
                        QueryText = "Has patient given the reason of so unhappy state?",
                        QueryAuthor = GetClinicSupervisor(happinessFormPair.OriginalHappinessData.Form.Visit.Patient),
                        QueryTime = GetRandomQueryTime(happinessFormPair.OriginalHappinessData),
                        AnswerAuthor = null,
                        AnswerText = null,
                        AnswerTime = null,
                        Question = happinessFormPair.OriginalHappinessData.HappinessLevel
                    };
                    list.Add(query);
                }
            }
        }
        private void AddDemographicQueries(List<Query> list)
        {
            Query query;
            int dice;
            foreach (var data in DemographicFormDatas) {
                dice = randomGenerator.Next(100);
                if (data.Race.Value == ((int)Race.Other).ToString() && (dice < 80)) {
                    query = new Query {
                        Id = queryId++,
                        QueryText = "Please specify the Patient's Race in 'Other' field",
                        QueryAuthor = GetClinicSupervisor(data.Form.Visit.Patient),
                        QueryTime = GetRandomQueryTime(data),
                        AnswerAuthor = null,
                        AnswerText = null,
                        AnswerTime = null,
                        Question = data.Race
                    };

                    dice = randomGenerator.Next(100);
                    if (dice > 80) {
                        query.AnswerAuthor = data.Form.Visit.Patient.Doctor;
                        query.AnswerText = "We will contact patient to confirm race";
                        query.AnswerTime = query.QueryTime.AddHours(randomGenerator.Next(5) + 1);
                    }
                    list.Add(query);
                }
            }
        }
            private void PrepareQueriesReportData()
            {
                supervisor1000 = new User {Id = 1000, FirstName = "First1000", LastName = "Last1000"};
                supervisor2000 = new User {Id = 2000, FirstName = "First2000", LastName = "Last2000"};

                doctor1 = new User {Id = 1, FirstName = "First1", LastName = "Last1"};
                doctor2 = new User {Id = 2, FirstName = "First2", LastName = "Last2"};
                doctor3 = new User {Id = 3, FirstName = "First3", LastName = "Last3"};

                form11 = new Form {Id = 11, Caption = "CRF11"};
                form12 = new Form {Id = 12, Caption = "CRF12"};
                form13 = new Form {Id = 13, Caption = "CRF13"};

                form21 = new Form {Id = 21, Caption = "CRF21"};
                form22 = new Form {Id = 22, Caption = "CRF22"};

                form31 = new Form {Id = 31, Caption = "CRF31"};
                form32 = new Form {Id = 32, Caption = "CRF32"};
                form33 = new Form {Id = 33, Caption = "CRF33"};
                form34 = new Form {Id = 34, Caption = "CRF34"};
                form35 = new Form {Id = 35, Caption = "CRF35"};

                question111 = new Question {Id = 111, Caption = "Question111", Form = form11};

                question121 = new Question {Id = 121, Caption = "Question121", Form = form12};
                question122 = new Question {Id = 122, Caption = "Question122", Form = form12};

                question211 = new Question {Id = 211, Caption = "Question211", Form = form21};
                question212 = new Question {Id = 212, Caption = "Question212", Form = form21};
                question213 = new Question {Id = 213, Caption = "Question213", Form = form21};

                question311 = new Question {Id = 311, Caption = "Question311", Form = form31};
                question321 = new Question {Id = 321, Caption = "Question321", Form = form32};
                question331 = new Question {Id = 331, Caption = "Question331", Form = form33};
                question341 = new Question {Id = 341, Caption = "Question341", Form = form34};
                question351 = new Question {Id = 351, Caption = "Question351", Form = form35};

                query1110 = new Query { Id = 1110, Question = question111, QueryAuthor = supervisor1000, QueryTime = DateTime.Today.AddDays(-1110), QueryText = "Query1110", AnswerAuthor = doctor1, AnswerText = "Reply1110", AnswerTime = DateTime.Today.AddDays(1110)};
                query1210 = new Query { Id = 1210, Question = question121, QueryAuthor = supervisor2000, QueryTime = DateTime.Today.AddDays(-1210), QueryText = "Query1210", AnswerAuthor = doctor1, AnswerText = "Reply1210", AnswerTime = DateTime.Today.AddDays(1210) };
                query1220 = new Query { Id = 1220, Question = question122, QueryAuthor = supervisor1000, QueryTime = DateTime.Today.AddDays(-1220), QueryText = "Query1220", AnswerAuthor = doctor1, AnswerText = "Reply1220", AnswerTime = DateTime.Today.AddDays(1220) };
                query2110 = new Query { Id = 2110, Question = question211, QueryAuthor = supervisor2000, QueryTime = DateTime.Today.AddDays(-2110), QueryText = "Query2110", AnswerAuthor = doctor2, AnswerText = "Reply2110", AnswerTime = DateTime.Today.AddDays(2110) };
                query2120 = new Query { Id = 2120, Question = question212, QueryAuthor = supervisor1000, QueryTime = DateTime.Today.AddDays(-2120), QueryText = "Query2120", AnswerAuthor = doctor2, AnswerText = "Reply2120", AnswerTime = DateTime.Today.AddDays(2120) };
                query2130 = new Query { Id = 2130, Question = question213, QueryAuthor = supervisor2000, QueryTime = DateTime.Today.AddDays(-2130), QueryText = "Query2130", AnswerAuthor = doctor2, AnswerText = "Reply2130", AnswerTime = DateTime.Today.AddDays(2130) };
                query3110 = new Query { Id = 3110, Question = question311, QueryAuthor = supervisor1000, QueryTime = DateTime.Today.AddDays(-3110), QueryText = "Query3110"};
                query3210 = new Query { Id = 3210, Question = question321, QueryAuthor = supervisor2000, QueryTime = DateTime.Today.AddDays(-3210), QueryText = "Query3210"};
                query3310 = new Query { Id = 3310, Question = question331, QueryAuthor = supervisor1000, QueryTime = DateTime.Today.AddDays(-3310), QueryText = "Query3310"};
                query3410 = new Query { Id = 3410, Question = question341, QueryAuthor = supervisor2000, QueryTime = DateTime.Today.AddDays(-3410), QueryText = "Query3410"};
                query3510 = new Query { Id = 3510, Question = question351, QueryAuthor = supervisor1000, QueryTime = DateTime.Today.AddDays(-3510), QueryText = "Query3510"};
            }
            private void CheckQueryData(DataRow dataRow, Query query, bool wReply = true)
            {
                Assert.That(dataRow is QueriesReportDataSet.QueriesRow);
                var row = dataRow as QueriesReportDataSet.QueriesRow;
                Assert.That(row, Is.Not.Null);
                Assert.That(row.QueryId, Is.EqualTo(query.Id));
                Assert.That(row.CRF, Is.EqualTo(query.Question.Form.Caption));
                Assert.That(row.Question, Is.EqualTo(query.Question.Caption));
                Assert.That(row.QueryAuthor, Is.EqualTo(String.Format("{0} {1}", query.QueryAuthor.FirstName, query.QueryAuthor.LastName)));
                Assert.That(row.QueryTime, Is.EqualTo(query.QueryTime.ToString("MM/dd/yyyy HH:mm")));
                Assert.That(row.QueryText, Is.EqualTo(query.QueryText));

                if (wReply) {
                    Assert.That(row.ReplyAuthor, Is.EqualTo(String.Format("{0} {1}", query.AnswerAuthor.FirstName, query.AnswerAuthor.LastName)));
                    Assert.That(row.ReplyTime, Is.EqualTo(query.AnswerTime.Value.ToString("MM/dd/yyyy HH:mm")));
                    Assert.That(row.ReplyText, Is.EqualTo(query.AnswerText));
                }
                else {
                    Assert.That(String.IsNullOrEmpty(row.ReplyAuthor), Is.True);
                    Assert.That(row.ReplyTime, Is.EqualTo(String.Empty));
                    Assert.That(String.IsNullOrEmpty(row.ReplyText), Is.True);
                }
            }
        public void MappingTest()
        {
            //Arrange
            var dataStorage = new Mock<IDataStorage>();
            var entity = new Query {
                Id = 1,
                AnswerAuthor = new User {Id = 11},
                AnswerText = "oldAnswer",
                QueryAuthor = new User {Id = 12},
                QueryText = "oldQuestion"
            };
            var updatedEntity = new Query {
                Id = 1,
                AnswerAuthor = new User {Id = 21},
                AnswerText = "newAnswer",
                QueryAuthor = new User {Id = 22},
                QueryText = "newQuestion"
            };
            var repository = new QueryRepository(dataStorage.Object);

            dataStorage.Setup(ds => ds.GetData<Query>()).Returns(new List<Query> {entity});
            //Act
            repository.Edit(updatedEntity);
            //Assert
            //Values are equal
            Assert.That(entity.AnswerAuthor, Is.EqualTo(updatedEntity.AnswerAuthor));
            Assert.That(entity.AnswerText, Is.EqualTo(updatedEntity.AnswerText));

            Assert.That(entity.QueryAuthor, Is.EqualTo(updatedEntity.QueryAuthor));
            Assert.That(entity.QueryText, Is.EqualTo(updatedEntity.QueryText));
        }
            public void CorrectModelMapping()
            {
                //Arrange
                var dataStorage = new Mock<IDataStorage>();
                var repository = new QueryRepository(dataStorage.Object);

                var clinic = new Clinic {Caption = "Clinic"};
                var doctor = new User {FirstName = "DoctorFirst", LastName = "DoctorLast", Clinic = clinic};
                var patient = new Patient {Doctor = doctor};
                var visit = new Visit {Caption = "Visit", Patient = patient};
                var form1 = new Form {FormType = FormType.Happiness, Visit = visit};
                var question1 = new Question {Caption = "QuestionCaption1", Form = form1};
                var query1 = new Query {Id = 1, Question = question1};

                var form2 = new Form {FormType = FormType.Inventory, Visit = visit};
                var question2 = new Question {Caption = "QuestionCaption2", Form = form2};
                var query2 = new Query {Id = 2, Question = question2, AnswerText = "Answer"};

                dataStorage.Setup(ds => ds.GetData<Query>()).Returns(new List<Query> {query1, query2});

                //Act
                var result = repository.GetQueriesReportData();

                //Assert
                Assert.That(result, Is.Not.Null);
                Assert.That(result.Count(), Is.EqualTo(2));
                var dto = result.ToList()[0];
                Assert.That(dto.FormType, Is.EqualTo(FormType.Happiness));
                Assert.That(dto.ClinicName, Is.EqualTo("Clinic"));
                Assert.That(dto.DoctorName, Is.EqualTo("DoctorFirst DoctorLast"));
                Assert.That(dto.QuestionName, Is.EqualTo("QuestionCaption1"));
                Assert.That(dto.IsOpen, Is.True);

                dto = result.ToList()[1];
                Assert.That(dto.FormType, Is.EqualTo(FormType.Inventory));
                Assert.That(dto.ClinicName, Is.EqualTo("Clinic"));
                Assert.That(dto.DoctorName, Is.EqualTo("DoctorFirst DoctorLast"));
                Assert.That(dto.QuestionName, Is.EqualTo("QuestionCaption2"));
                Assert.That(dto.IsOpen, Is.False);
            }
 private static Query GetStandardQuery(int queryId)
 {
     var query = new Query {
         Id = queryId,
         QueryText = "text",
         QueryAuthor = new User() {
             Role = ClinicalStudyRoles.Supervisor,
             LastName = "Smith",
             Photo = new byte[]{1,2,3},
         },
         AnswerText = "Big and accurate answer",
         AnswerAuthor = new User() {
             Role = ClinicalStudyRoles.Doctor,
             LastName = "Johnson",
             Photo = new byte[]{11,12,13}
         },
         Question = new Question {
             Id = 11,
             Caption = "Temperature",
             Form = new Form() {
                 Caption = "Demographics",
                 Visit = new Visit {
                     Caption = "Baseline",
                     Patient = new Patient {
                         Caption = "Subj A025",
                         PatientNumber = 25,
                         Doctor = new User { Login = CommonEmulatedUserName }
                     }
                 }
             }
         }
     };
     return query;
 }