public void InitializeTest()
        {
            // Arrange.
            var sourceDefinition1 = new FieldMappingDataSourceDefinition("Source 1", "TestProcess", "Property1", true, false, false);
            var sourceDefinition2 = new FieldMappingDataSourceDefinition("Source 2", "TestProcess", "Property2", true, false, false);

            var source1 = Mock.Create<IFieldMappingDataSource>();
            var source2 = Mock.Create<IFieldMappingDataSource>();
            var newSources = new Queue<IFieldMappingDataSource>(new[] { source1, source2 });

            var retriever = new FieldMappingSourceDataRetriever
                                {
                                    DataSourceFactory =
                                        new ExportFactory<IFieldMappingDataSource>(() => new Tuple<IFieldMappingDataSource, Action>(newSources.Dequeue(), () => { }))
                                };

            // Act.
            retriever.Initialize(new[] { sourceDefinition1, sourceDefinition2 });

            // Assert.
            Assert.AreEqual(2, retriever.DataSources.Count);
            Assert.IsTrue(retriever.DataSources.Contains(source1));
            Assert.IsTrue(retriever.DataSources.Contains(source2));

            Mock.Assert(() => source1.Initialize(sourceDefinition1), Occurs.Once());
            Mock.Assert(() => source2.Initialize(sourceDefinition2), Occurs.Once());

            // Exceptions.
            TestsHelper.VerifyThrow<ArgumentNullException>(() => retriever.Initialize(null));
        }
        /// <summary>
        /// Creates a source items retriever from a data source definition.
        /// </summary>
        /// <param name="dataSource">The data source definition.</param>
        /// <returns>Returns a source items retriever.</returns>
        /// <exception cref="System.ArgumentNullException">dataSource</exception>
        public ISourceItemsRetriever CreateItemsRetriever(FieldMappingDataSourceDefinition dataSource)
        {
            if (dataSource == null)
                throw new ArgumentNullException("dataSource");

            return CreateItemsRetrieverFromPropertyPath(dataSource.ProcessName, dataSource.PropertyPath);
        }
        public void GetItemsCanReturnOldItems()
        {
            // Arrange.
            var dsDefinition = new FieldMappingDataSourceDefinition("Test Data Source", "TestProcess", "Property1.Property2", false, true, false);

            var newItem1 = Mock.Create<IEditableRoot>();
            Mock.Arrange(() => newItem1.Id).Returns(1);
            var newItem2 = Mock.Create<IEditableRoot>();
            Mock.Arrange(() => newItem2.Id).Returns(2);
            var oldItem1 = Mock.Create<IEditableRoot>();
            Mock.Arrange(() => oldItem1.Id).Returns(1);
            var oldItem2 = Mock.Create<IEditableRoot>();
            Mock.Arrange(() => oldItem2.Id).Returns(3);
            var removedItem1 = Mock.Create<IEditableRoot>();
            Mock.Arrange(() => removedItem1.Id).Returns(1);
            var removedItem2 = Mock.Create<IEditableRoot>();
            Mock.Arrange(() => removedItem2.Id).Returns(4);

            var item = Mock.Create<IEditableRoot>();
            var oldItem = Mock.Create<IEditableRoot>();

            var itemsRetriever = Mock.Create<ISourceItemsRetriever>();
            Mock.Arrange(() => itemsRetriever.GetNewItems(item, oldItem)).Returns(() => new[] { newItem1, newItem2 });
            Mock.Arrange(() => itemsRetriever.GetOldItems(item, oldItem)).Returns(() => new[] { oldItem1, oldItem2 });
            Mock.Arrange(() => itemsRetriever.GetRemovedItems(item, oldItem)).Returns(() => new[] { removedItem1, removedItem2 });

            var itemsRetrieverFactory = Mock.Create<ISourceItemsRetrieverFactory>();
            Mock.Arrange(() => itemsRetrieverFactory.CreateItemsRetriever(dsDefinition)).Returns(itemsRetriever);

            var ds = new FieldMappingDataSource { ItemsRetrieverFactory = itemsRetrieverFactory };
            ds.Initialize(dsDefinition);

            // Act.
            var result = ds.GetItems(item, oldItem).ToArray();

            // Assert.
            Assert.AreEqual(2, result.Length);
            Assert.IsTrue(result.Contains(oldItem1));
            Assert.IsTrue(result.Contains(oldItem2));
        }
Ejemplo n.º 4
0
        /// <summary>
        /// Initializes the data source from a data source definition.
        /// </summary>
        /// <param name="definition">A data source definition.</param>
        /// <exception cref="System.ArgumentNullException">definition</exception>
        /// <exception cref="ArgumentNullException">The definition parameter is null.</exception>
        public void Initialize(FieldMappingDataSourceDefinition definition)
        {
            if (definition == null)
                throw new ArgumentNullException("definition");

            _name = definition.Name;
            ItemsRetriever = ItemsRetrieverFactory.CreateItemsRetriever(definition);
            IncludeNewItems = definition.IncludeNewItems;
            IncludeOldItmes = definition.IncludeOldItems;
            IncludeRemovedItems = definition.IncludeRemovedItmes;
        }
        public void UpdateCanInsertItems()
        {
            // Arrange.
            const string ProcessName = "TestProcess";
            const string DestinationFieldName = "TestField";
            const string ReferencedProcessName = "RefProcess";
            const string FieldName1 = "Field1";
            const string FieldName2 = "Field2";

            var dataSourceDefinition = new FieldMappingDataSourceDefinition("Test Data Source", ProcessName, "TestProperty", true, true, true);
            var fieldMapping1 = new DataTriggerFieldMapping(FieldName1, true, (s, d) => null);
            var fieldMapping2 = new DataTriggerFieldMapping(FieldName2, false, (s, d) => null);
            var mapping = new DataTriggerListFieldMapping(new[] { dataSourceDefinition }, DestinationFieldName, DataTriggerModificationType.Insert, new[] { fieldMapping1, fieldMapping2 });

            var dtm = Mock.Create<IDynamicTypeManager>();
            Mock.Arrange(() => dtm.GetEditableRootType(ProcessName)).Returns(typeof(DestinationEdit));

            var item = Mock.Create<IEditableRoot>();

            var sourceData1 = new DataTriggerSourceData();
            var sourceData2 = new DataTriggerSourceData();

            var sourceDataRetriever = Mock.Create<IFieldMappingSourceDataRetriever>();
            Mock.Arrange(() => sourceDataRetriever.GetSourceData(item, null)).Returns(() => new[] { sourceData1, sourceData2 });

            var savedDestinationItem1 = Mock.Create<IEditableRoot>();
            Mock.Arrange(() => savedDestinationItem1.Id).Returns(111);
            var newDestinationItem1 = Mock.Create<IEditableRootStub>();
            var savableDestinationItem1 = newDestinationItem1 as ISavable;
            Mock.Arrange(() => savableDestinationItem1.Save()).Returns(savedDestinationItem1);

            var savedDestinationItem2 = Mock.Create<IEditableRoot>();
            Mock.Arrange(() => savedDestinationItem2.Id).Returns(222);
            var newDestinationItem2 = Mock.Create<IEditableRootStub>();
            var savableDestinationItem2 = newDestinationItem2 as ISavable;
            Mock.Arrange(() => savableDestinationItem2.Save()).Returns(savedDestinationItem2);

            var newDestinationItems = new Queue<IEditableRoot>(new[] { newDestinationItem1, newDestinationItem2 });

            Mock.Arrange(() => dtm.NewEditableRoot<IEditableRoot>(ReferencedProcessName)).Returns(newDestinationItems.Dequeue);

            var fieldUpdater1 = Mock.Create<IFieldUpdater>();
            Mock.Arrange(() => fieldUpdater1.IsKey).Returns(true);
            var fieldUpdater2 = Mock.Create<IFieldUpdater>();

            var fieldUpdaterFactory = Mock.Create<IFieldUpdaterFactory>();
            Mock.Arrange(() => fieldUpdaterFactory.CreateFieldUpdater(ReferencedProcessName, fieldMapping1)).Returns(fieldUpdater1);
            Mock.Arrange(() => fieldUpdaterFactory.CreateFieldUpdater(ReferencedProcessName, fieldMapping2)).Returns(fieldUpdater2);

            var updater = new MultiCrossReferenceFieldUpdater
                              {
                                  DynamicTypeManager = dtm,
                                  FieldUpdaterFactory = fieldUpdaterFactory,
                                  SourceDataRetrieverFactory =
                                      new ExportFactory<IFieldMappingSourceDataRetriever>(
                                      () => new Tuple<IFieldMappingSourceDataRetriever, Action>(sourceDataRetriever, () => { }))
                              };

            updater.Initialize(ProcessName, mapping);

            var destination = new DestinationEdit();

            // Act.
            updater.BeforeItemUpdate(item, null);
            updater.AfterItemUpdate(item, null);
            updater.Update(item, destination);

            // Assert.
            Assert.AreEqual(2, destination.TestField.Count);
            Assert.IsTrue(destination.TestField.Any(x => x.Id == 111));
            Assert.IsTrue(destination.TestField.Any(x => x.Id == 222));

            Mock.Assert(() => fieldUpdater1.CalculateNewValue(sourceData1, newDestinationItem1), Occurs.Once());
            Mock.Assert(() => fieldUpdater1.Update(newDestinationItem1), Occurs.Once());

            Mock.Assert(() => fieldUpdater1.CalculateNewValue(sourceData2, newDestinationItem2), Occurs.Once());
            Mock.Assert(() => fieldUpdater1.Update(newDestinationItem2), Occurs.Once());

            Mock.Assert(() => fieldUpdater2.CalculateNewValue(sourceData1, newDestinationItem1), Occurs.Once());
            Mock.Assert(() => fieldUpdater2.Update(newDestinationItem1), Occurs.Once());

            Mock.Assert(() => fieldUpdater2.CalculateNewValue(sourceData2, newDestinationItem2), Occurs.Once());
            Mock.Assert(() => fieldUpdater2.Update(newDestinationItem2), Occurs.Once());

            Mock.Assert(() => savableDestinationItem1.Save(), Occurs.Once());
            Mock.Assert(() => savableDestinationItem2.Save(), Occurs.Once());
        }
        public void UpdateCanRemoveItems()
        {
            // Arrange.
            const string ProcessName = "TestProcess";
            const string DestinationFieldName = "TestField";
            const string ReferencedProcessName = "RefProcess";
            const string FieldName1 = "Field1";
            const string FieldName2 = "Field2";

            var dataSourceDefinition = new FieldMappingDataSourceDefinition("Test Data Source", ProcessName, "TestProperty", true, true, true);
            var fieldMapping1 = new DataTriggerFieldMapping(FieldName1, true, (s, d) => null);
            var fieldMapping2 = new DataTriggerFieldMapping(FieldName2, false, (s, d) => null);
            var mapping = new DataTriggerListFieldMapping(
                new[] { dataSourceDefinition }, DestinationFieldName, DataTriggerModificationType.Remove, new[] { fieldMapping1, fieldMapping2 });

            var item = Mock.Create<IEditableRoot>();

            var sourceData1 = new DataTriggerSourceData();
            var sourceData2 = new DataTriggerSourceData();
            var sourceData3 = new DataTriggerSourceData();

            var sourceDataRetriever = Mock.Create<IFieldMappingSourceDataRetriever>();
            Mock.Arrange(() => sourceDataRetriever.GetSourceData(item, null)).Returns(() => new[] { sourceData1, sourceData2, sourceData3 });

            var oldDestinationItem1 = Mock.Create<IEditableRoot>();
            Mock.Arrange(() => oldDestinationItem1.Id).Returns(111);

            var oldDestinationItem2 = Mock.Create<IEditableRoot>();
            Mock.Arrange(() => oldDestinationItem2.Id).Returns(222);

            var destination = new DestinationEdit();
            destination.TestField.Assign(oldDestinationItem1.Id);
            destination.TestField.Assign(oldDestinationItem2.Id);

            Mock.Arrange(() => _dtm.GetEditableRootType(ProcessName)).Returns(typeof(DestinationEdit));
            SetupGetEditableRoot(ReferencedProcessName, oldDestinationItem1, oldDestinationItem2);

            var fieldUpdater1 = Mock.Create<IFieldUpdater>();
            Mock.Arrange(() => fieldUpdater1.IsKey).Returns(true);
            var fieldUpdater2 = Mock.Create<IFieldUpdater>();

            var fieldUpdaterFactory = Mock.Create<IFieldUpdaterFactory>();
            Mock.Arrange(() => fieldUpdaterFactory.CreateFieldUpdater(ReferencedProcessName, fieldMapping1)).Returns(fieldUpdater1);
            Mock.Arrange(() => fieldUpdaterFactory.CreateFieldUpdater(ReferencedProcessName, fieldMapping2)).Returns(fieldUpdater2);

            Mock.Arrange(() => fieldUpdater1.AreEqual(sourceData1, oldDestinationItem1)).Returns(true);

            var updater = new MultiCrossReferenceFieldUpdater
                              {
                                  DynamicTypeManager = _dtm,
                                  FieldUpdaterFactory = fieldUpdaterFactory,
                                  SourceDataRetrieverFactory =
                                      new ExportFactory<IFieldMappingSourceDataRetriever>(
                                      () => new Tuple<IFieldMappingSourceDataRetriever, Action>(sourceDataRetriever, () => { }))
                              };

            updater.Initialize(ProcessName, mapping);

            // Act.
            updater.BeforeItemUpdate(item, null);
            updater.AfterItemUpdate(item, null);
            updater.Update(item, destination);

            // Assert.
            Assert.AreEqual(1, destination.TestField.Count);
            Assert.IsTrue(destination.TestField.Any(x => x.Id == 222));
        }
        public void CreateItemsRetrieverTest()
        {
            // Arrange.
            var dtm = Mock.Create<IDynamicTypeManager>(Behavior.Loose);
            Mock.Arrange(() => dtm.GetEditableRootType(ProcessName1)).Returns(typeof(TestEdit1));
            Mock.Arrange(() => dtm.GetEditableRootType(ProcessName2)).Returns(typeof(TestEdit2));
            Mock.Arrange(() => dtm.GetEditableRootType(ProcessName3)).Returns(typeof(TestEdit3));

            var singleCrossReferenceFactory = new ExportFactory<SingleCrossReferenceSourceItemsRetriever>(
                () =>
                    {
                        var r = Mock.Create<SingleCrossReferenceSourceItemsRetriever>(Behavior.Loose);
                        Mock.Arrange(() => r.Initialize(ProcessName1, TestsHelper.ExtractPropertyName(() => new TestEdit1().CR1)))
                            .DoInstead(() => Mock.Arrange(() => r.ReferencedProcess).Returns(ProcessName2));
                        Mock.Arrange(() => r.Initialize(ProcessName2, TestsHelper.ExtractPropertyName(() => new TestEdit2().CR2)))
                            .DoInstead(() => Mock.Arrange(() => r.ReferencedProcess).Returns(ProcessName3));

                        return new Tuple<SingleCrossReferenceSourceItemsRetriever, Action>(r, () => { });
                    });

            var multiCrossReferenceFactory = new ExportFactory<MultiCrossReferenceSourceItemsRetriever>(
                () =>
                    {
                        var r = Mock.Create<MultiCrossReferenceSourceItemsRetriever>(Behavior.Loose);
                        Mock.Arrange(() => r.Initialize(ProcessName1, TestsHelper.ExtractPropertyName(() => new TestEdit1().MultiCR1)))
                            .DoInstead(() => Mock.Arrange(() => r.ReferencedProcess).Returns(ProcessName2));
                        Mock.Arrange(() => r.Initialize(ProcessName2, TestsHelper.ExtractPropertyName(() => new TestEdit2().MultiCR2)))
                            .DoInstead(() => Mock.Arrange(() => r.ReferencedProcess).Returns(ProcessName3));

                        return new Tuple<MultiCrossReferenceSourceItemsRetriever, Action>(r, () => { });
                    });

            var factory = new SourceItemsRetrieverFactory
                              {
                                  DynamicTypeManager = dtm,
                                  SingleCrossReferenceSourceItemsRetrieverFactory = singleCrossReferenceFactory,
                                  MultiCrossReferenceSourceItemsRetrieverFactory = multiCrossReferenceFactory
                              };

            var dataSource1 = new FieldMappingDataSourceDefinition(
                "Source 1",
                ProcessName1,
                TestsHelper.ExtractPropertyName(() => new TestEdit1().CR1) + "." + TestsHelper.ExtractPropertyName(() => new TestEdit2().CR2),
                true,
                true,
                true);

            var dataSource2 = new FieldMappingDataSourceDefinition(
                "Source 2",
                ProcessName1,
                TestsHelper.ExtractPropertyName(() => new TestEdit1().CR1) + "." + TestsHelper.ExtractPropertyName(() => new TestEdit2().MultiCR2),
                true,
                true,
                true);

            var dataSource3 = new FieldMappingDataSourceDefinition(
                "Source 3",
                ProcessName1,
                TestsHelper.ExtractPropertyName(() => new TestEdit1().MultiCR1) + "." + TestsHelper.ExtractPropertyName(() => new TestEdit2().CR2),
                true,
                true,
                true);

            var dataSource4 = new FieldMappingDataSourceDefinition(
                "Source 4",
                ProcessName1,
                TestsHelper.ExtractPropertyName(() => new TestEdit1().MultiCR1) + "." + TestsHelper.ExtractPropertyName(() => new TestEdit2().MultiCR2),
                true,
                true,
                true);

            // Act.
            var retriever1 = (SingleCrossReferenceSourceItemsRetriever)factory.CreateItemsRetriever(dataSource1);
            var innerRetriever1 = (SingleCrossReferenceSourceItemsRetriever)retriever1.Subretriever;

            var retriever2 = (SingleCrossReferenceSourceItemsRetriever)factory.CreateItemsRetriever(dataSource2);
            var innerRetriever2 = (MultiCrossReferenceSourceItemsRetriever)retriever2.Subretriever;

            var retriever3 = (MultiCrossReferenceSourceItemsRetriever)factory.CreateItemsRetriever(dataSource3);
            var innerRetriever3 = (SingleCrossReferenceSourceItemsRetriever)retriever3.Subretriever;

            var retriever4 = (MultiCrossReferenceSourceItemsRetriever)factory.CreateItemsRetriever(dataSource4);
            var innerRetriever4 = (MultiCrossReferenceSourceItemsRetriever)retriever4.Subretriever;

            // Assert.
            Assert.IsNotNull(retriever1);
            Mock.Assert(() => retriever1.Initialize(ProcessName1, TestsHelper.ExtractPropertyName(() => new TestEdit1().CR1)), Occurs.Once());
            Assert.IsNotNull(innerRetriever1);
            Mock.Assert(() => innerRetriever1.Initialize(ProcessName2, TestsHelper.ExtractPropertyName(() => new TestEdit2().CR2)), Occurs.Once());
            Assert.IsNull(innerRetriever1.Subretriever);

            Assert.IsNotNull(retriever2);
            Mock.Assert(() => retriever2.Initialize(ProcessName1, TestsHelper.ExtractPropertyName(() => new TestEdit1().CR1)), Occurs.Once());
            Assert.IsNotNull(innerRetriever2);
            Mock.Assert(() => innerRetriever2.Initialize(ProcessName2, TestsHelper.ExtractPropertyName(() => new TestEdit2().MultiCR2)), Occurs.Once());
            Assert.IsNull(innerRetriever2.Subretriever);

            Assert.IsNotNull(retriever3);
            Mock.Assert(() => retriever3.Initialize(ProcessName1, TestsHelper.ExtractPropertyName(() => new TestEdit1().MultiCR1)), Occurs.Once());
            Assert.IsNotNull(innerRetriever3);
            Mock.Assert(() => innerRetriever3.Initialize(ProcessName2, TestsHelper.ExtractPropertyName(() => new TestEdit2().CR2)), Occurs.Once());
            Assert.IsNull(innerRetriever3.Subretriever);

            Assert.IsNotNull(retriever4);
            Mock.Assert(() => retriever4.Initialize(ProcessName1, TestsHelper.ExtractPropertyName(() => new TestEdit1().MultiCR1)), Occurs.Once());
            Assert.IsNotNull(innerRetriever4);
            Mock.Assert(() => innerRetriever4.Initialize(ProcessName2, TestsHelper.ExtractPropertyName(() => new TestEdit2().MultiCR2)), Occurs.Once());
            Assert.IsNull(innerRetriever4.Subretriever);
        }