コード例 #1
0
        /// <inheritdoc />
        public TopLevelLinks GetTopLevelLinks()
        {
            ResourceContext resourceContext = _request.PrimaryResource;

            TopLevelLinks topLevelLinks = null;

            if (ShouldAddTopLevelLink(resourceContext, LinkTypes.Self))
            {
                topLevelLinks = new TopLevelLinks {
                    Self = GetSelfTopLevelLink(resourceContext, null)
                };
            }

            if (ShouldAddTopLevelLink(resourceContext, LinkTypes.Related) && _request.Kind == EndpointKind.Relationship)
            {
                topLevelLinks ??= new TopLevelLinks();
                topLevelLinks.Related = GetRelatedRelationshipLink(_request.PrimaryResource.PublicName, _request.PrimaryId, _request.Relationship.PublicName);
            }

            if (ShouldAddTopLevelLink(resourceContext, LinkTypes.Paging) && _paginationContext.PageSize != null && _request.IsCollection)
            {
                SetPageLinks(resourceContext, topLevelLinks ??= new TopLevelLinks());
            }

            return(topLevelLinks);
        }
コード例 #2
0
        public void DeserializeList_EmptyResponseWithTopLevelLinks_CanDeserialize()
        {
            // Arrange
            var content = new Document
            {
                Links = new TopLevelLinks
                {
                    Self = _linkValues["self"],
                    Next = _linkValues["next"],
                    Last = _linkValues["last"]
                },
                Data = new List <ResourceObject>()
            };

            string body = JsonConvert.SerializeObject(content);

            // Act
            ManyResponse <TestResource> result = _deserializer.DeserializeMany <TestResource>(body);

            // Assert
            Assert.Empty(result.Data);
            Assert.NotNull(result.Links);
            TopLevelLinks links = result.Links;

            Assert.Equal(_linkValues["self"], links.Self);
            Assert.Equal(_linkValues["next"], links.Next);
            Assert.Equal(_linkValues["last"], links.Last);
        }
コード例 #3
0
        protected ILinkBuilder GetLinkBuilder(TopLevelLinks top = null, ResourceLinks resource = null, RelationshipLinks relationship = null)
        {
            var mock = new Mock <ILinkBuilder>();

            mock.Setup(m => m.GetTopLevelLinks()).Returns(top);
            mock.Setup(m => m.GetResourceLinks(It.IsAny <string>(), It.IsAny <string>())).Returns(resource);
            mock.Setup(m => m.GetRelationshipLinks(It.IsAny <RelationshipAttribute>(), It.IsAny <IIdentifiable>())).Returns(relationship);
            return(mock.Object);
        }
コード例 #4
0
 private bool CheckPages(TopLevelLinks links, bool pages)
 {
     if (pages)
     {
         return(links.Self == $"{_host}/articles?page[size]=10&page[number]=2" &&
                links.First == $"{_host}/articles?page[size]=10&page[number]=1" &&
                links.Prev == $"{_host}/articles?page[size]=10&page[number]=1" &&
                links.Next == $"{_host}/articles?page[size]=10&page[number]=3" &&
                links.Last == $"{_host}/articles?page[size]=10&page[number]=3");
     }
     return(links.First == null && links.Prev == null && links.Next == null && links.Last == null);
 }
コード例 #5
0
        private bool CheckLinks(TopLevelLinks links, bool pages, string expectedSelfLink)
        {
            if (pages)
            {
                return(links.Self == $"{_host}/articles?foo=bar&page[size]=10&page[number]=2" &&
                       links.First == $"{_host}/articles?foo=bar&page[size]=10&page[number]=1" &&
                       links.Prev == $"{_host}/articles?foo=bar&page[size]=10&page[number]=1" &&
                       links.Next == $"{_host}/articles?foo=bar&page[size]=10&page[number]=3" &&
                       links.Last == $"{_host}/articles?foo=bar&page[size]=10&page[number]=3");
            }

            return(links.Self == expectedSelfLink && links.First == null && links.Prev == null && links.Next == null && links.Last == null);
        }
コード例 #6
0
        /// <inheritdoc/>
        public TopLevelLinks GetTopLevelLinks(ResourceContext primaryResource)
        {
            TopLevelLinks topLevelLinks = null;

            if (ShouldAddTopLevelLink(primaryResource, Link.Self))
            {
                topLevelLinks = new TopLevelLinks {
                    Self = GetSelfTopLevelLink(primaryResource.ResourceName)
                };
            }

            if (ShouldAddTopLevelLink(primaryResource, Link.Paging) && _pageService.CanPaginate)
            {
                SetPageLinks(primaryResource, topLevelLinks ??= new TopLevelLinks());
            }

            return(topLevelLinks);
        }
コード例 #7
0
        private void SetPageLinks(ResourceContext resourceContext, TopLevelLinks links)
        {
            if (_paginationContext.PageNumber.OneBasedValue > 1)
            {
                links.Prev = GetPageLink(resourceContext, _paginationContext.PageNumber.OneBasedValue - 1, _paginationContext.PageSize);
            }

            if (_paginationContext.PageNumber.OneBasedValue < _paginationContext.TotalPageCount)
            {
                links.Next = GetPageLink(resourceContext, _paginationContext.PageNumber.OneBasedValue + 1, _paginationContext.PageSize);
            }

            if (_paginationContext.TotalPageCount > 0)
            {
                links.Self  = GetPageLink(resourceContext, _paginationContext.PageNumber.OneBasedValue, _paginationContext.PageSize);
                links.First = GetPageLink(resourceContext, 1, _paginationContext.PageSize);
                links.Last  = GetPageLink(resourceContext, _paginationContext.TotalPageCount.Value, _paginationContext.PageSize);
            }
        }
コード例 #8
0
        private void SetPageLinks(ResourceContext resourceContext, TopLevelLinks links)
        {
            if (_pageService.CurrentPage > 1)
            {
                links.Prev = GetPageLink(resourceContext, _pageService.CurrentPage - 1, _pageService.PageSize);
            }

            if (_pageService.CurrentPage < _pageService.TotalPages)
            {
                links.Next = GetPageLink(resourceContext, _pageService.CurrentPage + 1, _pageService.PageSize);
            }

            if (_pageService.TotalPages > 0)
            {
                links.Self  = GetPageLink(resourceContext, _pageService.CurrentPage, _pageService.PageSize);
                links.First = GetPageLink(resourceContext, 1, _pageService.PageSize);
                links.Last  = GetPageLink(resourceContext, _pageService.TotalPages, _pageService.PageSize);
            }
        }
コード例 #9
0
 public SerializerTestsSetup()
 {
     _dummyTopLevelLinks = new TopLevelLinks
     {
         Self  = "http://www.dummy.com/dummy-self-link",
         Next  = "http://www.dummy.com/dummy-next-link",
         Prev  = "http://www.dummy.com/dummy-prev-link",
         First = "http://www.dummy.com/dummy-first-link",
         Last  = "http://www.dummy.com/dummy-last-link"
     };
     _dummyResourceLinks = new ResourceLinks
     {
         Self = "http://www.dummy.com/dummy-resource-self-link"
     };
     _dummyRelationshipLinks = new RelationshipLinks
     {
         Related = "http://www.dummy.com/dummy-relationship-related-link",
         Self    = "http://www.dummy.com/dummy-relationship-self-link"
     };
 }
コード例 #10
0
        /// <inheritdoc />
        public TopLevelLinks GetTopLevelLinks()
        {
            ResourceContext resourceContext = _request.PrimaryResource;

            TopLevelLinks topLevelLinks = null;

            if (ShouldAddTopLevelLink(resourceContext, LinkTypes.Self))
            {
                topLevelLinks = new TopLevelLinks {
                    Self = GetSelfTopLevelLink(resourceContext)
                };
            }

            if (ShouldAddTopLevelLink(resourceContext, LinkTypes.Paging) && _paginationContext.PageSize != null)
            {
                SetPageLinks(resourceContext, topLevelLinks ??= new TopLevelLinks());
            }

            return(topLevelLinks);
        }
コード例 #11
0
        /// <inheritdoc/>
        public TopLevelLinks GetTopLevelLinks()
        {
            ResourceContext resourceContext = _currentRequest.GetRequestResource();

            TopLevelLinks topLevelLinks = null;

            if (ShouldAddTopLevelLink(resourceContext, Link.Self))
            {
                topLevelLinks = new TopLevelLinks {
                    Self = GetSelfTopLevelLink(resourceContext)
                };
            }

            if (ShouldAddTopLevelLink(resourceContext, Link.Paging) && _pageService.CanPaginate)
            {
                SetPageLinks(resourceContext, topLevelLinks ??= new TopLevelLinks());
            }

            return(topLevelLinks);
        }
コード例 #12
0
        private void SetPageLinks(ResourceContext resourceContext, TopLevelLinks links)
        {
            links.First = GetPageLink(resourceContext, 1, _paginationContext.PageSize);

            if (_paginationContext.TotalPageCount > 0)
            {
                links.Last = GetPageLink(resourceContext, _paginationContext.TotalPageCount.Value, _paginationContext.PageSize);
            }

            if (_paginationContext.PageNumber.OneBasedValue > 1)
            {
                links.Prev = GetPageLink(resourceContext, _paginationContext.PageNumber.OneBasedValue - 1, _paginationContext.PageSize);
            }

            bool hasNextPage         = _paginationContext.PageNumber.OneBasedValue < _paginationContext.TotalPageCount;
            bool possiblyHasNextPage = _paginationContext.TotalPageCount == null && _paginationContext.IsPageFull;

            if (hasNextPage || possiblyHasNextPage)
            {
                links.Next = GetPageLink(resourceContext, _paginationContext.PageNumber.OneBasedValue + 1, _paginationContext.PageSize);
            }
        }
コード例 #13
0
        public void DeserializeSingle_EmptyResponseWithTopLevelLinks_CanDeserialize()
        {
            // Arrange
            var content = new Document
            {
                Links = new TopLevelLinks {
                    Self = _linkValues["self"], Next = _linkValues["next"], Last = _linkValues["last"]
                }
            };
            var body = JsonConvert.SerializeObject(content);

            // Act
            var result = _deserializer.DeserializeSingle <TestResource>(body);

            // Assert
            Assert.Null(result.Data);
            Assert.NotNull(result.Links);
            TopLevelLinks links = (TopLevelLinks)result.Links;

            Assert.Equal(_linkValues["self"], links.Self);
            Assert.Equal(_linkValues["next"], links.Next);
            Assert.Equal(_linkValues["last"], links.Last);
        }
コード例 #14
0
        protected ResponseSerializer <T> GetResponseSerializer <T>(List <List <RelationshipAttribute> > inclusionChains = null, Dictionary <string, object> metaDict = null, TopLevelLinks topLinks = null, ResourceLinks resourceLinks = null, RelationshipLinks relationshipLinks = null) where T : class, IIdentifiable
        {
            var meta = GetMetaBuilder <T>(metaDict);
            var link = GetLinkBuilder(topLinks, resourceLinks, relationshipLinks);
            var includeConstraints = GetIncludeConstraints(inclusionChains);
            var includedBuilder    = GetIncludedBuilder();
            var fieldsToSerialize  = GetSerializableFields();
            ResponseResourceObjectBuilder resourceObjectBuilder = new ResponseResourceObjectBuilder(link, includedBuilder, includeConstraints, _resourceGraph, GetSerializerSettingsProvider());

            return(new ResponseSerializer <T>(meta, link, includedBuilder, fieldsToSerialize, resourceObjectBuilder, new JsonApiOptions()));
        }
コード例 #15
0
        public void Applies_cascading_settings_for_top_level_links(LinkTypes linksInResourceContext, LinkTypes linksInOptions, LinkTypes expected)
        {
            // Arrange
            var exampleResourceContext = new ResourceContext
            {
                PublicName    = nameof(ExampleResource),
                ResourceType  = typeof(ExampleResource),
                TopLevelLinks = linksInResourceContext
            };

            var options = new JsonApiOptions
            {
                TopLevelLinks = linksInOptions
            };

            var request = new JsonApiRequest
            {
                PrimaryResource = exampleResourceContext,
                PrimaryId       = "1",
                IsCollection    = true,
                Kind            = EndpointKind.Relationship,
                Relationship    = new HasOneAttribute()
            };

            var paginationContext = new PaginationContext
            {
                PageSize           = new PageSize(1),
                PageNumber         = new PageNumber(2),
                TotalResourceCount = 10
            };

            var resourceGraph             = new ResourceGraph(exampleResourceContext.AsArray());
            var httpContextAccessor       = new FakeHttpContextAccessor();
            var linkGenerator             = new FakeLinkGenerator();
            var controllerResourceMapping = new FakeControllerResourceMapping();

            var linkBuilder = new LinkBuilder(options, request, paginationContext, resourceGraph, httpContextAccessor, linkGenerator,
                                              controllerResourceMapping);

            // Act
            TopLevelLinks topLevelLinks = linkBuilder.GetTopLevelLinks();

            // Assert
            if (expected == LinkTypes.None)
            {
                topLevelLinks.Should().BeNull();
            }
            else
            {
                if (expected.HasFlag(LinkTypes.Self))
                {
                    topLevelLinks.Self.Should().NotBeNull();
                }
                else
                {
                    topLevelLinks.Self.Should().BeNull();
                }

                if (expected.HasFlag(LinkTypes.Related))
                {
                    topLevelLinks.Related.Should().NotBeNull();
                }
                else
                {
                    topLevelLinks.Related.Should().BeNull();
                }

                if (expected.HasFlag(LinkTypes.Paging))
                {
                    topLevelLinks.First.Should().NotBeNull();
                    topLevelLinks.Last.Should().NotBeNull();
                    topLevelLinks.Prev.Should().NotBeNull();
                    topLevelLinks.Next.Should().NotBeNull();
                }
                else
                {
                    topLevelLinks.First.Should().BeNull();
                    topLevelLinks.Last.Should().BeNull();
                    topLevelLinks.Prev.Should().BeNull();
                    topLevelLinks.Next.Should().BeNull();
                }
            }
        }
コード例 #16
0
        protected ResponseSerializer <T> GetResponseSerializer <T>(IEnumerable <IEnumerable <RelationshipAttribute> > inclusionChains = null,
                                                                   Dictionary <string, object> metaDict = null, TopLevelLinks topLinks = null, ResourceLinks resourceLinks = null,
                                                                   RelationshipLinks relationshipLinks  = null)
            where T : class, IIdentifiable
        {
            IEnumerable <RelationshipAttribute>[] inclusionChainArray = inclusionChains?.ToArray();

            IMetaBuilder meta = GetMetaBuilder(metaDict);
            ILinkBuilder link = GetLinkBuilder(topLinks, resourceLinks, relationshipLinks);
            IEnumerable <IQueryConstraintProvider> includeConstraints         = GetIncludeConstraints(inclusionChainArray);
            IIncludedResourceObjectBuilder         includedBuilder            = GetIncludedBuilder(inclusionChainArray != null);
            IFieldsToSerialize                     fieldsToSerialize          = GetSerializableFields();
            IResourceDefinitionAccessor            resourceDefinitionAccessor = GetResourceDefinitionAccessor();
            IResourceObjectBuilderSettingsProvider settingsProvider           = GetSerializerSettingsProvider();
            IEvaluatedIncludeCache                 evaluatedIncludeCache      = GetEvaluatedIncludeCache(inclusionChainArray);

            var resourceObjectBuilder = new ResponseResourceObjectBuilder(link, includedBuilder, includeConstraints, ResourceGraph, resourceDefinitionAccessor,
                                                                          settingsProvider, evaluatedIncludeCache);

            var jsonApiOptions = new JsonApiOptions();

            return(new ResponseSerializer <T>(meta, link, includedBuilder, fieldsToSerialize, resourceObjectBuilder, resourceDefinitionAccessor, jsonApiOptions));
        }