Skip to content

Commit 1439d4f

Browse files
author
Bart Koelman
committed
Added tests for using ActionResult without [ApiController]
1 parent 2b65e32 commit 1439d4f

File tree

2 files changed

+129
-1
lines changed

2 files changed

+129
-1
lines changed

src/Examples/JsonApiDotNetCoreExample/Controllers/TodoItemsTestController.cs

Lines changed: 49 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,9 @@
1+
using System.Net;
2+
using System.Threading.Tasks;
13
using JsonApiDotNetCore.Configuration;
24
using JsonApiDotNetCore.Controllers;
35
using JsonApiDotNetCore.Models;
6+
using JsonApiDotNetCore.Models.JsonApiDocuments;
47
using JsonApiDotNetCore.Services;
58
using JsonApiDotNetCoreExample.Models;
69
using Microsoft.AspNetCore.Mvc;
@@ -9,7 +12,7 @@
912
namespace JsonApiDotNetCoreExample.Controllers
1013
{
1114
public abstract class AbstractTodoItemsController<T>
12-
: JsonApiController<T> where T : class, IIdentifiable<int>
15+
: BaseJsonApiController<T> where T : class, IIdentifiable<int>
1316
{
1417
protected AbstractTodoItemsController(
1518
IJsonApiOptions jsonApiOptions,
@@ -19,6 +22,7 @@ protected AbstractTodoItemsController(
1922
{ }
2023
}
2124

25+
[DisableRoutingConvention]
2226
[Route("/abstract")]
2327
public class TodoItemsTestController : AbstractTodoItemsController<TodoItem>
2428
{
@@ -28,5 +32,49 @@ public TodoItemsTestController(
2832
IResourceService<TodoItem> service)
2933
: base(jsonApiOptions, loggerFactory, service)
3034
{ }
35+
36+
[HttpGet]
37+
public override async Task<IActionResult> GetAsync() => await base.GetAsync();
38+
39+
[HttpGet("{id}")]
40+
public override async Task<IActionResult> GetAsync(int id) => await base.GetAsync(id);
41+
42+
[HttpGet("{id}/relationships/{relationshipName}")]
43+
public override async Task<IActionResult> GetRelationshipsAsync(int id, string relationshipName)
44+
=> await base.GetRelationshipsAsync(id, relationshipName);
45+
46+
[HttpGet("{id}/{relationshipName}")]
47+
public override async Task<IActionResult> GetRelationshipAsync(int id, string relationshipName)
48+
=> await base.GetRelationshipAsync(id, relationshipName);
49+
50+
[HttpPost]
51+
public override async Task<IActionResult> PostAsync(TodoItem entity)
52+
{
53+
await Task.Yield();
54+
55+
return NotFound(new Error(HttpStatusCode.NotFound)
56+
{
57+
Title = "NotFound ActionResult with explicit error object."
58+
});
59+
}
60+
61+
[HttpPatch("{id}")]
62+
public override async Task<IActionResult> PatchAsync(int id, [FromBody] TodoItem entity)
63+
{
64+
return await base.PatchAsync(id, entity);
65+
}
66+
67+
[HttpPatch("{id}/relationships/{relationshipName}")]
68+
public override async Task<IActionResult> PatchRelationshipsAsync(
69+
int id, string relationshipName, [FromBody] object relationships)
70+
=> await base.PatchRelationshipsAsync(id, relationshipName, relationships);
71+
72+
[HttpDelete("{id}")]
73+
public override async Task<IActionResult> DeleteAsync(int id)
74+
{
75+
await Task.Yield();
76+
77+
return NotFound();
78+
}
3179
}
3280
}
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.Net;
3+
using System.Net.Http;
4+
using System.Net.Http.Headers;
5+
using System.Threading.Tasks;
6+
using JsonApiDotNetCore.Models.JsonApiDocuments;
7+
using JsonApiDotNetCoreExample;
8+
using Newtonsoft.Json;
9+
using Xunit;
10+
11+
namespace JsonApiDotNetCoreExampleTests.Acceptance
12+
{
13+
[Collection("WebHostCollection")]
14+
public sealed class ActionResultTests
15+
{
16+
private readonly TestFixture<Startup> _fixture;
17+
18+
public ActionResultTests(TestFixture<Startup> fixture)
19+
{
20+
_fixture = fixture;
21+
}
22+
23+
[Fact]
24+
public async Task ActionResult_With_Error_Object_Is_Converted_To_Error_Collection()
25+
{
26+
// Arrange
27+
var route = "/abstract";
28+
var request = new HttpRequestMessage(HttpMethod.Post, route);
29+
var content = new
30+
{
31+
data = new
32+
{
33+
type = "todoItems",
34+
id = 1,
35+
attributes = new Dictionary<string, object>
36+
{
37+
{"ordinal", 1}
38+
}
39+
}
40+
};
41+
42+
request.Content = new StringContent(JsonConvert.SerializeObject(content));
43+
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.api+json");
44+
45+
// Act
46+
var response = await _fixture.Client.SendAsync(request);
47+
48+
// Assert
49+
var body = await response.Content.ReadAsStringAsync();
50+
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
51+
52+
var errorDocument = JsonConvert.DeserializeObject<ErrorDocument>(body);
53+
Assert.Single(errorDocument.Errors);
54+
Assert.Equal(HttpStatusCode.NotFound, errorDocument.Errors[0].StatusCode);
55+
Assert.Equal("NotFound ActionResult with explicit error object.", errorDocument.Errors[0].Title);
56+
Assert.Null(errorDocument.Errors[0].Detail);
57+
}
58+
59+
[Fact]
60+
public async Task Empty_ActionResult_Is_Converted_To_Error_Collection()
61+
{
62+
// Arrange
63+
var route = "/abstract/123";
64+
var request = new HttpRequestMessage(HttpMethod.Delete, route);
65+
66+
// Act
67+
var response = await _fixture.Client.SendAsync(request);
68+
69+
// Assert
70+
var body = await response.Content.ReadAsStringAsync();
71+
Assert.Equal(HttpStatusCode.NotFound, response.StatusCode);
72+
73+
var errorDocument = JsonConvert.DeserializeObject<ErrorDocument>(body);
74+
Assert.Single(errorDocument.Errors);
75+
Assert.Equal(HttpStatusCode.NotFound, errorDocument.Errors[0].StatusCode);
76+
Assert.Equal("NotFound", errorDocument.Errors[0].Title);
77+
Assert.Null(errorDocument.Errors[0].Detail);
78+
}
79+
}
80+
}

0 commit comments

Comments
 (0)