public void ExecuteSourceThatReturnsNullThrows()
        {
            var progress = new DataProcessorProgress();

            var fakeCustomDataSource = new MockCustomDataSource()
            {
                DataProcessor = null,
            };

            var dataSources = new[]
            {
                Any.DataSource(),
            };

            var tables = new[]
            {
                Any.TableDescriptor(),
                Any.TableDescriptor(),
                Any.TableDescriptor(),
            };

            var executionContext = new ExecutionContext(
                progress,
                _ => new NullLogger(),
                fakeCustomDataSource,
                dataSources,
                tables,
                Any.ProcessorEnvironment(),
                ProcessorOptions.Default);

            Assert.ThrowsException <InvalidOperationException>(
                () => this.Sut.InitializeCustomDataProcessor(executionContext));
        }
        public async Task ExecuteContextSetToArgument()
        {
            var progress = new DataProcessorProgress();

            var mockProcessor        = new MockCustomDataProcessor();
            var fakeCustomDataSource = new MockCustomDataSource
            {
                DataProcessor = mockProcessor,
            };

            var dataSources = new[]
            {
                Any.DataSource(),
            };

            var tables = new[]
            {
                Any.TableDescriptor(),
            };

            var executionContext = new ExecutionContext(
                progress,
                _ => new NullLogger(),
                fakeCustomDataSource,
                dataSources,
                tables,
                Any.ProcessorEnvironment(),
                ProcessorOptions.Default);

            this.Sut.InitializeCustomDataProcessor(executionContext);
            var result = await this.Sut.ExecuteAsync(CancellationToken.None);

            Assert.AreEqual(executionContext, result.Context);
        }
        public async Task ExecuteBuiltMetadataTablesReturned()
        {
            var progress = new DataProcessorProgress();

            var mockProcessor = new MockCustomDataProcessor
            {
                MetadataTablesToBuild = new[]
                {
                    Any.TableDescriptor(),
                Any.TableDescriptor(),
                Any.TableDescriptor(),
                }
            };

            var fakeCustomDataSource = new MockCustomDataSource()
            {
                DataProcessor = mockProcessor,
            };

            var dataSources = new[]
            {
                Any.DataSource(),
            };

            var tablesToEnable = new[]
            {
                Any.TableDescriptor(),
                Any.TableDescriptor(),
                Any.TableDescriptor(),
            };

            var executionContext = new ExecutionContext(
                progress,
                _ => new NullLogger(),
                fakeCustomDataSource,
                dataSources,
                tablesToEnable,
                Any.ProcessorEnvironment(),
                ProcessorOptions.Default);

            this.Sut.InitializeCustomDataProcessor(executionContext);
            var result = await this.Sut.ExecuteAsync(CancellationToken.None);

            Assert.AreEqual(mockProcessor.MetadataTablesToBuild.Count(), result.BuiltMetadataTables.Count);
            foreach (var table in mockProcessor.MetadataTablesToBuild)
            {
                Assert.IsTrue(result.BuiltMetadataTables.Select(x => x.TableDescriptor).Contains(table));
            }
        }
        public async Task ExecuteFailureToBuildMetadataTablesNoted()
        {
            var progress = new DataProcessorProgress();

            var mockProcessor = new MockCustomDataProcessor
            {
                MetadataTablesToBuild = new[]
                {
                    Any.TableDescriptor(),
                Any.TableDescriptor(),
                Any.TableDescriptor(),
                },
                BuildMetadataTableFailure = new Exception(),
            };

            var fakeCustomDataSource = new MockCustomDataSource()
            {
                DataProcessor = mockProcessor,
            };

            var dataSources = new[]
            {
                Any.DataSource(),
            };

            var tablesToEnable = new[]
            {
                Any.TableDescriptor(),
                Any.TableDescriptor(),
                Any.TableDescriptor(),
            };

            var executionContext = new ExecutionContext(
                progress,
                _ => new NullLogger(),
                fakeCustomDataSource,
                dataSources,
                tablesToEnable,
                Any.ProcessorEnvironment(),
                ProcessorOptions.Default);

            this.Sut.InitializeCustomDataProcessor(executionContext);
            var result = await this.Sut.ExecuteAsync(CancellationToken.None);

            Assert.AreEqual(0, result.BuiltMetadataTables.Count);
            Assert.AreEqual(mockProcessor.BuildMetadataTableFailure, result.MetadataTableFailure);
        }
        public async Task ExecuteEnableTableFailureNotedCorrectly()
        {
            var progress = new DataProcessorProgress();

            var mockProcessor        = new MockCustomDataProcessor();
            var fakeCustomDataSource = new MockCustomDataSource()
            {
                DataProcessor = mockProcessor,
            };

            var dataSources = new[]
            {
                Any.DataSource(),
            };

            var tables = new[]
            {
                Any.TableDescriptor(),
                Any.TableDescriptor(),
                Any.TableDescriptor(),
            };

            mockProcessor.EnableFailures[tables[1]] = new ArithmeticException();

            var executionContext = new ExecutionContext(
                progress,
                _ => new NullLogger(),
                fakeCustomDataSource,
                dataSources,
                tables,
                Any.ProcessorEnvironment(),
                ProcessorOptions.Default);

            this.Sut.InitializeCustomDataProcessor(executionContext);
            var result = await this.Sut.ExecuteAsync(CancellationToken.None);

            Assert.AreEqual(mockProcessor.EnableFailures.Count, result.EnableFailures.Count);
            foreach (var expectedFailure in mockProcessor.EnableFailures)
            {
                Assert.AreEqual(
                    expectedFailure.Value,
                    result.EnableFailures[expectedFailure.Key]);
            }
        }
        public async Task ExecuteProcessorFailsSetsFaultProperties()
        {
            var progress = new DataProcessorProgress();

            var mockProcessor = new MockCustomDataProcessor
            {
                ProcessFailure = new Exception(),
            };

            var fakeCustomDataSource = new MockCustomDataSource
            {
                DataProcessor = mockProcessor,
            };

            var dataSources = new[]
            {
                Any.DataSource(),
            };

            var tables = new[]
            {
                Any.TableDescriptor(),
            };

            var executionContext = new ExecutionContext(
                progress,
                _ => new NullLogger(),
                fakeCustomDataSource,
                dataSources,
                tables,
                Any.ProcessorEnvironment(),
                ProcessorOptions.Default);

            this.Sut.InitializeCustomDataProcessor(executionContext);
            var result = await this.Sut.ExecuteAsync(CancellationToken.None);

            Assert.IsNotNull(result);
            Assert.AreEqual(DataSourceInfo.None, result.DataSourceInfo);
            Assert.AreEqual(mockProcessor.ProcessFailure, result.ProcessorFault);
            Assert.IsTrue(result.IsProcessorFaulted);
        }
        public void ExecuteEnableTableFailureContinuesAnyway()
        {
            var progress = new DataProcessorProgress();

            var mockProcessor        = new MockCustomDataProcessor();
            var fakeCustomDataSource = new MockCustomDataSource()
            {
                DataProcessor = mockProcessor,
            };

            var dataSources = new[]
            {
                Any.DataSource(),
            };

            var tables = new[]
            {
                Any.TableDescriptor(),
                Any.TableDescriptor(),
                Any.TableDescriptor(),
            };

            mockProcessor.EnableFailures[tables[1]] = new Exception();

            var executionContext = new ExecutionContext(
                progress,
                _ => new NullLogger(),
                fakeCustomDataSource,
                dataSources,
                tables,
                Any.ProcessorEnvironment(),
                ProcessorOptions.Default);

            this.Sut.InitializeCustomDataProcessor(executionContext);

            Assert.AreEqual(tables.Length, mockProcessor.EnableTableCalls.Count);
            foreach (var table in tables)
            {
                Assert.IsTrue(mockProcessor.EnableTableCalls.Contains(table));
            }
        }
        public void ExecutePassesEnvironmentToProcessor()
        {
            var progress = new DataProcessorProgress();

            var mockProcessor        = new MockCustomDataProcessor();
            var fakeCustomDataSource = new MockCustomDataSource()
            {
                DataProcessor = mockProcessor,
            };

            var dataSources = new[]
            {
                Any.DataSource(),
            };

            var tables = new[]
            {
                Any.TableDescriptor(),
                Any.TableDescriptor(),
                Any.TableDescriptor(),
            };

            var env     = Any.ProcessorEnvironment();
            var options = ProcessorOptions.Default;

            var executionContext = new ExecutionContext(
                progress,
                _ => new NullLogger(),
                fakeCustomDataSource,
                dataSources,
                tables,
                env,
                options);

            this.Sut.InitializeCustomDataProcessor(executionContext);

            Assert.AreEqual(
                env,
                fakeCustomDataSource.CreateProcessorCalls.Single().Item2);
        }
        public async Task ExecuteRequestedtablesSetCorrectly()
        {
            var progress = new DataProcessorProgress();

            var mockProcessor        = new MockCustomDataProcessor();
            var fakeCustomDataSource = new MockCustomDataSource()
            {
                DataProcessor = mockProcessor,
            };

            var dataSources = new[]
            {
                Any.DataSource(),
            };

            var tables = new[]
            {
                Any.TableDescriptor(),
                Any.TableDescriptor(),
                Any.TableDescriptor(),
            };

            var executionContext = new ExecutionContext(
                progress,
                _ => new NullLogger(),
                fakeCustomDataSource,
                dataSources,
                tables,
                Any.ProcessorEnvironment(),
                ProcessorOptions.Default);

            this.Sut.InitializeCustomDataProcessor(executionContext);
            var result = await this.Sut.ExecuteAsync(CancellationToken.None);

            Assert.AreEqual(tables.Length, result.RequestedTables.Count());
            foreach (var table in tables)
            {
                Assert.IsTrue(result.RequestedTables.Contains(table));
            }
        }
        public async Task ExecuteCallsProcessCorrectly()
        {
            var progress = new DataProcessorProgress();

            var logger = new NullLogger();

            var mockProcessor = new MockCustomDataProcessor();

            var fakeCustomDataSource = new MockCustomDataSource
            {
                DataProcessor = mockProcessor,
            };

            var dataSources = new[]
            {
                Any.DataSource(),
            };

            var tables = new[]
            {
                Any.TableDescriptor(),
            };

            var executionContext = new ExecutionContext(
                progress,
                _ => logger,
                fakeCustomDataSource,
                dataSources,
                tables,
                Any.ProcessorEnvironment(),
                ProcessorOptions.Default);

            this.Sut.InitializeCustomDataProcessor(executionContext);
            var result = await this.Sut.ExecuteAsync(this.Cts.Token);

            Assert.AreEqual(1, mockProcessor.ProcessCalls.Count);
            Assert.AreEqual(progress, mockProcessor.ProcessCalls[0].Item1);
            Assert.AreEqual(this.Cts.Token, mockProcessor.ProcessCalls[0].Item2);
        }