Skip to content

Commit d3c3493

Browse files
committed
test(OperationsProcessor): performs pointer substitution
1 parent ac57c75 commit d3c3493

File tree

3 files changed

+100
-7
lines changed

3 files changed

+100
-7
lines changed

src/JsonApiDotNetCore/Services/Operations/IOperationsProcessor.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ public OperationsProcessor(IOperationProcessorResolver processorResolver)
1919
{
2020
_processorResolver = processorResolver;
2121
}
22+
2223
public async Task<List<Operation>> ProcessAsync(List<Operation> inputOps)
2324
{
2425
var outputOps = new List<Operation>();
@@ -31,15 +32,14 @@ public async Task<List<Operation>> ProcessAsync(List<Operation> inputOps)
3132
var replacer = new DocumentDataPointerReplacement<OperationsPointer, Operation>(op.DataObject);
3233
replacer.ReplacePointers(outputOps);
3334

34-
///
3535
var processor = _processorResolver.LocateCreateService(op);
3636
var resultOp = await processor.ProcessAsync(op);
37-
outputOps.Add(resultOp);
38-
}
39-
for(var i=0; i < inputOps.Count; i++)
40-
{
4137

38+
if(resultOp != null)
39+
outputOps.Add(resultOp);
4240
}
41+
42+
return outputOps;
4343
}
4444
}
4545
}

src/JsonApiDotNetCore/Services/Operations/OperationProcessorResolver.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
using System.Collections.Concurrent;
2-
using JsonApiDotNetCore.Internal;
32
using JsonApiDotNetCore.Internal.Generics;
43
using JsonApiDotNetCore.Models.Operations;
54

@@ -33,7 +32,7 @@ public IOpProcessor LocateCreateService(Operation operation)
3332
if (_cachedProcessors.TryGetValue(resource, out IOpProcessor cachedProcessor))
3433
return cachedProcessor;
3534

36-
var contextEntity = _context.ContextGraph.GetContextEntity();
35+
var contextEntity = _context.ContextGraph.GetContextEntity(resource);
3736
var processor = _processorFactory.GetProcessor<IOpProcessor>(contextEntity.EntityType, contextEntity.IdentityType);
3837

3938
_cachedProcessors[resource] = processor;
Lines changed: 94 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,94 @@
1+
using System.Collections.Generic;
2+
using System.Threading.Tasks;
3+
using JsonApiDotNetCore.Models.Operations;
4+
using JsonApiDotNetCore.Services.Operations;
5+
using Moq;
6+
using Newtonsoft.Json;
7+
using Xunit;
8+
9+
namespace UnitTests.Services
10+
{
11+
public class OperationsProcessorTests
12+
{
13+
private readonly Mock<IOperationProcessorResolver> _resolverMock;
14+
15+
public OperationsProcessorTests()
16+
{
17+
_resolverMock = new Mock<IOperationProcessorResolver>();
18+
}
19+
20+
[Fact]
21+
public async Task ProcessAsync_Performs_Pointer_ReplacementAsync()
22+
{
23+
// arrange
24+
var request = @"[
25+
{
26+
""op"": ""add"",
27+
""data"": {
28+
""type"": ""authors"",
29+
""attributes"": {
30+
""name"": ""dgeb""
31+
}
32+
}
33+
}, {
34+
""op"": ""add"",
35+
""data"": {
36+
""type"": ""articles"",
37+
""attributes"": {
38+
""title"": ""JSON API paints my bikeshed!""
39+
},
40+
""relationships"": {
41+
""author"": {
42+
""data"": {
43+
""type"": ""authors"",
44+
""id"": { ""pointer"": ""/operations/0/data/id"" }
45+
}
46+
}
47+
}
48+
}
49+
}
50+
]";
51+
52+
var op1Result = @"{
53+
""links"": {
54+
""self"": ""http://example.com/authors/9""
55+
},
56+
""data"": {
57+
""type"": ""authors"",
58+
""id"": ""9"",
59+
""attributes"": {
60+
""name"": ""dgeb""
61+
}
62+
}
63+
}";
64+
65+
var operations = JsonConvert.DeserializeObject<List<Operation>>(request);
66+
var addOperationResult = JsonConvert.DeserializeObject<Operation>(op1Result);
67+
68+
var opProcessorMock = new Mock<IOpProcessor>();
69+
opProcessorMock.Setup(m => m.ProcessAsync(It.Is<Operation>(op => op.DataObject.Type.ToString() == "authors")))
70+
.ReturnsAsync(addOperationResult);
71+
72+
_resolverMock.Setup(m => m.LocateCreateService(It.IsAny<Operation>()))
73+
.Returns(opProcessorMock.Object);
74+
75+
_resolverMock.Setup(m => m.LocateCreateService((It.IsAny<Operation>())))
76+
.Returns(opProcessorMock.Object);
77+
78+
var operationsProcessor = new OperationsProcessor(_resolverMock.Object);
79+
80+
// act
81+
var results = await operationsProcessor.ProcessAsync(operations);
82+
83+
// assert
84+
opProcessorMock.Verify(
85+
m => m.ProcessAsync(
86+
It.Is<Operation>(o =>
87+
o.DataObject.Type.ToString() == "articles"
88+
&& o.DataObject.Relationships["author"].SingleData["id"].ToString() == "9"
89+
)
90+
)
91+
);
92+
}
93+
}
94+
}

0 commit comments

Comments
 (0)