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

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

            var testRepo = new TestDataExtensionRepository();

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

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

            cooker0.ProcessDependencies(testRepo);

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

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

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

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

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

            var dataExtensionRetrievalFactory =
                new DataExtensionRetrievalFactory(cookedDataRetrieval, dataExtensionRepository);

            Assert.ThrowsException <ArgumentException>(() =>
                                                       dataExtensionRetrievalFactory.CreateDataRetrievalForTable(tableReference.TableDescriptor.Guid));
        }
        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 CreateDataRetrievalForCompositeDataCooker_NotAvailableCookerThrows()
        {
            var cookedDataRetrieval     = new TestCookedDataRetrieval();
            var dataExtensionRepository = new TestDataExtensionRepository();

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

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

            var dataExtensionRetrievalFactory =
                new DataExtensionRetrievalFactory(cookedDataRetrieval, dataExtensionRepository);

            Assert.ThrowsException <ArgumentException>(() =>
                                                       dataExtensionRetrievalFactory.CreateDataRetrievalForCompositeDataCooker(dataCookerReference.Path));
        }
        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 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));
        }