public void ExpandedDataDestination_OneDataDestinationAndMultipleExpandedRecords_ExpandedRecordsAreWritten()
        {
            var records = new List <object>()
            {
                new object()
            };
            var expandedRecords = new List <object>()
            {
                new object(),
                new object()
            };

            var dataSource      = MockRepository.GenerateMock <IDataSource>();
            var dataDestination = MockRepository.GenerateMock <IDataDestination>();
            var recordExpander  = MockRepository.GenerateMock <IRecordExpander>();
            var dataWriter      = MockRepository.GenerateMock <IDataWriter>();

            dataDestination.Expect(x => x.CreateDataWriter(Arg <IDataSource> .Is.Equal(dataSource))).Return(dataWriter).Repeat.Once();
            recordExpander.Expect(x => x.Expand(Arg <object> .Is.Equal(records[0]))).Return(expandedRecords).Repeat.Once();
            dataWriter.Expect(x => x.WriteRecord(Arg <object> .Is.Equal(expandedRecords[0]))).Repeat.Once();
            dataWriter.Expect(x => x.WriteRecord(Arg <object> .Is.Equal(expandedRecords[1]))).Repeat.Once();

            var expandedDataDestination = new ExpandedDataDestination(recordExpander, dataDestination);

            var returnedDataWriter = expandedDataDestination.CreateDataWriter(dataSource);

            returnedDataWriter.WriteRecord(records[0]);

            dataDestination.VerifyAllExpectations();
            recordExpander.VerifyAllExpectations();
            dataWriter.VerifyAllExpectations();
        }
        public void CreateDataWriter_OneDataDestination_ExpandedDataWriterIsCreated()
        {
            var dataSource      = MockRepository.GenerateMock <IDataSource>();
            var dataDestination = MockRepository.GenerateMock <IDataDestination>();
            var recordExpander  = MockRepository.GenerateMock <IRecordExpander>();
            var dataWriter      = MockRepository.GenerateMock <IDataWriter>();

            dataDestination.Expect(x => x.CreateDataWriter(Arg <IDataSource> .Is.Equal(dataSource))).Return(dataWriter).Repeat.Once();

            var expandedDataDestination = new ExpandedDataDestination(recordExpander, dataDestination)
            {
                MaxDegreeOfParallelismForExpandedRecords = 2,
                MaxDegreeOfParallelismForDataWriters     = 3
            };

            var returnedDataWriter = expandedDataDestination.CreateDataWriter(dataSource);

            var expandedDataWriter = returnedDataWriter as ExpandedDataWriter;

            dataDestination.VerifyAllExpectations();

            Assert.IsNotNull(expandedDataWriter);
            Assert.AreEqual(expandedDataDestination.MaxDegreeOfParallelismForExpandedRecords, expandedDataWriter.MaxDegreeOfParallelismForExpandedRecords);
            Assert.AreEqual(expandedDataDestination.MaxDegreeOfParallelismForDataWriters, expandedDataWriter.MaxDegreeOfParallelismForDataWriters);
        }
        public void CreateDataWriter_DataDestinationCreateDataWriterThrowsException_ExceptionIsPropogated()
        {
            var dataSource      = MockRepository.GenerateMock <IDataSource>();
            var dataDestination = MockRepository.GenerateMock <IDataDestination>();
            var recordExpander  = MockRepository.GenerateMock <IRecordExpander>();

            dataDestination.Stub(x => x.CreateDataWriter(Arg <IDataSource> .Is.Anything)).Throw(new InternalTestFailureException());

            var expandedDataDestination = new ExpandedDataDestination(recordExpander, dataDestination);

            expandedDataDestination.CreateDataWriter(dataSource);
        }
        public void ExpandedDataDestination_MultipleDataDestinationsAndOneExpandedRecord_ExpandedRecordIsWrittenToAllDataDestinations()
        {
            var records = new List <object>()
            {
                new object()
            };
            var expandedRecords = new List <object>()
            {
                new object()
            };

            var dataSource       = MockRepository.GenerateMock <IDataSource>();
            var dataDestinations = new List <IDataDestination>()
            {
                MockRepository.GenerateMock <IDataDestination>(),
                MockRepository.GenerateMock <IDataDestination>()
            };
            var recordExpander = MockRepository.GenerateMock <IRecordExpander>();
            var dataWriters    = new List <IDataWriter>()
            {
                MockRepository.GenerateMock <IDataWriter>(),
                MockRepository.GenerateMock <IDataWriter>()
            };

            dataDestinations[0].Expect(x => x.CreateDataWriter(Arg <IDataSource> .Is.Equal(dataSource))).Return(dataWriters[0]).Repeat.Once();
            dataDestinations[1].Expect(x => x.CreateDataWriter(Arg <IDataSource> .Is.Equal(dataSource))).Return(dataWriters[1]).Repeat.Once();
            recordExpander.Expect(x => x.Expand(Arg <object> .Is.Equal(records[0]))).Return(expandedRecords).Repeat.Once();
            dataWriters[0].Expect(x => x.WriteRecord(Arg <object> .Is.Equal(expandedRecords[0]))).Repeat.Once();
            dataWriters[1].Expect(x => x.WriteRecord(Arg <object> .Is.Equal(expandedRecords[0]))).Repeat.Once();

            var expandedDataDestination = new ExpandedDataDestination(recordExpander, dataDestinations.ToArray());

            var returnedDataWriter = expandedDataDestination.CreateDataWriter(dataSource);

            returnedDataWriter.WriteRecord(records[0]);

            dataDestinations[0].VerifyAllExpectations();
            dataDestinations[1].VerifyAllExpectations();
            recordExpander.VerifyAllExpectations();
            dataWriters[0].VerifyAllExpectations();
            dataWriters[1].VerifyAllExpectations();
        }