Skip to content

Commit b09e6b1

Browse files
authored
Fix for OnReturn hook in GetSecondary pipeline (#926)
* fix invalid casting issue for get secondary resource on return hook * unit test and simplified usage of dynamic
1 parent 04ab170 commit b09e6b1

File tree

4 files changed

+28
-3
lines changed

4 files changed

+28
-3
lines changed

src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -118,7 +118,7 @@ public IEnumerable<TResource> BeforeDelete<TResource>(IEnumerable<TResource> res
118118
/// <inheritdoc />
119119
public IEnumerable<TResource> OnReturn<TResource>(IEnumerable<TResource> resources, ResourcePipeline pipeline) where TResource : class, IIdentifiable
120120
{
121-
if (GetHook(ResourceHook.OnReturn, resources, out var container, out var node) && pipeline != ResourcePipeline.GetRelationship)
121+
if (GetHook(ResourceHook.OnReturn, resources, out var container, out var node))
122122
{
123123
IEnumerable<TResource> updated = container.OnReturn((HashSet<TResource>)node.UniqueResources, pipeline);
124124
ValidateHookResponse(updated);

src/JsonApiDotNetCore/Hooks/Internal/ResourceHookExecutorFacade.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,9 +119,9 @@ public IReadOnlyCollection<TResource> OnReturnMany<TResource>(IReadOnlyCollectio
119119

120120
public object OnReturnRelationship(object resourceOrResources)
121121
{
122-
if (resourceOrResources is IEnumerable enumerable)
122+
if (resourceOrResources is IEnumerable)
123123
{
124-
var resources = enumerable.Cast<IIdentifiable>();
124+
dynamic resources = resourceOrResources;
125125
return _resourceHookExecutor.OnReturn(resources, ResourcePipeline.GetRelationship).ToArray();
126126
}
127127

test/JsonApiDotNetCoreExampleTests/Acceptance/ResourceDefinitions/ResourceDefinitionTests.cs

Lines changed: 24 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -217,6 +217,30 @@ public async Task Article_Is_Hidden()
217217
Assert.DoesNotContain(toBeExcluded, body);
218218
}
219219

220+
[Fact]
221+
public async Task Article_Through_Secondary_Endpoint_Is_Hidden()
222+
{
223+
// Arrange
224+
var articles = _articleFaker.Generate(3);
225+
string toBeExcluded = "This should not be included";
226+
articles[0].Caption = toBeExcluded;
227+
var author = _authorFaker.Generate();
228+
author.Articles = articles;
229+
230+
_dbContext.AuthorDifferentDbContextName.Add(author);
231+
await _dbContext.SaveChangesAsync();
232+
233+
var route = $"/api/v1/authors/{author.Id}/articles";
234+
235+
// Act
236+
var response = await _client.GetAsync(route);
237+
238+
// Assert
239+
var body = await response.Content.ReadAsStringAsync();
240+
Assert.True(HttpStatusCode.OK == response.StatusCode, $"{route} returned {response.StatusCode} status code with body: {body}");
241+
Assert.DoesNotContain(toBeExcluded, body);
242+
}
243+
220244
[Fact]
221245
public async Task Tag_Is_Hidden()
222246
{

test/UnitTests/ResourceHooks/ResourceHookExecutor/IdentifiableManyToMany_OnReturnTests.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ public void OnReturn_GetRelationship()
4545
hookExecutor.OnReturn(articles, ResourcePipeline.GetRelationship);
4646

4747
// Assert
48+
articleResourceMock.Verify(rd => rd.OnReturn(It.Is<HashSet<Article>>((collection) => !collection.Except(articles).Any()), ResourcePipeline.GetRelationship), Times.Once());
4849
joinResourceMock.Verify(rd => rd.OnReturn(It.Is<HashSet<IdentifiableArticleTag>>((collection) => !collection.Except(joins).Any()), ResourcePipeline.GetRelationship), Times.Once());
4950
tagResourceMock.Verify(rd => rd.OnReturn(It.Is<HashSet<Tag>>((collection) => !collection.Except(tags).Any()), ResourcePipeline.GetRelationship), Times.Once());
5051
VerifyNoOtherCalls(articleResourceMock, joinResourceMock, tagResourceMock);

0 commit comments

Comments
 (0)