public IEnumerable<ResultMessageViewModel> ExecuteQualityAssuranceChain(QualityCheckingExecuteDataViewModel data)
        {
            var resultMessages = new List<ResultMessageViewModel>();

            if (data != null)
            {
                var qcChainConfiguration = MapTOChainConfiguration(data);

                var versioningHelper = new DataVersioningHelper(_wqDefaultValueProvider);
                var factory = new DataQualityCheckingToolFactory(versioningHelper, _relatedActionTypeRepository);
                var qualiltyChecker = new WaterQualityDataQualityChecker(qcChainConfiguration, factory, _wqDataRepository);

                var qcResults = qualiltyChecker.Check();

                var resultViewModels = Mapper.Map<IEnumerable<IQualityCheckingResult>, IEnumerable<ResultMessageViewModel>>(qcResults);

                resultMessages.AddRange(resultViewModels);
            }
            else
            {
                resultMessages.Add(new ResultMessageViewModel(ResultMessageViewModel.RESULT_LEVEL_FATAL, 
                                                              "QC request data is null. No QC process could be applied."));
            }

            return resultMessages;
            
        }
        public static void Main(string[] args)
        {
            var dbContext = new ODM2Entities();

            var relationActionTypeRepository = new Repository<CV_RelationshipType>(dbContext);
            var wqDataRepository = new WQDataRepository(dbContext);

            var staticWQDefaultValueProvider = new StaticWQDefaultValueProvider();
            staticWQDefaultValueProvider.Init();

            Console.WriteLine("Start Quality Checking Process...");

            var qcChainConfiguration = ConfigureQualityCheckingChain(true, wqDataRepository, "Test", false, "Water");

            var versioningHelper = new DataVersioningHelper(staticWQDefaultValueProvider);
            var factory = new DataQualityCheckingToolFactory(versioningHelper, relationActionTypeRepository);
            var qualiltyChecker = new WaterQualityDataQualityChecker(qcChainConfiguration, factory, wqDataRepository);

            var qcResults = qualiltyChecker.Check();

            foreach(var result in qcResults)
            {
                Console.WriteLine(string.Format("{0}: {1}", result.Level, result.Message));
            
            }

            Console.WriteLine("Press any keys to continue...");
            Console.ReadLine();
        }
        public void CompleteDataChecking()
        {
            var mockCriteria = new Mock<IDataFetchCriteria>();
            mockCriteria.Setup(x => x.CriteriaDescription).Returns("test data fetch criteria");
            mockCriteria.Setup(x => x.FetchData()).Returns(() => new List<Hatfield.EnviroData.Core.Action> { 
                new Hatfield.EnviroData.Core.Action()
            });

            var mockRule = new Mock<IDataQualityCheckingRule>();

            var testChainConfiguration = new DataQualityCheckingChainConfiguration();
            testChainConfiguration.DataFetchCriteria = mockCriteria.Object;
            testChainConfiguration.NeedToCorrectData = true;
            testChainConfiguration.ToolsConfiguration = new List<DataQualityCheckingToolConfiguration> { 
                new DataQualityCheckingToolConfiguration{
                    DataQualityCheckingToolType = typeof(int),
                    DataQualityCheckingRule = mockRule.Object
                }
            };

            var mockTool = new Mock<IDataQualityCheckingTool>();
            mockTool.Setup(x => x.Check(It.IsAny<object>(), It.IsAny<IDataQualityCheckingRule>())).Returns(
                () => new QualityCheckingResult("test qc result.", true, QualityCheckingResultLevel.Info)    
            );
            mockTool.Setup(x => x.Correct(It.IsAny<object>(), It.IsAny<IDataQualityCheckingRule>())).Returns(
                () => new QualityCheckingResult("Data correction updated.", false, QualityCheckingResultLevel.Info)
            );

            var factory = new Mock<IDataQualityCheckingToolFactory>();
            factory.Setup(x => x.GenerateDataQualityCheckingTool(It.IsAny<DataQualityCheckingToolConfiguration>())).Returns(() => mockTool.Object);
            var repository = new Mock<IWQDataRepository>();

            var dataChecker = new WaterQualityDataQualityChecker(testChainConfiguration, factory.Object, repository.Object);

            var qcResults = dataChecker.Check();

            Assert.NotNull(qcResults);
            Assert.AreEqual(3, qcResults.Count());

            Assert.AreEqual("Fetch data for quality chekcing by test data fetch criteria", qcResults.ElementAt(0).Message);
            Assert.AreEqual(QualityCheckingResultLevel.Info, qcResults.ElementAt(0).Level);
            Assert.False(qcResults.ElementAt(0).NeedCorrection);

            Assert.AreEqual("test qc result.", qcResults.ElementAt(1).Message);
            Assert.AreEqual(QualityCheckingResultLevel.Info, qcResults.ElementAt(1).Level);
            Assert.True(qcResults.ElementAt(1).NeedCorrection);

            Assert.AreEqual("Data correction updated.", qcResults.ElementAt(2).Message);
            Assert.AreEqual(QualityCheckingResultLevel.Info, qcResults.ElementAt(2).Level);
            Assert.False(qcResults.ElementAt(2).NeedCorrection);

        }
        public void NoDataTest()
        {
            var noDataCriteria = new Mock<IDataFetchCriteria>();
            noDataCriteria.Setup(x => x.CriteriaDescription).Returns("test data fetch criteria");
            noDataCriteria.Setup(x => x.FetchData()).Returns(() => null);

            var testChainConfiguration = new DataQualityCheckingChainConfiguration();
            testChainConfiguration.DataFetchCriteria = noDataCriteria.Object;

            var factory = new Mock<IDataQualityCheckingToolFactory>();
            var repository = new Mock<IWQDataRepository>();

            var dataChecker = new WaterQualityDataQualityChecker(testChainConfiguration, factory.Object, repository.Object);

            var noDataQcResults = dataChecker.Check();

            Assert.NotNull(noDataQcResults);
            Assert.AreEqual(2, noDataQcResults.Count());
        }