public void Initialize()
 {
     AutoMapperConfigurator.Configure();
     _repositoryMock = new Mock<IRepository<StoredStudy>>();
     _storedStudy = new StoredStudy(); { }; // TODO insert data 
     _study = new Study { }; // TODO insert data 
 }
        public async Task CreateStudy_Null_ErrorThrown()
        {
            // Arrange 
            var study = new StoredStudy {}; // Todo Fill in data 

            // Act 
            await _repository.Create(null);

            _context.Studies.Should().HaveCount(0);
            _context.Studies.First().Should().Be(null);
        }
        public async Task InsertStudy_ValidStudy_StudyWasAddedCorrectly()
        {
            // Arrange
            const string studyName = "study"; // Todo add all properties 

            var study = new StoredStudy {Name = studyName}; // Add properties 

            // Act
            await _repository.Create(study);

            // Assert
            _context.Studies.Should().HaveCount(1);
            _context.Studies.First().Should().NotBeNull();
            _context.Studies.First().Name.Should().Be(studyName);
        }
        public void GetAllStudies_Valid_ReturnsCorrectStudies_Test()
        {
            // TODO add property values 
            //Arrange
            var study1 = new StoredStudy { };
            var study2 = new StoredStudy { };
            var study3 = new StoredStudy { };
            var studyList = new List<StoredStudy> { study1, study2, study3 }.AsQueryable();

            _repositoryMock.Setup(r => r.Read()).Returns(studyList);
            var adapter = new StudyAdapter(_repositoryMock.Object);

            //Act
            var result = adapter.Read();
            var actualStudies = result.ToList();

            //Assert
            var counter = 0;
            foreach (var actualStudy in studyList.AsEnumerable())
            {
                var returnedStudy = actualStudies[counter];
                // Todo add property asserts 
                Assert.IsTrue(returnedStudy.Name == actualStudy.Name);
                counter++;
            }

        }
        public void GetAllStudies_Valid_ReturnsCorrectNumberOfStudies_Test()
        {
            //Arrange
            var study1 = new StoredStudy(); { };
            var study2 = new StoredStudy(); { };
            var study3 = new StoredStudy(); { };
            var studyList = new List<StoredStudy> { study1, study2, study3 }.AsQueryable();

            _repositoryMock.Setup(r => r.Read()).Returns(studyList);
            var adapter = new StudyAdapter(_repositoryMock.Object);
            const int expectedCount = 3;

            //Act
            var result = adapter.Read();
            var actualCount = result.ToList().Count;

            //Assert
            Assert.IsTrue(expectedCount == actualCount);
        }
        [TestMethod, ExpectedException(typeof(DbEntityValidationException))] // Assert 
        public async Task InsertStudy_InvalidStudy_RequiredNameMissing()
        {
            // Arrange
            var study = new StoredStudy {}; // Todo add data 

            // Act
            await _repository.Create(study);

            // Assert
            _context.Studies.Should().HaveCount(0);
            _context.Studies.First().Should().BeNull();
            _context.Studies.First().Name.Should().Be(null);
        }
        public async Task InsertStudy_WithPhases_SavesPhasesInDatabase()
        {
            // Arrange 
            var phases = StudyTestData.CreatePhases();

            var study = new StoredStudy
            {
                Name = "StudyName",
                Phases = phases
            };

            // Act 
            await _repository.Create(study);

            // Assert
            _context.Studies.Should().HaveCount(1);
            _context.Studies.Should().NotBeNull();
            _context.Phases.Should().HaveCount(3);
            _context.Phases.First().Should().NotBeNull(); // Todo range 
        }
        public async Task InsertStudy_WithAllProperties_SavesAllEntitiesInDatabase()
        {
            // Arrange
            var study = new StoredStudy
            {
                Name = "StudyName",
                DataFields = StudyTestData.CreateDatafields(),
                Description = "StudyDescription",
                ExclusionCriteria = StudyTestData.CreateExclusionCriteria(),
                InclusionCriteria = StudyTestData.CreateInclusionCriteria(),
                Papers = StudyTestData.CreatePapers(),
                Phases = StudyTestData.CreatePhases(),
                Users = StudyTestData.CreateUsers()
            };

            // Act
            await _repository.Create(study);
            
            // Assert
            _context.Studies.Should().NotBeNull();
            _context.Datafields.Should().NotBeNull();
            _context.Criteria.Should().NotBeNull();
            _context.Papers.Should().NotBeNull();
            _context.Phases.Should().NotBeNull();
            _context.Users.Should().NotBeNull();
        }
        public async Task InsertStudy_WithCriteria_SavesCriteriaInDatabase()
        {
            // Arrange 
            var inclusionCriteria = StudyTestData.CreateInclusionCriteria(); // 3 items 
            var exclusionCriteria = StudyTestData.CreateExclusionCriteria(); // 3 items 
            var study = new StoredStudy { Name = "StudyName", InclusionCriteria = inclusionCriteria, ExclusionCriteria = exclusionCriteria };

            // Act 
            await _repository.Create(study);

            // Assert
            _context.Studies.Should().HaveCount(1);
            _context.Studies.Should().NotBeNull();
            _context.Criteria.Should().HaveCount(6);
            _context.Criteria.First().Should().NotBeNull(); // Todo range 
        }
        public async Task InsertStudy_WithUsers_SavesUsersInDatabase()
        {
            // Arrange 
            var users = StudyTestData.CreateUsers(); // 3 users 
            var study = new StoredStudy { Name = "StudyName", Users = users };

            // Act 
            await _repository.Create(study);

            // Assert
            _context.Studies.Should().HaveCount(1);
            _context.Studies.Should().NotBeNull();
            _context.Users.Should().HaveCount(3);
            _context.Users.First().Should().NotBeNull(); ; // Todo range 
        }
        public async Task InsertStudy_WithDatafields_SavesDatafieldsInDatabase()
        {
            // Arrange 
            var datafields = StudyTestData.CreateDatafields();
            var study = new StoredStudy { Name = "StudyName", DataFields = datafields };

            // Act 
            await _repository.Create(study);

            // Assert
            _context.Studies.Should().HaveCount(1);
            _context.Studies.Should().NotBeNull();
            _context.Datafields.Should().HaveCount(1);
            _context.Datafields.First().Should().NotBeNull();
        }
        public async Task InsertStudy_WithPapers_SavesPapersInDatabase()
        {
            // Arrange 
            var papers = StudyTestData.CreatePapers();
            // var study = new StoredStudy { Name = "StudyName", Papers = papers };
            var study = new StoredStudy
            {
                Name = "StudyName",
                Papers = new List<StoredPaper>
                {
                    new StoredPaper {}
                }
            };

            // Act 
            await _repository.Create(study);

            // Assert
            _context.Studies.Should().HaveCount(1);
            _context.Studies.Should().NotBeNull();
            _context.Papers.Should().HaveCount(1);
            _context.Papers.First().Should().NotBeNull();
        }
        public void GetStudy_WithExistingId_ReturnsStudy()
        {
            // Arrange
            var study = new StoredStudy { Name = "StudyName" };
            _repository.Create(study);

            // Act
            var retrievedStudy = _repository.Read(study.Id).Result;

            // Assert
            study.Name.Should().Be(retrievedStudy.Name);
            study.Id.Should().Be(retrievedStudy.Id);
        }
        public async Task InsertStudy_InValidNameLength_ErrorThrown()
        {
            // Arrange 
            var validNameLength = new string(new char[51]);
            var study = new StoredStudy { Name = validNameLength };

            // Act 
            await _repository.Create(study);

            // Assert 
            _context.Studies.Should().HaveCount(0);
            _context.Studies.First().Should().BeNull();
        }
        public async Task InsertStudy_ValidNameLengthIsLimit_StudyIsCreated()
        {
            // Arrange 
            var validNameLength = new string(new char[50]);
            var study = new StoredStudy { Name = validNameLength };

            // Act 
            await _repository.Create(study);

            // Assert 
            _context.Studies.Should().HaveCount(1);
            _context.Studies.First().Should().NotBeNull();
            _context.Studies.First().Name.Should().Be(validNameLength);
        }