public void EstablishAvailability_OneErroredDataCooker()
        {
            var cooker0 = new TestSourceDataCookerReference
            {
                Path = new DataCookerPath("TestSourceParser", "Cooker0"),
            };

            var cooker1 = new TestSourceDataCookerReference(false)
            {
                Path         = new DataCookerPath("TestSourceParser", "Cooker1"),
                availability = DataExtensionAvailability.Error,
            };

            var testRepo = new TestDataExtensionRepository();

            testRepo.sourceCookersByPath.Add(cooker0.Path, cooker0);
            testRepo.sourceCookersByPath.Add(cooker1.Path, cooker1);

            cooker0.requiredDataCookers.Add(new DataCookerPath(cooker1.Path));

            cooker0.ProcessDependencies(testRepo);

            Assert.IsTrue(cooker0.Availability == DataExtensionAvailability.IndirectError);
            Assert.AreEqual(cooker0.DependencyState.Errors.Count, 1);
            Assert.AreEqual(cooker0.DependencyReferences.RequiredSourceDataCookerPaths.Count, 1);
        }
        public void EstablishAvailability_ThrowsOnCircularReferences()
        {
            var cooker0 = new TestSourceDataCookerReference
            {
                Path = new DataCookerPath("TestSourceParser", "Cooker0"),
            };

            var cooker1 = new TestSourceDataCookerReference
            {
                Path = new DataCookerPath("TestSourceParser", "Cooker1"),
            };

            var cooker2 = new TestSourceDataCookerReference
            {
                Path = new DataCookerPath("TestSourceParser", "Cooker2"),
            };

            // the repository has all source cookers
            var testRepo = new TestDataExtensionRepository();

            testRepo.sourceCookersByPath.Add(cooker0.Path, cooker0);
            testRepo.sourceCookersByPath.Add(cooker1.Path, cooker1);
            testRepo.sourceCookersByPath.Add(cooker2.Path, cooker2);

            // setup the requirements for the cookers
            cooker0.requiredDataCookers.Add(cooker1.Path);
            cooker1.requiredDataCookers.Add(cooker2.Path);
            cooker2.requiredDataCookers.Add(cooker0.Path);

            cooker0.ProcessDependencies(testRepo);

            Assert.IsTrue(cooker0.Availability == DataExtensionAvailability.Error);
            Assert.AreEqual(cooker0.DependencyState.Errors.Count, 1);
        }
        public void FinalizeTablesFromVariedParsers()
        {
            // Just make sure that this doesn't throw an exception

            var cdp = TestCustomDataProcessor.CreateTestCustomDataProcessor(TestTable1.SourceParserId);

            var sourceCooker = new TestSourceDataCooker()
            {
                Path = new DataCookerPath(TestTable2.SourceParserId, "CookerId1")
            };
            var sourceCookerReference = new TestSourceDataCookerReference(false)
            {
                availability = DataExtensionAvailability.Available, Path = sourceCooker.Path
            };

            cdp.ExtensionRepository.sourceCookersByPath.Add(sourceCooker.Path, sourceCookerReference);

            Assert.IsTrue(cdp.ExtensibilitySupport.AddTable(TestTable2.TableDescriptor));

            cdp.ExtensibilitySupport.FinalizeTables();

            var requiredCookers = cdp.ExtensibilitySupport.GetAllRequiredSourceDataCookers();

            Assert.AreEqual(0, requiredCookers.Count);

            var dataRetrieval = cdp.ExtensibilitySupport.GetDataExtensionRetrieval(TestTable2.TableDescriptor);

            Assert.IsNull(dataRetrieval);
        }
        public void EstablishAvailability_NoDependencies()
        {
            var testRepo = new TestDataExtensionRepository();

            var cooker0 = new TestSourceDataCookerReference
            {
                Path = new DataCookerPath("TestSourceParser", "Cooker0"),
            };

            cooker0.ProcessDependencies(testRepo);

            Assert.IsTrue(cooker0.Availability == DataExtensionAvailability.Available);
            Assert.AreEqual(cooker0.DependencyState.Errors.Count, 0);
            Assert.AreEqual(cooker0.DependencyReferences.RequiredSourceDataCookerPaths.Count, 0);
        }
        public void CreateDataRetrievalForTableSucceeds()
        {
            var cookedDataRetrieval     = new TestCookedDataRetrieval();
            var dataExtensionRepository = new TestDataExtensionRepository();

            var sourceDataCookerReference1 = new TestSourceDataCookerReference(false)
            {
                availability = DataExtensionAvailability.Available,
                Path         = new DataCookerPath("Source1", "SourceCooker1"),
            };

            var dataCookerReference = new TestCompositeDataCookerReference(false)
            {
                availability = DataExtensionAvailability.Available,
                Path         = new DataCookerPath("CompositeCooker1"),
            };

            dataCookerReference.requiredDataCookers.Add(sourceDataCookerReference1.Path);

            var tableReference = new TestTableExtensionReference(false)
            {
                availability    = DataExtensionAvailability.Available,
                TableDescriptor = new TableDescriptor(
                    Guid.Parse("{F0F20004-E159-447B-B122-BD820C2A9908}"), "Test Table", "Test Table"),
            };

            dataExtensionRepository.sourceCookersByPath.Add(sourceDataCookerReference1.Path, sourceDataCookerReference1);
            dataExtensionRepository.compositeCookersByPath.Add(dataCookerReference.Path, dataCookerReference);
            dataExtensionRepository.tablesById.Add(tableReference.TableDescriptor.Guid, tableReference);

            var dataExtensionRetrievalFactory =
                new DataExtensionRetrievalFactory(cookedDataRetrieval, dataExtensionRepository);

            var dataRetrieval = dataExtensionRetrievalFactory.CreateDataRetrievalForTable(tableReference.TableDescriptor.Guid);

            Assert.IsNotNull(dataRetrieval);

            // check that the cache is working as expected

            var dataRetrieval2 = dataExtensionRetrievalFactory.CreateDataRetrievalForTable(tableReference.TableDescriptor.Guid);

            Assert.IsNotNull(dataRetrieval2);
            Assert.IsTrue(object.ReferenceEquals(dataRetrieval, dataRetrieval2));
        }
        public void GetDataExtensionRetrievalWithoutFinalizeThrows()
        {
            // Just make sure that this doesn't throw an exception

            var cdp = TestCustomDataProcessor.CreateTestCustomDataProcessor(TestTable1.SourceParserId);

            var sourceCooker = new TestSourceDataCooker()
            {
                Path = new DataCookerPath(TestTable1.SourceParserId, "CookerId1")
            };
            var sourceCookerReference = new TestSourceDataCookerReference(false)
            {
                availability = DataExtensionAvailability.Available, Path = sourceCooker.Path
            };

            cdp.ExtensionRepository.sourceCookersByPath.Add(sourceCooker.Path, sourceCookerReference);

            Assert.IsTrue(cdp.ExtensibilitySupport.AddTable(TestTable1.TableDescriptor));

            Assert.ThrowsException <InvalidOperationException>(() => cdp.ExtensibilitySupport.GetDataExtensionRetrieval(TestTable1.TableDescriptor));
        }
        public void EstablishAvailability_MissingDependency()
        {
            var cooker0 = new TestSourceDataCookerReference
            {
                Path = new DataCookerPath("TestSourceParser", "Cooker0"),
            };

            // the repository has all source cookers
            var testRepo = new TestDataExtensionRepository();

            testRepo.sourceCookersByPath.Add(cooker0.Path, cooker0);

            // setup the requirements for the cookers
            cooker0.requiredDataCookers.Add(new DataCookerPath("TestSourceParser", "Cooker1"));

            cooker0.ProcessDependencies(testRepo);

            Assert.IsTrue(cooker0.Availability == DataExtensionAvailability.MissingRequirement);
            Assert.AreEqual(cooker0.DependencyState.Errors.Count, 0);
            Assert.AreEqual(cooker0.DependencyState.MissingDataCookers.Count, 1);
            Assert.AreEqual(cooker0.DependencyReferences.RequiredSourceDataCookerPaths.Count, 0);
        }
        public void EstablishAvailability_DataProcessorReliesOnAvailableDataCookers()
        {
            var dataProcessor = new TestDataProcessorReference
            {
                Id = "DataProcessor",
            };

            var cooker0 = new TestSourceDataCookerReference
            {
                Path = new DataCookerPath("TestSource0", "Cooker0"),
            };

            var cooker1 = new TestCompositeDataCookerReference
            {
                Path = new DataCookerPath(DataCookerPath.EmptySourceParserId, "Cooker0"),
            };

            var testRepo = new TestDataExtensionRepository();

            testRepo.sourceCookersByPath.Add(cooker0.Path, cooker0);
            testRepo.compositeCookersByPath.Add(cooker1.Path, cooker1);

            // setup the requirements
            dataProcessor.requiredDataCookers.Add(cooker0.Path);
            dataProcessor.requiredDataCookers.Add(cooker1.Path);

            dataProcessor.ProcessDependencies(testRepo);

            Assert.IsTrue(cooker0.Availability == DataExtensionAvailability.Available);
            Assert.IsTrue(cooker1.Availability == DataExtensionAvailability.Available);
            Assert.IsTrue(dataProcessor.Availability == DataExtensionAvailability.Available);

            Assert.AreEqual(dataProcessor.DependencyState.Errors.Count, 0);
            Assert.AreEqual(dataProcessor.DependencyReferences.RequiredSourceDataCookerPaths.Count, 1);
            Assert.AreEqual(dataProcessor.DependencyReferences.RequiredCompositeDataCookerPaths.Count, 1);
            Assert.AreEqual(dataProcessor.DependencyState.MissingDataCookers.Count, 0);
        }
        public void EstablishAvailability_PerformAdditionalValidationIsCalled()
        {
            var cooker0 = new TestSourceDataCookerReference
            {
                Path = new DataCookerPath("TestSourceParser0", "Cooker0"),
            };

            var cooker1 = new TestSourceDataCookerReference
            {
                Path = new DataCookerPath("TestSourceParser1", "Cooker1"),
            };

            var testRepo = new TestDataExtensionRepository();

            testRepo.sourceCookersByPath.Add(cooker0.Path, cooker0);
            testRepo.sourceCookersByPath.Add(cooker1.Path, cooker1);

            cooker0.requiredDataCookers.Add(new DataCookerPath(cooker1.Path));

            cooker0.ProcessDependencies(testRepo);

            Assert.IsTrue(cooker0.Availability == DataExtensionAvailability.Error);
            Assert.AreEqual(cooker0.DependencyState.Errors.Count, 1);
        }
        public void CreateDataRetrievalForCompositeDataCookerSucceeds()
        {
            var cookedDataRetrieval     = new TestCookedDataRetrieval();
            var dataExtensionRepository = new TestDataExtensionRepository();

            var sourceDataCookerReference1 = new TestSourceDataCookerReference(false)
            {
                availability = DataExtensionAvailability.Available,
                Path         = new DataCookerPath("Source1", "SourceCooker1"),
            };

            var dataCookerReference = new TestCompositeDataCookerReference(false)
            {
                availability = DataExtensionAvailability.Available,
                Path         = new DataCookerPath("CompositeCooker1"),
            };

            dataCookerReference.requiredDataCookers.Add(sourceDataCookerReference1.Path);

            dataExtensionRepository.sourceCookersByPath.Add(sourceDataCookerReference1.Path, sourceDataCookerReference1);
            dataExtensionRepository.compositeCookersByPath.Add(dataCookerReference.Path, dataCookerReference);

            var dataExtensionRetrievalFactory =
                new DataExtensionRetrievalFactory(cookedDataRetrieval, dataExtensionRepository);

            var dataRetrieval = dataExtensionRetrievalFactory.CreateDataRetrievalForCompositeDataCooker(dataCookerReference.Path);

            Assert.IsNotNull(dataRetrieval);

            // check that the cache is working as expected

            var dataRetrieval2 = dataExtensionRetrievalFactory.CreateDataRetrievalForCompositeDataCooker(dataCookerReference.Path);

            Assert.IsNotNull(dataRetrieval2);
            Assert.IsTrue(object.ReferenceEquals(dataRetrieval, dataRetrieval2));
        }