public void Test_FillEntity(bool fillEntities)
        {
            Mock <IObjectReader> mockReader;
            IObjectReader        reader;
            Mock <IEntity>       mockEntity;
            IEntity entity;
            ReaderToEntityAdapter  adapter;
            List <MemberProcessor> memberProcessors;
            IImportReporter        reporter = new Mock <IImportReporter>( ).Object;

            // Setup reader
            mockReader = new Mock <IObjectReader>(MockBehavior.Strict);
            mockReader.Setup(x => x.GetString("member1")).Returns("value1").Verifiable("member1 not called");
            mockReader.Setup(x => x.GetString("member2")).Returns("value2").Verifiable("member2 not called");
            reader = mockReader.Object;

            // Setup entity
            mockEntity = new Mock <IEntity>(MockBehavior.Strict);
            mockEntity.Setup(x => x.SetField(1, "value1")).Verifiable("field1 not set");
            mockEntity.Setup(x => x.SetField(2, "value2")).Verifiable("field2 not set");
            entity = mockEntity.Object;

            // Set up adapter
            int called = 0;

            memberProcessors = new List <MemberProcessor>( );
            memberProcessors.Add(new MemberProcessor((r, e, rpt) =>
            {
                string value = r.GetString("member1");
                e.SetField(1, value);
                called++;
            }));
            memberProcessors.Add(new MemberProcessor((r, e, rpt) =>
            {
                string value = r.GetString("member2");
                e.SetField(2, value);
                called++;
            }));
            adapter = new ReaderToEntityAdapter(memberProcessors, () => { throw new Exception("Assert false"); }, null);

            // Go!
            if (fillEntities)
            {
                adapter.FillEntities(new ReaderEntityPair(reader, entity).ToEnumerable(), reporter);
            }
            else
            {
                adapter.FillEntity(reader, entity, ConnectorRequestExceptionReporter.Instance);
            }


            // Verify everything called
            mockReader.VerifyAll( );
            mockEntity.VerifyAll( );
            Assert.That(called, Is.EqualTo(2), "Processor should be called twice.");

            // Entity.Save should not be called, which gets verified here because of Strict mode.
        }
Exemple #2
0
        /// <summary>
        /// Save the entities.
        /// </summary>
        /// <param name="newEntities">Mapping of readers to their entities.</param>
        private void SaveEntities(IReadOnlyCollection <ReaderEntityPair> newEntities)
        {
            var pairsToSave = newEntities
                              .Where(pair => !Reporter.HasErrors(pair.ObjectReader) && pair.Entity != null);


            if (_testRun)
            {
                int count = pairsToSave.Count( );
                Reporter.ReportOk(count);
                Reporter.Flush( );
                return;
            }

            try
            {
                var entities = pairsToSave.Select(pair => pair.Entity);

                _entitySaver.SaveEntities(entities);

                int count = entities.Count( );
                Reporter.ReportOk(count);
            }
            catch
            {
                foreach (var pair in pairsToSave)
                {
                    IObjectReader reader = pair.ObjectReader;
                    if (Reporter.HasErrors(reader))
                    {
                        continue;
                    }

                    try
                    {
                        // Re-create entity, because it seems that a duplicate key violation in the batch save munches up the entity in the pair.
                        IEntity entity = ReaderToEntityAdapter.CreateEntity(reader, Reporter);
                        entity.Save( );
                        Reporter.ReportOk( );
                    }
                    catch (Exception ex)
                    {
                        Reporter.ReportError(pair.ObjectReader, ex.Message);
                    }
                }
            }
            finally
            {
                Reporter.Flush( );
            }
        }
Exemple #3
0
        /// <summary>
        /// Imports records.
        /// </summary>
        /// <param name="records">The records to import</param>
        public void ImportRecords(IEnumerable <IObjectReader> records)
        {
            if (Reporter == null)
            {
                throw new InvalidOperationException();
            }

            IReadOnlyCollection <ReaderEntityPair> newEntities = ReaderToEntityAdapter.CreateEntities(records, Reporter);

            using (_suppressWorkflows ? new WorkflowRunContext {
                DisableTriggers = true
            } : null)
                using (_mergeRecords ? new ResourceKeyHelper.OverwriteMatchingResources( ) : null)
                {
                    SaveEntities(newEntities);
                }
        }
        public void Test_CreateEntity(bool createEntities)
        {
            Mock <IObjectReader> mockReader;
            IObjectReader        reader;
            Mock <IEntity>       mockEntity;
            IEntity entity;
            ReaderToEntityAdapter  adapter;
            List <MemberProcessor> memberProcessors;
            IImportReporter        reporter = new Mock <IImportReporter>( ).Object;

            // Setup reader
            mockReader = new Mock <IObjectReader>(MockBehavior.Strict);
            mockReader.Setup(x => x.GetString("member1")).Returns("value1").Verifiable("member1 not called");
            mockReader.Setup(x => x.GetString("member2")).Returns("value2").Verifiable("member2 not called");
            reader = mockReader.Object;

            // Setup entity
            mockEntity = new Mock <IEntity>(MockBehavior.Strict);
            mockEntity.Setup(x => x.SetField(1, "value1")).Verifiable("field1 not set");
            mockEntity.Setup(x => x.SetField(2, "value2")).Verifiable("field2 not set");
            entity = mockEntity.Object;

            // Set up adapter
            int called = 0;

            memberProcessors = new List <MemberProcessor>( );
            memberProcessors.Add(new MemberProcessor((r, e, rpt) =>
            {
                string value = r.GetString("member1");
                e.SetField(1, value);
                called++;
            }));
            memberProcessors.Add(new MemberProcessor((r, e, rpt) =>
            {
                string value = r.GetString("member2");
                e.SetField(2, value);
                called++;
            }));
            Func <IEntity> instanceFactory = () => mockEntity.Object;

            adapter = new ReaderToEntityAdapter(memberProcessors, instanceFactory, null);

            // Go!
            IEntity result;

            if (createEntities)
            {
                result = adapter.CreateEntities(reader.ToEnumerable( ), reporter).First( ).Entity;
            }
            else
            {
                result = adapter.CreateEntity(reader, ConnectorRequestExceptionReporter.Instance);
            }

            Assert.That(result, Is.SameAs(mockEntity.Object));

            // Verify everything called
            mockReader.VerifyAll( );
            mockEntity.VerifyAll( );
            Assert.That(called, Is.EqualTo(2), "Processor should be called twice.");

            // Entity.Save should not be called, which gets verified here because of Strict mode.
        }