/// <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); }
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); }
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); }
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); }
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); }
/// <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); }
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); } }
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); } }
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" }; }
/// <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); }
/// <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); }
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); } }
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); }
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())); }
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(); } } }
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)); }