protected TestObjectsC <TPrimary, TFirstSecondary, TSecondSecondary> CreateTestObjectsC <TPrimary, TFirstSecondary, TSecondSecondary>(
            IHooksDiscovery <TPrimary> primaryDiscovery = null, IHooksDiscovery <TFirstSecondary> firstSecondaryDiscovery = null,
            IHooksDiscovery <TSecondSecondary> secondSecondaryDiscovery = null, DbContextOptions <HooksDbContext> repoDbContextOptions = null)
            where TPrimary : class, IIdentifiable <int>
            where TFirstSecondary : class, IIdentifiable <int>
            where TSecondSecondary : class, IIdentifiable <int>
        {
            // creates the resource definition mock and corresponding for a given set of discoverable hooks
            Mock <IResourceHookContainer <TPrimary> >         primaryResource         = CreateResourceDefinition <TPrimary>();
            Mock <IResourceHookContainer <TFirstSecondary> >  firstSecondaryResource  = CreateResourceDefinition <TFirstSecondary>();
            Mock <IResourceHookContainer <TSecondSecondary> > secondSecondaryResource = CreateResourceDefinition <TSecondSecondary>();

            // mocking the genericServiceFactory and JsonApiContext and wiring them up.
            (Mock <ITargetedFields> ufMock, Mock <IEnumerable <IQueryConstraintProvider> > constraintsMock, Mock <IGenericServiceFactory> gpfMock,
             IJsonApiOptions options) = CreateMocks();

            HooksDbContext dbContext = repoDbContextOptions != null ? new HooksDbContext(repoDbContextOptions) : null;

            IResourceGraph resourceGraph = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance).Add <TPrimary>().Add <TFirstSecondary>()
                                           .Add <TSecondSecondary>().Build();

            SetupProcessorFactoryForResourceDefinition(gpfMock, primaryResource.Object, primaryDiscovery, dbContext, resourceGraph);
            SetupProcessorFactoryForResourceDefinition(gpfMock, firstSecondaryResource.Object, firstSecondaryDiscovery, dbContext, resourceGraph);
            SetupProcessorFactoryForResourceDefinition(gpfMock, secondSecondaryResource.Object, secondSecondaryDiscovery, dbContext, resourceGraph);

            var execHelper      = new HookContainerProvider(gpfMock.Object, ResourceGraph, options);
            var traversalHelper = new NodeNavigator(ResourceGraph, ufMock.Object);
            var hookExecutor    = new ResourceHookExecutor(execHelper, traversalHelper, ufMock.Object, constraintsMock.Object, ResourceGraph);

            return(new TestObjectsC <TPrimary, TFirstSecondary, TSecondSecondary>(constraintsMock, hookExecutor, primaryResource, firstSecondaryResource,
                                                                                  secondSecondaryResource));
        }
示例#2
0
        public void BeforeCreate()
        {
            // Arrange
            IHooksDiscovery <TodoItem> todoDiscovery   = SetDiscoverableHooks <TodoItem>(_targetHooks, EnableDbValues);
            IHooksDiscovery <Person>   personDiscovery = SetDiscoverableHooks <Person>(_targetHooks, EnableDbValues);

            (_, _, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <TodoItem> > todoResourceMock,
             Mock <IResourceHookContainer <Person> > ownerResourceMock) = CreateTestObjects(todoDiscovery, personDiscovery, _options);

            // Act
            hookExecutor.BeforeCreate(_todoList, ResourcePipeline.Post);

            // Assert
            todoResourceMock.Verify(
                rd => rd.BeforeCreate(It.Is <IResourceHashSet <TodoItem> >(resources => TodoCheck(resources, Description)), ResourcePipeline.Post), Times.Once());

            ownerResourceMock.Verify(
                rd => rd.BeforeUpdateRelationship(It.Is <HashSet <string> >(ids => PersonIdCheck(ids, _personId)), It.IsAny <IRelationshipsDictionary <Person> >(),
                                                  ResourcePipeline.Post), Times.Once());

            todoResourceMock.Verify(
                rd => rd.BeforeImplicitUpdateRelationship(
                    It.Is <IRelationshipsDictionary <TodoItem> >(rh => TodoCheckRelationships(rh, Description + Description)), ResourcePipeline.Post),
                Times.Once());

            VerifyNoOtherCalls(todoResourceMock, ownerResourceMock);
        }
        public void AfterRead_Without_Parent_Hook_Implemented()
        {
            // Arrange
            IHooksDiscovery <Article> articleDiscovery             = SetDiscoverableHooks <Article>(NoHooks, DisableDbValues);
            IHooksDiscovery <IdentifiableArticleTag> joinDiscovery = SetDiscoverableHooks <IdentifiableArticleTag>(_targetHooks, DisableDbValues);
            IHooksDiscovery <Tag> tagDiscovery = SetDiscoverableHooks <Tag>(_targetHooks, DisableDbValues);

            (_, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <Article> > articleResourceMock,
             Mock <IResourceHookContainer <IdentifiableArticleTag> > joinResourceMock, Mock <IResourceHookContainer <Tag> > tagResourceMock) =
                CreateTestObjectsC(articleDiscovery, joinDiscovery, tagDiscovery);

            (List <Article> articles, List <IdentifiableArticleTag> joins, List <Tag> tags) = CreateIdentifiableManyToManyData();

            // Act
            hookExecutor.AfterRead(articles, ResourcePipeline.Get);

            // Assert
            joinResourceMock.Verify(
                rd => rd.AfterRead(It.Is <HashSet <IdentifiableArticleTag> >(collection => !collection.Except(joins).Any()), ResourcePipeline.Get, true),
                Times.Once());

            tagResourceMock.Verify(rd => rd.AfterRead(It.Is <HashSet <Tag> >(collection => !collection.Except(tags).Any()), ResourcePipeline.Get, true),
                                   Times.Once());

            VerifyNoOtherCalls(articleResourceMock, joinResourceMock, tagResourceMock);
        }
示例#4
0
        public void AfterDelete_Without_Any_Hook_Implemented()
        {
            // Arrange
            IHooksDiscovery <TodoItem> discovery = SetDiscoverableHooks <TodoItem>(NoHooks, DisableDbValues);

            (IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <TodoItem> > resourceDefinitionMock) = CreateTestObjects(discovery);
            IEnumerable <TodoItem> todoList = CreateTodoWithOwner();

            // Act
            hookExecutor.AfterDelete(todoList, ResourcePipeline.Delete, It.IsAny <bool>());

            // Assert
            VerifyNoOtherCalls(resourceDefinitionMock);
        }
示例#5
0
        public void BeforeRead()
        {
            // Arrange
            IHooksDiscovery <TodoItem> todoDiscovery = SetDiscoverableHooks <TodoItem>(_targetHooks, DisableDbValues);

            (IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <TodoItem> > todoResourceMock) = CreateTestObjects(todoDiscovery);

            // Act
            hookExecutor.BeforeRead <TodoItem>(ResourcePipeline.Get);

            // Assert
            todoResourceMock.Verify(rd => rd.BeforeRead(ResourcePipeline.Get, false, null), Times.Once());
            VerifyNoOtherCalls(todoResourceMock);
        }
示例#6
0
        public void AfterDelete()
        {
            // Arrange
            IHooksDiscovery <TodoItem> discovery = SetDiscoverableHooks <TodoItem>(_targetHooks, DisableDbValues);

            (IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <TodoItem> > resourceDefinitionMock) = CreateTestObjects(discovery);
            IEnumerable <TodoItem> todoList = CreateTodoWithOwner();

            // Act
            hookExecutor.AfterDelete(todoList, ResourcePipeline.Delete, It.IsAny <bool>());

            // Assert
            resourceDefinitionMock.Verify(rd => rd.AfterDelete(It.IsAny <HashSet <TodoItem> >(), ResourcePipeline.Delete, It.IsAny <bool>()), Times.Once());
            VerifyNoOtherCalls(resourceDefinitionMock);
        }
示例#7
0
        public bool ShouldLoadDbValues(LeftType resourceType, ResourceHook hook)
        {
            IHooksDiscovery discovery = GetHookDiscovery(resourceType);

            if (discovery.DatabaseValuesDisabledHooks.Contains(hook))
            {
                return(false);
            }

            if (discovery.DatabaseValuesEnabledHooks.Contains(hook))
            {
                return(true);
            }

            return(_options.LoadDatabaseValues);
        }
示例#8
0
        public void BeforeCreate_Without_Any_Hook_Implemented()
        {
            // Arrange
            IHooksDiscovery <TodoItem> todoDiscovery   = SetDiscoverableHooks <TodoItem>(NoHooks, DisableDbValues);
            IHooksDiscovery <Person>   personDiscovery = SetDiscoverableHooks <Person>(NoHooks, DisableDbValues);

            (_, _, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <TodoItem> > todoResourceMock,
             Mock <IResourceHookContainer <Person> > ownerResourceMock) = CreateTestObjects(todoDiscovery, personDiscovery);

            IEnumerable <TodoItem> todoList = CreateTodoWithOwner();

            // Act
            hookExecutor.BeforeCreate(todoList, ResourcePipeline.Post);
            // Assert
            VerifyNoOtherCalls(todoResourceMock, ownerResourceMock);
        }
        public void Resource_Has_Multiple_Relations_To_Same_Type()
        {
            // Arrange
            IHooksDiscovery <TodoItem> todoDiscovery   = SetDiscoverableHooks <TodoItem>(_targetHooks, DisableDbValues);
            IHooksDiscovery <Person>   personDiscovery = SetDiscoverableHooks <Person>(_targetHooks, DisableDbValues);

            (_, _, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <TodoItem> > todoResourceMock,
             Mock <IResourceHookContainer <Person> > ownerResourceMock) = CreateTestObjects(todoDiscovery, personDiscovery);

            var person1 = new Person();

            var todo = new TodoItem
            {
                Owner = person1
            };

            var person2 = new Person
            {
                AssignedTodoItems = new HashSet <TodoItem>
                {
                    todo
                }
            };

            todo.Assignee = person2;

            var person3 = new Person
            {
                StakeHolderTodoItem = todo
            };

            todo.StakeHolders = new HashSet <Person>
            {
                person3
            };

            List <TodoItem> todoList = todo.AsList();

            // Act
            hookExecutor.OnReturn(todoList, ResourcePipeline.Post);

            // Assert
            todoResourceMock.Verify(rd => rd.OnReturn(It.IsAny <HashSet <TodoItem> >(), ResourcePipeline.Post), Times.Once());
            ownerResourceMock.Verify(rd => rd.OnReturn(It.IsAny <HashSet <Person> >(), ResourcePipeline.Post), Times.Once());
            VerifyNoOtherCalls(todoResourceMock, ownerResourceMock);
        }
        public void AfterRead_Without_Any_Hook_Implemented()
        {
            // Arrange
            IHooksDiscovery <Article> articleDiscovery = SetDiscoverableHooks <Article>(NoHooks, DisableDbValues);
            IHooksDiscovery <Tag>     tagDiscovery     = SetDiscoverableHooks <Tag>(NoHooks, DisableDbValues);

            (_, _, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <Article> > articleResourceMock,
             Mock <IResourceHookContainer <Tag> > tagResourceMock) = CreateTestObjects(articleDiscovery, tagDiscovery);

            (List <Article> articles, _) = CreateManyToManyData();

            // Act
            hookExecutor.AfterRead(articles, ResourcePipeline.Get);

            // Assert
            VerifyNoOtherCalls(articleResourceMock, tagResourceMock);
        }
        public void Resource_Has_Nested_Cyclic_Relations()
        {
            // Arrange
            IHooksDiscovery <TodoItem> todoDiscovery = SetDiscoverableHooks <TodoItem>(_targetHooks, DisableDbValues);

            (IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <TodoItem> > todoResourceMock) = CreateTestObjects(todoDiscovery);

            var rootTodo = new TodoItem
            {
                Id = 1
            };

            var child = new TodoItem
            {
                ParentTodo = rootTodo,
                Id         = 2
            };

            rootTodo.ChildTodoItems = child.AsList();

            var grandChild = new TodoItem
            {
                ParentTodo = child,
                Id         = 3
            };

            child.ChildTodoItems = grandChild.AsList();

            var greatGrandChild = new TodoItem
            {
                ParentTodo = grandChild,
                Id         = 4
            };

            grandChild.ChildTodoItems      = greatGrandChild.AsList();
            greatGrandChild.ChildTodoItems = rootTodo.AsList();
            List <TodoItem> todoList = rootTodo.AsList();

            // Act
            hookExecutor.OnReturn(todoList, ResourcePipeline.Post);

            // Assert
            todoResourceMock.Verify(rd => rd.OnReturn(It.IsAny <HashSet <TodoItem> >(), ResourcePipeline.Post), Times.Exactly(4));
            VerifyNoOtherCalls(todoResourceMock);
        }
示例#12
0
        public void OnReturn_Without_Parent_Hook_Implemented()
        {
            // Arrange
            IHooksDiscovery <Article> articleDiscovery = SetDiscoverableHooks <Article>(NoHooks, DisableDbValues);
            IHooksDiscovery <Tag>     tagDiscovery     = SetDiscoverableHooks <Tag>(_targetHooks, DisableDbValues);

            (_, _, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <Article> > articleResourceMock,
             Mock <IResourceHookContainer <Tag> > tagResourceMock) = CreateTestObjects(articleDiscovery, tagDiscovery);

            (List <Article> articles, List <Tag> tags) = CreateDummyData();

            // Act
            hookExecutor.OnReturn(articles, ResourcePipeline.Get);

            // Assert
            tagResourceMock.Verify(rd => rd.OnReturn(It.Is <HashSet <Tag> >(collection => !collection.Except(tags).Any()), ResourcePipeline.Get), Times.Once());
            VerifyNoOtherCalls(articleResourceMock, tagResourceMock);
        }
示例#13
0
        protected TestObjectsA <TPrimary> CreateTestObjects <TPrimary>(IHooksDiscovery <TPrimary> primaryDiscovery = null)
            where TPrimary : class, IIdentifiable <int>
        {
            // creates the resource definition mock and corresponding ImplementedHooks discovery instance
            Mock <IResourceHookContainer <TPrimary> > primaryResource = CreateResourceDefinition <TPrimary>();

            // mocking the genericServiceFactory and JsonApiContext and wiring them up.
            (Mock <ITargetedFields> ufMock, Mock <IEnumerable <IQueryConstraintProvider> > constraintsMock, Mock <IGenericServiceFactory> gpfMock,
             IJsonApiOptions options) = CreateMocks();

            SetupProcessorFactoryForResourceDefinition(gpfMock, primaryResource.Object, primaryDiscovery);

            var execHelper      = new HookContainerProvider(gpfMock.Object, ResourceGraph, options);
            var traversalHelper = new NodeNavigator(ResourceGraph, ufMock.Object);
            var hookExecutor    = new ResourceHookExecutor(execHelper, traversalHelper, ufMock.Object, constraintsMock.Object, ResourceGraph);

            return(new TestObjectsA <TPrimary>(hookExecutor, primaryResource));
        }
示例#14
0
        public void BeforeDelete_No_Children_Hooks()
        {
            // Arrange
            IHooksDiscovery <Person>   personDiscovery   = SetDiscoverableHooks <Person>(_targetHooks, EnableDbValues);
            IHooksDiscovery <TodoItem> todoDiscovery     = SetDiscoverableHooks <TodoItem>(NoHooks, DisableDbValues);
            IHooksDiscovery <Passport> passportDiscovery = SetDiscoverableHooks <Passport>(NoHooks, DisableDbValues);

            (_, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <Person> > personResourceMock,
             Mock <IResourceHookContainer <TodoItem> > todoResourceMock, Mock <IResourceHookContainer <Passport> > passportResourceMock) =
                CreateTestObjectsC(personDiscovery, todoDiscovery, passportDiscovery, _options);

            // Act
            hookExecutor.BeforeDelete(_person.AsList(), ResourcePipeline.Delete);

            // Assert
            personResourceMock.Verify(rd => rd.BeforeDelete(It.IsAny <IResourceHashSet <Person> >(), It.IsAny <ResourcePipeline>()), Times.Once());
            VerifyNoOtherCalls(personResourceMock, todoResourceMock, passportResourceMock);
        }
        public void BeforeCreate_NoImplicit_Without_Child_Hook_Implemented()
        {
            // Arrange
            IHooksDiscovery <TodoItem> todoDiscovery   = SetDiscoverableHooks <TodoItem>(_targetHooksNoImplicit, ResourceHook.BeforeUpdate);
            IHooksDiscovery <Person>   personDiscovery = SetDiscoverableHooks <Person>(NoHooks, DisableDbValues);

            (_, _, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <TodoItem> > todoResourceMock,
             Mock <IResourceHookContainer <Person> > ownerResourceMock) = CreateTestObjects(todoDiscovery, personDiscovery, _options);

            // Act
            hookExecutor.BeforeCreate(_todoList, ResourcePipeline.Post);

            // Assert
            todoResourceMock.Verify(
                rd => rd.BeforeCreate(It.Is <IResourceHashSet <TodoItem> >(resources => TodoCheck(resources, Description)), ResourcePipeline.Post), Times.Once());

            VerifyNoOtherCalls(todoResourceMock, ownerResourceMock);
        }
        public void AfterUpdate_Without_Child_Hook_Implemented()
        {
            // Arrange
            IHooksDiscovery <TodoItem> todoDiscovery   = SetDiscoverableHooks <TodoItem>(_targetHooks, DisableDbValues);
            IHooksDiscovery <Person>   personDiscovery = SetDiscoverableHooks <Person>(NoHooks, DisableDbValues);

            (_, _, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <TodoItem> > todoResourceMock,
             Mock <IResourceHookContainer <Person> > ownerResourceMock) = CreateTestObjects(todoDiscovery, personDiscovery);

            IEnumerable <TodoItem> todoList = CreateTodoWithOwner();

            // Act
            hookExecutor.AfterUpdate(todoList, ResourcePipeline.Patch);

            // Assert
            todoResourceMock.Verify(rd => rd.AfterUpdate(It.IsAny <HashSet <TodoItem> >(), ResourcePipeline.Patch), Times.Once());
            VerifyNoOtherCalls(todoResourceMock, ownerResourceMock);
        }
        public void AfterRead_Without_Children_Hooks_Implemented()
        {
            // Arrange
            IHooksDiscovery <Article> articleDiscovery = SetDiscoverableHooks <Article>(_targetHooks, DisableDbValues);
            IHooksDiscovery <Tag>     tagDiscovery     = SetDiscoverableHooks <Tag>(NoHooks, DisableDbValues);

            (_, _, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <Article> > articleResourceMock,
             Mock <IResourceHookContainer <Tag> > tagResourceMock) = CreateTestObjects(articleDiscovery, tagDiscovery);

            (List <Article> articles, _) = CreateManyToManyData();

            // Act
            hookExecutor.AfterRead(articles, ResourcePipeline.Get);

            // Assert
            articleResourceMock.Verify(rd => rd.AfterRead(It.IsAny <HashSet <Article> >(), ResourcePipeline.Get, false), Times.Once());
            VerifyNoOtherCalls(articleResourceMock, tagResourceMock);
        }
        public void BeforeUpdate_NoImplicit_Without_Parent_Hook_Implemented()
        {
            // Arrange
            IHooksDiscovery <TodoItem> todoDiscovery   = SetDiscoverableHooks <TodoItem>(NoHooks, DisableDbValues);
            IHooksDiscovery <Person>   personDiscovery = SetDiscoverableHooks <Person>(_targetHooksNoImplicit, ResourceHook.BeforeUpdateRelationship);

            (_, _, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <TodoItem> > todoResourceMock,
             Mock <IResourceHookContainer <Person> > ownerResourceMock) = CreateTestObjects(todoDiscovery, personDiscovery, _options);

            // Act
            hookExecutor.BeforeUpdate(_todoList, ResourcePipeline.Patch);

            // Assert
            ownerResourceMock.Verify(
                rd => rd.BeforeUpdateRelationship(It.Is <HashSet <string> >(ids => PersonIdCheck(ids, _personId)),
                                                  It.Is <IRelationshipsDictionary <Person> >(rh => PersonCheck(LastName, rh)), ResourcePipeline.Patch), Times.Once());

            VerifyNoOtherCalls(todoResourceMock, ownerResourceMock);
        }
        public void Resource_Has_Cyclic_Relations()
        {
            // Arrange
            IHooksDiscovery <TodoItem> todoDiscovery = SetDiscoverableHooks <TodoItem>(_targetHooks, DisableDbValues);

            (IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <TodoItem> > todoResourceMock) = CreateTestObjects(todoDiscovery);
            var todo = new TodoItem();

            todo.ParentTodo     = todo;
            todo.ChildTodoItems = todo.AsList();
            List <TodoItem> todoList = todo.AsList();

            // Act
            hookExecutor.OnReturn(todoList, ResourcePipeline.Post);

            // Assert
            todoResourceMock.Verify(rd => rd.OnReturn(It.IsAny <HashSet <TodoItem> >(), ResourcePipeline.Post), Times.Once());
            VerifyNoOtherCalls(todoResourceMock);
        }
        public void OnReturn_Without_Any_Descendant_Hooks_Implemented()
        {
            // Arrange
            IHooksDiscovery <Article> articleDiscovery             = SetDiscoverableHooks <Article>(_targetHooks, DisableDbValues);
            IHooksDiscovery <IdentifiableArticleTag> joinDiscovery = SetDiscoverableHooks <IdentifiableArticleTag>(NoHooks, DisableDbValues);
            IHooksDiscovery <Tag> tagDiscovery = SetDiscoverableHooks <Tag>(NoHooks, DisableDbValues);

            (_, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <Article> > articleResourceMock,
             Mock <IResourceHookContainer <IdentifiableArticleTag> > joinResourceMock, Mock <IResourceHookContainer <Tag> > tagResourceMock) =
                CreateTestObjectsC(articleDiscovery, joinDiscovery, tagDiscovery);

            (List <Article> articles, _, _) = CreateIdentifiableManyToManyData();

            // Act
            hookExecutor.OnReturn(articles, ResourcePipeline.Get);

            // Assert
            articleResourceMock.Verify(rd => rd.OnReturn(It.IsAny <HashSet <Article> >(), ResourcePipeline.Get), Times.Once());
            VerifyNoOtherCalls(articleResourceMock, joinResourceMock, tagResourceMock);
        }
示例#21
0
        public void BeforeReadWithNestedInclusion_Without_Any_Hook_Implemented()
        {
            // Arrange
            IHooksDiscovery <TodoItem> todoDiscovery     = SetDiscoverableHooks <TodoItem>(NoHooks, DisableDbValues);
            IHooksDiscovery <Person>   personDiscovery   = SetDiscoverableHooks <Person>(NoHooks, DisableDbValues);
            IHooksDiscovery <Passport> passportDiscovery = SetDiscoverableHooks <Passport>(NoHooks, DisableDbValues);

            (Mock <IEnumerable <IQueryConstraintProvider> > constraintsMock, IResourceHookExecutor hookExecutor,
             Mock <IResourceHookContainer <TodoItem> > todoResourceMock, Mock <IResourceHookContainer <Person> > ownerResourceMock,
             Mock <IResourceHookContainer <Passport> > passportResourceMock) = CreateTestObjectsC(todoDiscovery, personDiscovery, passportDiscovery);

            IEnumerable <IQueryConstraintProvider> constraintProviders = Wrap(ToIncludeExpression("owner.passport", "assignee", "stakeHolders"));

            constraintsMock.Setup(providers => providers.GetEnumerator()).Returns(constraintProviders.GetEnumerator());

            // Act
            hookExecutor.BeforeRead <TodoItem>(ResourcePipeline.Get);

            // Assert
            VerifyNoOtherCalls(todoResourceMock, ownerResourceMock, passportResourceMock);
        }
示例#22
0
        public void BeforeCreate_Without_Parent_Hook_Implemented()
        {
            // Arrange
            IHooksDiscovery <TodoItem> todoDiscovery   = SetDiscoverableHooks <TodoItem>(NoHooks, DisableDbValues);
            IHooksDiscovery <Person>   personDiscovery = SetDiscoverableHooks <Person>(_targetHooks, DisableDbValues);

            (_, _, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <TodoItem> > todoResourceMock,
             Mock <IResourceHookContainer <Person> > ownerResourceMock) = CreateTestObjects(todoDiscovery, personDiscovery);

            IEnumerable <TodoItem> todoList = CreateTodoWithOwner();

            // Act
            hookExecutor.BeforeCreate(todoList, ResourcePipeline.Post);
            // Assert
            todoResourceMock.Verify(rd => rd.BeforeCreate(It.IsAny <IResourceHashSet <TodoItem> >(), ResourcePipeline.Post), Times.Never());

            ownerResourceMock.Verify(
                rd => rd.BeforeUpdateRelationship(It.IsAny <HashSet <string> >(), It.IsAny <IRelationshipsDictionary <Person> >(), ResourcePipeline.Post),
                Times.Once());

            VerifyNoOtherCalls(todoResourceMock, ownerResourceMock);
        }
        public void AfterRead()
        {
            // Arrange
            IHooksDiscovery <Article> articleDiscovery = SetDiscoverableHooks <Article>(_targetHooks, DisableDbValues);
            IHooksDiscovery <Tag>     tagDiscovery     = SetDiscoverableHooks <Tag>(_targetHooks, DisableDbValues);

            (_, _, IResourceHookExecutor hookExecutor, Mock <IResourceHookContainer <Article> > articleResourceMock,
             Mock <IResourceHookContainer <Tag> > tagResourceMock) = CreateTestObjects(articleDiscovery, tagDiscovery);

            (List <Article> articles, List <Tag> tags) = CreateManyToManyData();

            // Act
            hookExecutor.AfterRead(articles, ResourcePipeline.Get);

            // Assert
            articleResourceMock.Verify(rd => rd.AfterRead(It.IsAny <HashSet <Article> >(), ResourcePipeline.Get, false), Times.Once());

            tagResourceMock.Verify(rd => rd.AfterRead(It.Is <HashSet <Tag> >(collection => !collection.Except(tags).Any()), ResourcePipeline.Get, true),
                                   Times.Once());

            VerifyNoOtherCalls(articleResourceMock, tagResourceMock);
        }
示例#24
0
        public void BeforeReadWithInclusion()
        {
            // Arrange
            IHooksDiscovery <TodoItem> todoDiscovery   = SetDiscoverableHooks <TodoItem>(_targetHooks, DisableDbValues);
            IHooksDiscovery <Person>   personDiscovery = SetDiscoverableHooks <Person>(_targetHooks, DisableDbValues);

            (Mock <IEnumerable <IQueryConstraintProvider> > constraintsMock, _, IResourceHookExecutor hookExecutor,
             Mock <IResourceHookContainer <TodoItem> > todoResourceMock, Mock <IResourceHookContainer <Person> > ownerResourceMock) =
                CreateTestObjects(todoDiscovery, personDiscovery);

            IEnumerable <IQueryConstraintProvider> constraintProviders = Wrap(ToIncludeExpression("owner", "assignee", "stakeHolders"));

            constraintsMock.Setup(providers => providers.GetEnumerator()).Returns(constraintProviders.GetEnumerator());

            // Act
            hookExecutor.BeforeRead <TodoItem>(ResourcePipeline.Get);

            // Assert
            todoResourceMock.Verify(rd => rd.BeforeRead(ResourcePipeline.Get, false, null), Times.Once());
            ownerResourceMock.Verify(rd => rd.BeforeRead(ResourcePipeline.Get, true, null), Times.Once());
            VerifyNoOtherCalls(todoResourceMock, ownerResourceMock);
        }
示例#25
0
        CreateTestObjects <TPrimary, TFirstSecondary, TSecondSecondary>(
            IHooksDiscovery <TPrimary> primaryDiscovery = null,
            IHooksDiscovery <TFirstSecondary> firstSecondaryDiscovery   = null,
            IHooksDiscovery <TSecondSecondary> secondSecondaryDiscovery = null,
            DbContextOptions <AppDbContext> repoDbContextOptions        = null
            )
            where TPrimary : class, IIdentifiable <int>
            where TFirstSecondary : class, IIdentifiable <int>
            where TSecondSecondary : class, IIdentifiable <int>
        {
            // creates the resource definition mock and corresponding for a given set of discoverable hooks
            var primaryResource         = CreateResourceDefinition <TPrimary>();
            var firstSecondaryResource  = CreateResourceDefinition <TFirstSecondary>();
            var secondSecondaryResource = CreateResourceDefinition <TSecondSecondary>();

            // mocking the genericServiceFactory and JsonApiContext and wiring them up.
            var(ufMock, constraintsMock, gpfMock, options) = CreateMocks();

            var dbContext = repoDbContextOptions != null ? new AppDbContext(repoDbContextOptions) : null;

            var resourceGraph = new ResourceGraphBuilder(new JsonApiOptions(), NullLoggerFactory.Instance)
                                .Add <TPrimary>()
                                .Add <TFirstSecondary>()
                                .Add <TSecondSecondary>()
                                .Build();

            SetupProcessorFactoryForResourceDefinition(gpfMock, primaryResource.Object, primaryDiscovery, dbContext, resourceGraph);
            SetupProcessorFactoryForResourceDefinition(gpfMock, firstSecondaryResource.Object, firstSecondaryDiscovery, dbContext, resourceGraph);
            SetupProcessorFactoryForResourceDefinition(gpfMock, secondSecondaryResource.Object, secondSecondaryDiscovery, dbContext, resourceGraph);

            var execHelper      = new HookExecutorHelper(gpfMock.Object, ResourceGraph, options);
            var traversalHelper = new TraversalHelper(ResourceGraph, ufMock.Object);
            var hookExecutor    = new ResourceHookExecutor(execHelper, traversalHelper, ufMock.Object, constraintsMock.Object, ResourceGraph);

            return(constraintsMock, hookExecutor, primaryResource, firstSecondaryResource, secondSecondaryResource);
        }
示例#26
0
        private bool ShouldExecuteHook(RightType resourceType, ResourceHook hook)
        {
            IHooksDiscovery discovery = GetHookDiscovery(resourceType);

            return(discovery.ImplementedHooks.Contains(hook));
        }
示例#27
0
        internal (ResourceHookExecutor, Mock <IResourceHookContainer <TPrimary> >) CreateTestObjects <TPrimary>(IHooksDiscovery <TPrimary> primaryDiscovery = null)
            where TPrimary : class, IIdentifiable <int>
        {
            // creates the resource definition mock and corresponding ImplementedHooks discovery instance
            var primaryResource = CreateResourceDefinition <TPrimary>();

            // mocking the genericServiceFactory and JsonApiContext and wiring them up.
            var(ufMock, constraintsMock, gpfMock, options) = CreateMocks();

            SetupProcessorFactoryForResourceDefinition(gpfMock, primaryResource.Object, primaryDiscovery);

            var execHelper      = new HookExecutorHelper(gpfMock.Object, ResourceGraph, options);
            var traversalHelper = new TraversalHelper(ResourceGraph, ufMock.Object);
            var hookExecutor    = new ResourceHookExecutor(execHelper, traversalHelper, ufMock.Object, constraintsMock.Object, ResourceGraph);

            return(hookExecutor, primaryResource);
        }
示例#28
0
        private void SetupProcessorFactoryForResourceDefinition <TModel>(Mock <IGenericServiceFactory> processorFactory,
                                                                         IResourceHookContainer <TModel> modelResource, IHooksDiscovery <TModel> discovery, AppDbContext dbContext = null, IResourceGraph resourceGraph = null)
            where TModel : class, IIdentifiable <int>
        {
            processorFactory.Setup(factory => factory.Get <IResourceHookContainer>(typeof(ResourceHooksDefinition <>), typeof(TModel))).Returns(modelResource);

            processorFactory.Setup(factory => factory.Get <IHooksDiscovery>(typeof(IHooksDiscovery <>), typeof(TModel))).Returns(discovery);

            if (dbContext != null)
            {
                Type idType = ObjectFactory.GetIdType(typeof(TModel));

                if (idType == typeof(int))
                {
                    IResourceReadRepository <TModel, int> repo = CreateTestRepository <TModel>(dbContext, resourceGraph);

                    processorFactory.Setup(factory =>
                                           factory.Get <IResourceReadRepository <TModel, int> >(typeof(IResourceReadRepository <,>), typeof(TModel), typeof(int))).Returns(repo);
                }
                else
                {
                    throw new TypeLoadException("Test not set up properly");
                }
            }
        }