Skip to content

Commit a34ef20

Browse files
committed
test(CreateOpProcessor): test and implement the create op processor
1 parent c997fac commit a34ef20

File tree

7 files changed

+113
-11
lines changed

7 files changed

+113
-11
lines changed

src/JsonApiDotNetCore/Builders/ContextGraphBuilder.cs

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ public IContextGraph Build()
2828
return graph;
2929
}
3030

31-
public void AddResource<TResource>(string pluralizedTypeName) where TResource : class, IIdentifiable<int>
31+
public IContextGraphBuilder AddResource<TResource>(string pluralizedTypeName) where TResource : class, IIdentifiable<int>
3232
=> AddResource<TResource, int>(pluralizedTypeName);
3333

34-
public void AddResource<TResource, TId>(string pluralizedTypeName) where TResource : class, IIdentifiable<TId>
34+
public IContextGraphBuilder AddResource<TResource, TId>(string pluralizedTypeName) where TResource : class, IIdentifiable<TId>
3535
{
3636
var entityType = typeof(TResource);
3737

@@ -45,6 +45,8 @@ public void AddResource<TResource, TId>(string pluralizedTypeName) where TResour
4545
Attributes = GetAttributes(entityType),
4646
Relationships = GetRelationships(entityType)
4747
});
48+
49+
return this;
4850
}
4951

5052
private Link GetLinkFlags(Type entityType)
@@ -97,7 +99,7 @@ protected virtual Type GetRelationshipType(RelationshipAttribute relation, Prope
9799
return prop.PropertyType;
98100
}
99101

100-
public void AddDbContext<T>() where T : DbContext
102+
public IContextGraphBuilder AddDbContext<T>() where T : DbContext
101103
{
102104
_usesDbContext = true;
103105

@@ -125,6 +127,8 @@ public void AddDbContext<T>() where T : DbContext
125127
});
126128
}
127129
}
130+
131+
return this;
128132
}
129133

130134
private string GetResourceName(PropertyInfo property)

src/JsonApiDotNetCore/Builders/DocumentBuilder.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,7 @@ private List<DocumentData> AppendIncludedObject(List<DocumentData> includedObjec
104104
return includedObject;
105105
}
106106

107-
private DocumentData GetData(ContextEntity contextEntity, IIdentifiable entity)
107+
public DocumentData GetData(ContextEntity contextEntity, IIdentifiable entity)
108108
{
109109
var data = new DocumentData
110110
{

src/JsonApiDotNetCore/Builders/IContextGraphBuilder.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,8 +8,8 @@ public interface IContextGraphBuilder
88
{
99
Link DocumentLinks { get; set; }
1010
IContextGraph Build();
11-
void AddResource<TResource>(string pluralizedTypeName) where TResource : class, IIdentifiable<int>;
12-
void AddResource<TResource, TId>(string pluralizedTypeName) where TResource : class, IIdentifiable<TId>;
13-
void AddDbContext<T>() where T : DbContext;
11+
IContextGraphBuilder AddResource<TResource>(string pluralizedTypeName) where TResource : class, IIdentifiable<int>;
12+
IContextGraphBuilder AddResource<TResource, TId>(string pluralizedTypeName) where TResource : class, IIdentifiable<TId>;
13+
IContextGraphBuilder AddDbContext<T>() where T : DbContext;
1414
}
1515
}

src/JsonApiDotNetCore/Builders/IDocumentBuilder.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using System.Collections.Generic;
2+
using JsonApiDotNetCore.Internal;
23
using JsonApiDotNetCore.Models;
34

45
namespace JsonApiDotNetCore.Builders
@@ -7,5 +8,6 @@ public interface IDocumentBuilder
78
{
89
Document Build(IIdentifiable entity);
910
Documents Build(IEnumerable<IIdentifiable> entities);
11+
DocumentData GetData(ContextEntity contextEntity, IIdentifiable entity);
1012
}
1113
}

src/JsonApiDotNetCore/Models/DocumentData.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,4 @@
1-
using System;
21
using System.Collections.Generic;
3-
using JsonApiDotNetCore.Models.Pointers;
42
using Newtonsoft.Json;
53

64
namespace JsonApiDotNetCore.Models

src/JsonApiDotNetCore/Services/Operations/Processors/CreateOpProcessor.cs

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,42 @@
11
using System.Threading.Tasks;
22
using JsonApiDotNetCore.Builders;
3+
using JsonApiDotNetCore.Internal;
34
using JsonApiDotNetCore.Models;
45
using JsonApiDotNetCore.Models.Operations;
56
using JsonApiDotNetCore.Serialization;
67

78
namespace JsonApiDotNetCore.Services.Operations.Processors
89
{
10+
public class CreateOpProcessor<T> : CreateOpProcessor<T, int>
11+
where T : class, IIdentifiable<int>
12+
{
13+
public CreateOpProcessor(
14+
ICreateService<T, int> service,
15+
IJsonApiDeSerializer deSerializer,
16+
IDocumentBuilder documentBuilder,
17+
IContextGraph contextGraph
18+
) : base(service, deSerializer, documentBuilder, contextGraph)
19+
{ }
20+
}
21+
922
public class CreateOpProcessor<T, TId> : IOpProcessor<T, TId>
1023
where T : class, IIdentifiable<TId>
1124
{
1225
private readonly ICreateService<T, TId> _service;
1326
private readonly IJsonApiDeSerializer _deSerializer;
1427
private readonly IDocumentBuilder _documentBuilder;
28+
private readonly IContextGraph _contextGraph;
1529

1630
public CreateOpProcessor(
1731
ICreateService<T, TId> service,
1832
IJsonApiDeSerializer deSerializer,
19-
IDocumentBuilder documentBuilder)
33+
IDocumentBuilder documentBuilder,
34+
IContextGraph contextGraph)
2035
{
2136
_service = service;
2237
_deSerializer = deSerializer;
2338
_documentBuilder = documentBuilder;
39+
_contextGraph = contextGraph;
2440
}
2541

2642
public async Task<Operation> ProcessAsync(Operation operation)
@@ -32,7 +48,9 @@ public async Task<Operation> ProcessAsync(Operation operation)
3248
Op = OperationCode.add
3349
};
3450

35-
operationResult.Data = _documentBuilder.Build(result);
51+
operationResult.Data = _documentBuilder.GetData(
52+
_contextGraph.GetContextEntity(operation.GetResourceTypeName()),
53+
result);
3654

3755
return operationResult;
3856
}
Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
using System.Collections.Generic;
2+
using System.Threading.Tasks;
3+
using JsonApiDotNetCore.Builders;
4+
using JsonApiDotNetCore.Internal;
5+
using JsonApiDotNetCore.Models;
6+
using JsonApiDotNetCore.Models.Operations;
7+
using JsonApiDotNetCore.Serialization;
8+
using JsonApiDotNetCore.Services;
9+
using JsonApiDotNetCore.Services.Operations.Processors;
10+
using Moq;
11+
using Xunit;
12+
13+
namespace UnitTests.Services
14+
{
15+
public class CreateOpProcessorTests
16+
{
17+
private readonly Mock<ICreateService<TestResource>> _createServiceMock;
18+
private readonly Mock<IJsonApiDeSerializer> _deserializerMock;
19+
private readonly Mock<IDocumentBuilder> _documentBuilderMock;
20+
21+
public CreateOpProcessorTests()
22+
{
23+
_createServiceMock = new Mock<ICreateService<TestResource>>();
24+
_deserializerMock = new Mock<IJsonApiDeSerializer>();
25+
_documentBuilderMock = new Mock<IDocumentBuilder>();
26+
}
27+
28+
[Fact]
29+
public async Task ProcessAsync_Deserializes_And_Creates()
30+
{
31+
// arrange
32+
var testResource = new TestResource {
33+
Name = "some-name"
34+
};
35+
36+
var data = new DocumentData {
37+
Type = "test-resources",
38+
Attributes = new Dictionary<string, object> {
39+
{ "name", testResource.Name }
40+
}
41+
};
42+
43+
var operation = new Operation {
44+
Data = data,
45+
};
46+
47+
var contextGraph = new ContextGraphBuilder()
48+
.AddResource<TestResource>("test-resources")
49+
.Build();
50+
51+
_deserializerMock.Setup(m => m.DocumentToObject(It.IsAny<DocumentData>()))
52+
.Returns(testResource);
53+
54+
var opProcessor = new CreateOpProcessor<TestResource>(
55+
_createServiceMock.Object,
56+
_deserializerMock.Object,
57+
_documentBuilderMock.Object,
58+
contextGraph
59+
);
60+
61+
_documentBuilderMock.Setup(m => m.GetData(It.IsAny<ContextEntity>(), It.IsAny<TestResource>()))
62+
.Returns(data);
63+
64+
// act
65+
var result = await opProcessor.ProcessAsync(operation);
66+
67+
// assert
68+
Assert.Equal(OperationCode.add, result.Op);
69+
Assert.NotNull(result.Data);
70+
Assert.Equal(testResource.Name, result.DataObject.Attributes["name"]);
71+
_createServiceMock.Verify(m => m.CreateAsync(It.IsAny<TestResource>()));
72+
}
73+
74+
public class TestResource : Identifiable
75+
{
76+
[Attr("name")]
77+
public string Name { get; set; }
78+
}
79+
}
80+
}

0 commit comments

Comments
 (0)