コード例 #1
0
        public void all_objects_in_the_object_graph_are_proxied()
        {
            var metadataFactory      = new AttributeMetadataFactory(new NullLogger());
            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();
            var repositoryFactory    = new Mock <IRepositoryFactory>();
            var stateTracker         = new EntityStateCache();
            var proxyFactory         = new DynamicProxyFactory(metadataFactory, new NullLogger());

            using (var session = new GraphSession(new UnitOfWork(stateTracker), new List <IListener>(), queryExecutorFactory.Object, repositoryFactory.Object, stateTracker, proxyFactory))
            {
                var factory = new DynamicProxyFactory(metadataFactory, new NullLogger());
                var item    = new Person
                {
                    Id       = "1",
                    Contacts = new List <Contact>
                    {
                        new Contact {
                            Id = "1"
                        }
                    }
                };
                var proxy = factory.Create(item, session);
                Assert.True(ProxyUtils.IsProxy(proxy));
                Assert.True(proxy.Contacts is ITrackableCollection <Contact>);
                Assert.True(ProxyUtils.IsProxy(proxy.Contacts[0]));
            }
        }
コード例 #2
0
        public void circular_dependencies_are_proxied_correctly()
        {
            var metadataFactory      = new AttributeMetadataFactory(new NullLogger());
            var proxyFactory         = new DynamicProxyFactory(metadataFactory, new NullLogger());
            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();
            var repositoryFactory    = new RepositoryFactory(proxyFactory);
            var parentMapper         = new Mock <IMapper <Parent> >();

            repositoryFactory.Register <Parent>(x => parentMapper.Object);
            var childMapper = new Mock <IMapper <Child> >();

            repositoryFactory.Register <Child>(x => childMapper.Object);

            var stateTracker = new EntityStateCache();

            using (var session = new GraphSession(new UnitOfWork(stateTracker), new List <IListener>(), queryExecutorFactory.Object, repositoryFactory, stateTracker, proxyFactory))
            {
                var a = new EntityA
                {
                    Id = "a"
                };
                var b = new EntityB
                {
                    Id = "b"
                };
                a.EntityB = b;
                b.EntityA = a;
                var proxy = proxyFactory.Create(a, session);
                Assert.NotNull(proxy);
                Assert.NotNull(proxy.EntityB);
                Assert.NotNull(proxy.EntityB.EntityA);
                Assert.Same(proxy, proxy.EntityB.EntityA);
            }
        }
コード例 #3
0
        public void properties_which_are_marked_as_ignored_are_not_proxied()
        {
            var metadataFactory      = new AttributeMetadataFactory(new NullLogger());
            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();
            var repositoryFactory    = new Mock <IRepositoryFactory>();
            var stateTracker         = new EntityStateCache();
            var proxyFactory         = new DynamicProxyFactory(metadataFactory, new NullLogger());

            using (var session = new GraphSession(new UnitOfWork(stateTracker), new List <IListener>(), queryExecutorFactory.Object, repositoryFactory.Object, stateTracker, proxyFactory))
            {
                var factory = new DynamicProxyFactory(metadataFactory, new NullLogger());
                var item    = new EntityWithIgnoredProperty
                {
                    Id      = "1",
                    Ignored = new AnotherEntity {
                        Id = "2"
                    },
                    Proxied = new AnotherEntity {
                        Id = "3"
                    }
                };
                var proxy = factory.Create(item, session);
                Assert.True(ProxyUtils.IsProxy(proxy));
                Assert.True(ProxyUtils.IsProxy(proxy.Proxied));
                Assert.False(ProxyUtils.IsProxy(proxy.Ignored));
            }
        }
コード例 #4
0
        public void change_tracking_is_applied_when_entity_set_in_constructor()
        {
            var metadataFactory      = new AttributeMetadataFactory(new NullLogger());
            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();

            var mapper            = new Mock <IMapper <Parent> >();
            var repositoryFactory = new Mock <IRepositoryFactory>();

            repositoryFactory.Setup(x => x.Create(It.IsAny <IGraphSession>(), It.IsAny <Type>())).Returns <IGraphSession, Type>((s, t) => new GenericAbstractRepository <Parent>(mapper.Object, s, new DynamicProxyFactory(metadataFactory, new NullLogger())));
            var stateTracker = new EntityStateCache();
            var proxyFactory = new DynamicProxyFactory(metadataFactory, new NullLogger());

            using (var session = new GraphSession(new UnitOfWork(stateTracker), new List <IListener>(), queryExecutorFactory.Object, repositoryFactory.Object, stateTracker, proxyFactory))
            {
                var proxy = session.Create(new Parent
                {
                    Id    = "1",
                    Child = new Child {
                        Id = "2"
                    }
                });
                var state = stateTracker.Get(proxy.Child);
                Assert.Equal(EntityStatus.New, state.Status);
            }
        }
コード例 #5
0
        public void depdendencies_are_incremented_when_property_set()
        {
            var metadataFactory      = new AttributeMetadataFactory(new NullLogger());
            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();
            var repositoryFactory    = new Mock <IRepositoryFactory>();
            var stateTracker         = new EntityStateCache();
            var proxyFactory         = new DynamicProxyFactory(metadataFactory, new NullLogger());

            using (var session = new GraphSession(new UnitOfWork(stateTracker), new List <IListener>(), queryExecutorFactory.Object, repositoryFactory.Object, stateTracker, proxyFactory))
            {
                var factory = new DynamicProxyFactory(metadataFactory, new NullLogger());
                var parent  = factory.Create(new Parent {
                    Id = "parent"
                }, session);
                var child = factory.Create(new Child {
                    Id = "child"
                }, session);
                parent.Child = child;

                var parentState = stateTracker.Get(parent);
                Assert.Equal(2, parentState.Dependencies.Sequence);

                var childState = stateTracker.Get(child);
                Assert.Equal(1, childState.Dependencies.Sequence);
            }
        }
コード例 #6
0
        public void factory_creates_meta_data_correctly_from_a_proxy_object()
        {
            var metadataFactory      = new AttributeMetadataFactory(new NullLogger());
            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();
            var repositoryFactory    = new Mock <IRepositoryFactory>();
            var stateTracker         = new EntityStateCache();
            var proxyFactory         = new DynamicProxyFactory(metadataFactory, new NullLogger());

            using (var session = new GraphSession(new UnitOfWork(stateTracker), new List <IListener>(), queryExecutorFactory.Object, repositoryFactory.Object, stateTracker, proxyFactory))
            {
                var factory = new DynamicProxyFactory(metadataFactory, new NullLogger());
                var item    = new Parent
                {
                    Id    = "1",
                    Child = new Child {
                        Id = "2"
                    },
                    Children = new List <Child> {
                        new Child {
                            Id = "3"
                        }
                    }
                };
                var proxy          = factory.Create(item, session);
                var parentMetadata = metadataFactory.Create(proxy);
                Assert.Equal("Parent", parentMetadata.Name);

                var childMetadta = metadataFactory.Create(proxy.Child);
                Assert.Equal("Child", childMetadta.Name);
            }
        }
コード例 #7
0
        public void nullable_types_are_ignored()
        {
            var metadataFactory      = new AttributeMetadataFactory(new NullLogger());
            var proxyFactory         = new DynamicProxyFactory(metadataFactory, new NullLogger());
            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();
            var repositoryFactory    = new RepositoryFactory(proxyFactory);
            var parentMapper         = new Mock <IMapper <Parent> >();

            repositoryFactory.Register <Parent>(x => parentMapper.Object);
            var childMapper = new Mock <IMapper <Child> >();

            repositoryFactory.Register <Child>(x => childMapper.Object);

            var stateTracker = new EntityStateCache();

            using (var session = new GraphSession(new UnitOfWork(stateTracker), new List <IListener>(), queryExecutorFactory.Object, repositoryFactory, stateTracker, proxyFactory))
            {
                var entity = new EntityWithNullableType
                {
                    Id   = "1",
                    Date = DateTime.Now
                };
                var proxy = proxyFactory.Create(entity, session);
                Assert.NotNull(proxy.Date);
            }
        }
コード例 #8
0
        public void objects_with_inheritance_chain_are_proxied_correctly()
        {
            var metadataFactory      = new AttributeMetadataFactory(new NullLogger());
            var proxyFactory         = new DynamicProxyFactory(metadataFactory, new NullLogger());
            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();
            var repositoryFactory    = new RepositoryFactory(proxyFactory);
            var parentMapper         = new Mock <IMapper <Parent> >();

            repositoryFactory.Register <Parent>(x => parentMapper.Object);
            var childMapper = new Mock <IMapper <Child> >();

            repositoryFactory.Register <Child>(x => childMapper.Object);

            var stateTracker = new EntityStateCache();

            using (var session = new GraphSession(new UnitOfWork(stateTracker), new List <IListener>(), queryExecutorFactory.Object, repositoryFactory, stateTracker, proxyFactory))
            {
                var entity = new ParentWithInheritedChild
                {
                    Id   = "1",
                    Type = new SuperTypeA {
                        Id = "1"
                    }
                };
                var proxy = proxyFactory.Create(entity, session);
                Assert.True(proxy.Type is SuperTypeA);
            }
        }
コード例 #9
0
        public void dependencies_are_incremented_as_relationships_are_created()
        {
            var stateTracker = new EntityStateCache();
            var stateFactory = new Mock <IEntityStateCacheFactory>();

            stateFactory.Setup(x => x.Create()).Returns(stateTracker);
            var metadataFactory = new AttributeMetadataFactory(new NullLogger());
            var proxyFactory    = new DynamicProxyFactory(metadataFactory, new NullLogger());

            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();
            var repositoryFactory    = new RepositoryFactory(proxyFactory);

            repositoryFactory.Register <Organisation>(session => new Mapper <Organisation>(session, metadataFactory));
            repositoryFactory.Register <AccessGroup>(session => new Mapper <AccessGroup>(session, metadataFactory));
            repositoryFactory.Register <Site>(session => new Mapper <Site>(session, metadataFactory));
            repositoryFactory.Register <Person>(session => new Mapper <Person>(session, metadataFactory));
            var sessionFactory = new GraphSessionFactory(queryExecutorFactory.Object, repositoryFactory, stateFactory.Object, proxyFactory);

            using (var session = sessionFactory.OpenSession())
            {
                var organisation = session.Create(new Organisation
                {
                    Id = "organisation"
                });

                var site = session.Create(new Site
                {
                    Id = "site"
                });

                var accessGroup = session.Create(new AccessGroup
                {
                    Id = "accessGroup"
                });

                var person = session.Create(new Person
                {
                    Id = "person"
                });

                organisation.Add(site);
                organisation.Add(accessGroup);
                site.Add(accessGroup);
                person.Add(organisation);
                person.Add(site);

                var organisationMetadata = stateTracker.Get(organisation);
                var siteMetadata         = stateTracker.Get(site);
                var accessGroupMetadata  = stateTracker.Get(accessGroup);
                var personMetadata       = stateTracker.Get(person);

                Assert.Equal(1, accessGroupMetadata.Dependencies.Sequence);
                Assert.Equal(2, siteMetadata.Dependencies.Sequence);
                Assert.Equal(3, organisationMetadata.Dependencies.Sequence);
                Assert.Equal(4, personMetadata.Dependencies.Sequence);
            }
        }
コード例 #10
0
        public void ShouldCreateParameterStatement()
        {
            var factory = new AttributeMetadataFactory(new NullLogger());
            var person  = new Person {
                Id = "1"
            };
            var node   = new Node(factory.Create(person), person);
            var result = StatementFactory.Parameter(node);

            Assert.Equal("Person_1", result);
        }
コード例 #11
0
        public void ShouldCreateMergeStatement()
        {
            var factory = new AttributeMetadataFactory(new NullLogger());
            var person  = new Person {
                Id = "1"
            };
            var node   = new Node(factory.Create(person), person);
            var id     = StatementFactory.IdParameter(node);
            var result = StatementFactory.Merge(node, id);

            Assert.Equal("(Person_1:Person { Id:{Person_1_id}})", result);
        }
コード例 #12
0
        public void MatchShouldGenerateValidSyntax()
        {
            var factory = new AttributeMetadataFactory(null);
            var person  = new Person {
                Id = "1"
            };
            var node      = new Node(factory.Create(person), person);
            var statement = StatementFactory.Match(node, StatementFactory.Parameter(node));
            var query     = new CypherQuery <Person>();
            var response  = query.Match(statement);

            Assert.Equal("MATCH (Person_1:Person { Id:{Person_1}})", response.Statement);
        }
コード例 #13
0
        public void interceptors_are_not_created_for_re_entrant_proxies()
        {
            var metadataFactory      = new AttributeMetadataFactory(new NullLogger());
            var proxyFactory         = new DynamicProxyFactory(metadataFactory, new NullLogger());
            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();
            var repositoryFactory    = new RepositoryFactory(proxyFactory);
            var parentMapper         = new Mock <IMapper <Parent> >();

            repositoryFactory.Register <Parent>(x => parentMapper.Object);
            var childMapper = new Mock <IMapper <Child> >();

            repositoryFactory.Register <Child>(x => childMapper.Object);

            var stateTracker = new EntityStateCache();

            using (var session = new GraphSession(new UnitOfWork(stateTracker), new List <IListener>(), queryExecutorFactory.Object, repositoryFactory, stateTracker, proxyFactory))
            {
                var proxy = session.Create(new Parent
                {
                    Id = "1"
                });
                proxy.Child = session.Create(new Child
                {
                    Id = "1"
                });

                var metadata = metadataFactory.Create(proxy);
                var deleted  = ProxyUtils.Flush(proxy, metadata["Child"].Relationship);

                Assert.Equal(0, deleted.SelectMany(x => x.Flush().Cast <object>()).Count());

                var reentrant = session.Create(proxy);
                Assert.Equal(proxy, reentrant);

                metadata = metadataFactory.Create(reentrant);
                deleted  = ProxyUtils.Flush(reentrant, metadata["Child"].Relationship);
                Assert.Equal(0, deleted.SelectMany(x => x.Flush().Cast <object>()).Count());

                proxy.Child = session.Create(new Child
                {
                    Id = "2"
                });
                metadata = metadataFactory.Create(reentrant);
                deleted  = ProxyUtils.Flush(reentrant, metadata["Child"].Relationship);
                Assert.Equal(1, deleted.SelectMany(x => x.Flush().Cast <object>()).Count());
            }
        }
コード例 #14
0
        public void properties_set_during_construction_are_restored_after_proxy_created()
        {
            var metadataFactory      = new AttributeMetadataFactory(new NullLogger());
            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();
            var repositoryFactory    = new Mock <IRepositoryFactory>();
            var stateTracker         = new EntityStateCache();
            var proxyFactory         = new DynamicProxyFactory(metadataFactory, new NullLogger());

            using (var session = new GraphSession(new UnitOfWork(stateTracker), new List <IListener>(), queryExecutorFactory.Object, repositoryFactory.Object, stateTracker, proxyFactory))
            {
                var factory = new DynamicProxyFactory(metadataFactory, new NullLogger());
                var item    = new EntityWithPropertiesSetInConstructor("1", "Test");
                var proxy   = factory.Create(item, session);
                Assert.Equal("1", proxy.Id);
                Assert.Equal("Test", proxy.Name);
            }
        }
コード例 #15
0
        public void ShouldCreateNamedRelationship()
        {
            var factory = new AttributeMetadataFactory(new NullLogger());
            var personA = new Person {
                Id = "A"
            };
            var nodeA   = new Node(factory.Create(personA), personA);
            var personB = new Person {
                Id = "B"
            };
            var nodeB        = new Node(factory.Create(personB), personB);
            var relationship = new RelationshipMetadata {
                Name = "REL", IsReverse = true
            };
            var result = StatementFactory.Relationship(nodeA, nodeB, relationship, "r");

            Assert.Equal("(Person_A)<-[r:REL]-(Person_B)", result);
        }
コード例 #16
0
        public void an_exception_is_thrown_if_id_null()
        {
            var metadataFactory      = new AttributeMetadataFactory(new NullLogger());
            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();
            var repositoryFactory    = new Mock <IRepositoryFactory>();
            var stateTracker         = new EntityStateCache();
            var proxyFactory         = new DynamicProxyFactory(metadataFactory, new NullLogger());

            using (var session = new GraphSession(new UnitOfWork(stateTracker), new List <IListener>(), queryExecutorFactory.Object, repositoryFactory.Object, stateTracker, proxyFactory))
            {
                Assert.Throws <PropertyNotSetException>(() =>
                {
                    var factory = new DynamicProxyFactory(metadataFactory, new NullLogger());
                    var notSet  = new AnotherEntity();
                    factory.Create(notSet, session);
                });
            }
        }
コード例 #17
0
        public void factory_creates_meta_data()
        {
            var factory = new AttributeMetadataFactory(new NullLogger());
            var node    = factory.Create(typeof(Person));

            Assert.Equal("Person", node.Name);
            Assert.Equal(3, node.Properties.Count());

            Assert.Equal("Id", node["Id"].Name);
            Assert.True(node["Id"].IsPrimitive);

            Assert.Equal("Name", node["Name"].Name);
            Assert.True(node["Name"].IsPrimitive);

            Assert.Equal("Contacts", node["Contacts"].Name);
            Assert.True(node["Contacts"].IsList);
            Assert.False(node["Contacts"].IsPrimitive);
            Assert.NotNull(node["Contacts"].Relationship);
            Assert.Equal("LINKED_TO", node["Contacts"].Relationship.Name);
        }
コード例 #18
0
        public void a_proxy_is_generated_for_trackable_relationships()
        {
            var metadataFactory      = new AttributeMetadataFactory(new NullLogger());
            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();
            var repositoryFactory    = new Mock <IRepositoryFactory>();
            var stateTracker         = new EntityStateCache();
            var proxyFactory         = new DynamicProxyFactory(metadataFactory, new NullLogger());

            using (var session = new GraphSession(new UnitOfWork(stateTracker), new List <IListener>(), queryExecutorFactory.Object, repositoryFactory.Object, stateTracker, proxyFactory))
            {
                var person = new Person
                {
                    Id      = "1",
                    Name    = "Test",
                    Address = new Address
                    {
                        Id   = "1",
                        Name = "first address"
                    }
                };
                var proxy = proxyFactory.Create(person, session);
                proxy.Address = null;
                proxy.Address = proxyFactory.Create(new Address {
                    Id = "2"
                }, session);
                var metadata = metadataFactory.Create(proxy);
                var trackableRelationships = ProxyUtils.Flush(proxy, metadata["Address"].Relationship).ToList();
                Assert.Equal(1, trackableRelationships.Count);
                foreach (var trackableRelationship in trackableRelationships)
                {
                    var enumerable = trackableRelationship.Flush();
                    var results    = enumerable.Cast <object>().ToList();
                    Assert.Equal(1, results.Count);
                    Assert.Equal("1", ((Address)results[0]).Id);
                    Assert.Equal("2", proxy.Address.Id);
                }
            }
        }
コード例 #19
0
        public void factory_is_thread_safe()
        {
            var error   = false;
            var factory = new AttributeMetadataFactory(new NullLogger());

            var threads = new Thread[150];

            for (int i = 0; i < threads.Length; i++)
            {
                threads[i] = new Thread(() =>
                {
                    try
                    {
                        var node     = factory.Create(typeof(Person));
                        var property = node["Id"];
                        Assert.Equal("Id", property.Name);
                    }
                    catch (Exception)
                    {
                        error = true;
                    }
                });
            }

            foreach (var thread in threads)
            {
                thread.Start();
            }

            foreach (Thread thread in threads)
            {
                thread.Join();
            }

            Assert.False(error);
        }
コード例 #20
0
        public void reverse_property_is_set_correctly_on_one_to_one_relationships()
        {
            var metadataFactory      = new AttributeMetadataFactory(new NullLogger());
            var queryExecutorFactory = new Mock <IQueryExecutorFactory>();
            var repositoryFactory    = new Mock <IRepositoryFactory>();
            var stateTracker         = new EntityStateCache();
            var proxyFactory         = new DynamicProxyFactory(metadataFactory, new NullLogger());

            using (var session = new GraphSession(new UnitOfWork(stateTracker), new List <IListener>(), queryExecutorFactory.Object, repositoryFactory.Object, stateTracker, proxyFactory))
            {
                var factory = new DynamicProxyFactory(metadataFactory, new NullLogger());
                var alpha   = factory.Create(new ClassAlpha
                {
                    Id = "1"
                }, session);
                var beta = factory.Create(new ClassBeta
                {
                    Id = "2"
                }, session);
                alpha.Beta = beta;
                var metadata = metadataFactory.Create(beta);
                Assert.True(metadata["Alpha"].Relationship.IsReverse);
            }
        }