Skip to content

Commit 4190368

Browse files
committed
feat: after update, after create
1 parent 9379d2f commit 4190368

16 files changed

+387
-207
lines changed

src/JsonApiDotNetCore/Hooks/ResourceHookExecutor.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -295,7 +295,7 @@ public virtual void AfterCreate<TEntity>(IEnumerable<TEntity> entities, Resource
295295
hookContainer.AfterCreate(uniqueEntities, pipeline);
296296
}
297297
EntityTreeLayer nextLayer = _layerFactory.CreateLayer(layer);
298-
298+
AfterUpdateRelationship(nextLayer, pipeline);
299299
}
300300

301301
public virtual void AfterUpdate<TEntity>(IEnumerable<TEntity> entities, ResourceAction pipeline) where TEntity : class, IIdentifiable
@@ -307,6 +307,8 @@ public virtual void AfterUpdate<TEntity>(IEnumerable<TEntity> entities, Resource
307307
var uniqueEntities = layer.GetAllUniqueEntities().Cast<TEntity>();
308308
hookContainer.AfterUpdate(uniqueEntities, pipeline);
309309
}
310+
EntityTreeLayer nextLayer = _layerFactory.CreateLayer(layer);
311+
AfterUpdateRelationship(nextLayer, pipeline);
310312
}
311313

312314
void AfterUpdateRelationship(EntityTreeLayer currentLayer, ResourceAction pipeline)
@@ -316,7 +318,8 @@ void AfterUpdateRelationship(EntityTreeLayer currentLayer, ResourceAction pipeli
316318
var entityType = node.EntityType;
317319
var hookContainer = _meta.GetResourceHookContainer(entityType, ResourceHook.AfterUpdateRelationship);
318320
if (hookContainer == null) continue;
319-
CallHook(hookContainer, ResourceHook.AfterUpdateRelationship, new object[] { node.UniqueSet, pipeline });
321+
var relationshipHelper = TypeHelper.CreateInstanceOfOpenType(typeof(UpdatedRelationshipHelper<>), node.EntityType, node.EntitiesByRelationships);
322+
CallHook(hookContainer, ResourceHook.AfterUpdateRelationship, new object[] { relationshipHelper, pipeline });
320323
}
321324
EntityTreeLayer nextLayer = _layerFactory.CreateLayer(currentLayer);
322325
if (nextLayer.Any()) AfterUpdateRelationship(nextLayer, pipeline);

test/UnitTests/ResourceHooks/ResourceHookExecutor/AfterCreateTests.cs

Lines changed: 0 additions & 93 deletions
This file was deleted.

test/UnitTests/ResourceHooks/ResourceHookExecutor/AfterUpdateTests.cs

Lines changed: 0 additions & 106 deletions
This file was deleted.
Lines changed: 86 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
using JsonApiDotNetCore.Services;
2+
using JsonApiDotNetCoreExample.Models;
3+
using Moq;
4+
using System.Collections.Generic;
5+
using Xunit;
6+
7+
namespace UnitTests.ResourceHooks
8+
{
9+
public class AfterCreateTests : HooksTestsSetup
10+
{
11+
private readonly ResourceHook[] targetHooks = { ResourceHook.AfterCreate, ResourceHook.AfterUpdateRelationship };
12+
13+
[Fact]
14+
public void AfterCreate()
15+
{
16+
// arrange
17+
var todoDiscovery = SetDiscoverableHooks<TodoItem>(targetHooks, DisableDbValues);
18+
var personDiscovery = SetDiscoverableHooks<Person>(targetHooks, DisableDbValues);
19+
(var contextMock, var hookExecutor, var todoResourceMock,
20+
var ownerResourceMock) = CreateTestObjects(todoDiscovery, personDiscovery);
21+
var todoList = CreateTodoWithOwner();
22+
23+
// act
24+
hookExecutor.AfterCreate(todoList, ResourceAction.Create);
25+
26+
// assert
27+
todoResourceMock.Verify(rd => rd.AfterCreate(It.IsAny<IEnumerable<TodoItem>>(), ResourceAction.Create), Times.Once());
28+
ownerResourceMock.Verify(rd => rd.AfterUpdateRelationship(It.IsAny<IUpdatedRelationshipHelper<Person>>(), ResourceAction.Create), Times.Once());
29+
VerifyNoOtherCalls(todoResourceMock, ownerResourceMock);
30+
}
31+
32+
[Fact]
33+
public void AfterCreate_Without_Parent_Hook_Implemented()
34+
{
35+
// arrange
36+
var todoDiscovery = SetDiscoverableHooks<TodoItem>(NoHooks, DisableDbValues);
37+
var personDiscovery = SetDiscoverableHooks<Person>(targetHooks, DisableDbValues);
38+
(var contextMock, var hookExecutor, var todoResourceMock,
39+
var ownerResourceMock) = CreateTestObjects(todoDiscovery, personDiscovery);
40+
var todoList = CreateTodoWithOwner();
41+
42+
// act
43+
hookExecutor.AfterCreate(todoList, ResourceAction.Create);
44+
45+
// assert
46+
ownerResourceMock.Verify(rd => rd.AfterUpdateRelationship(It.IsAny<IUpdatedRelationshipHelper<Person>>(), ResourceAction.Create), Times.Once());
47+
VerifyNoOtherCalls(todoResourceMock, ownerResourceMock);
48+
}
49+
50+
[Fact]
51+
public void AfterCreate_Without_Child_Hook_Implemented()
52+
{
53+
// arrange
54+
var todoDiscovery = SetDiscoverableHooks<TodoItem>(targetHooks, DisableDbValues);
55+
var personDiscovery = SetDiscoverableHooks<Person>(NoHooks, DisableDbValues);
56+
(var contextMock, var hookExecutor, var todoResourceMock,
57+
var ownerResourceMock) = CreateTestObjects(todoDiscovery, personDiscovery);
58+
var todoList = CreateTodoWithOwner();
59+
60+
// act
61+
hookExecutor.AfterCreate(todoList, ResourceAction.Create);
62+
63+
// assert
64+
todoResourceMock.Verify(rd => rd.AfterCreate(It.IsAny<IEnumerable<TodoItem>>(), ResourceAction.Create), Times.Once());
65+
VerifyNoOtherCalls(todoResourceMock, ownerResourceMock);
66+
}
67+
68+
[Fact]
69+
public void AfterCreate_Without_Any_Hook_Implemented()
70+
{
71+
// arrange
72+
var todoDiscovery = SetDiscoverableHooks<TodoItem>(NoHooks, DisableDbValues);
73+
var personDiscovery = SetDiscoverableHooks<Person>(NoHooks, DisableDbValues);
74+
(var contextMock, var hookExecutor, var todoResourceMock,
75+
var ownerResourceMock) = CreateTestObjects(todoDiscovery, personDiscovery);
76+
var todoList = CreateTodoWithOwner();
77+
78+
// act
79+
hookExecutor.AfterCreate(todoList, ResourceAction.Create);
80+
81+
// assert
82+
VerifyNoOtherCalls(todoResourceMock, ownerResourceMock);
83+
}
84+
}
85+
}
86+

0 commit comments

Comments
 (0)