Skip to content

Commit cb90242

Browse files
authored
Merge pull request #351 from json-api-dotnet/test/add-test
test(acceptance): Can_Create_And_Set_HasOne_Relationships_From_Indepe…
2 parents e22e101 + 2be7f61 commit cb90242

File tree

4 files changed

+82
-2
lines changed

4 files changed

+82
-2
lines changed
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
using JsonApiDotNetCore.Controllers;
2+
using JsonApiDotNetCore.Services;
3+
using JsonApiDotNetCoreExample.Models;
4+
using Microsoft.Extensions.Logging;
5+
6+
namespace JsonApiDotNetCoreExample.Controllers
7+
{
8+
public class PersonRolesController : JsonApiController<PersonRole>
9+
{
10+
public PersonRolesController(
11+
IJsonApiContext jsonApiContext,
12+
IResourceService<PersonRole> resourceService,
13+
ILoggerFactory loggerFactory)
14+
: base(jsonApiContext, resourceService, loggerFactory)
15+
{ }
16+
}
17+
}

src/Examples/JsonApiDotNetCoreExample/Data/AppDbContext.cs

+1
Original file line numberDiff line numberDiff line change
@@ -39,5 +39,6 @@ protected override void OnModelCreating(ModelBuilder modelBuilder)
3939
public DbSet<Author> Authors { get; set; }
4040
public DbSet<NonJsonApiResource> NonJsonApiResources { get; set; }
4141
public DbSet<User> Users { get; set; }
42+
public DbSet<PersonRole> PersonRoles { get; set; }
4243
}
4344
}

src/Examples/JsonApiDotNetCoreExample/Models/Person.cs

+13-2
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
using System;
12
using System.Collections.Generic;
23
using JsonApiDotNetCore.Models;
34
using JsonApiDotNetCore.Services;
45

56
namespace JsonApiDotNetCoreExample.Models
67
{
8+
public class PersonRole : Identifiable
9+
{
10+
[HasOne("person")]
11+
public Person Person { get; set; }
12+
}
13+
714
public class Person : Identifiable, IHasMeta
815
{
916
[Attr("first-name")]
@@ -17,10 +24,14 @@ public class Person : Identifiable, IHasMeta
1724

1825
[HasMany("assigned-todo-items")]
1926
public virtual List<TodoItem> AssignedTodoItems { get; set; }
20-
27+
2128
[HasMany("todo-collections")]
2229
public virtual List<TodoItemCollection> TodoItemCollections { get; set; }
23-
30+
31+
[HasOne("role")]
32+
public virtual PersonRole Role { get; set; }
33+
public int? PersonRoleId { get; set; }
34+
2435
[HasOne("unincludeable-item", Link.All, canInclude: false)]
2536
public virtual TodoItem UnIncludeableItem { get; set; }
2637

test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/CreatingDataTests.cs

+51
Original file line numberDiff line numberDiff line change
@@ -342,6 +342,57 @@ public async Task Can_Create_And_Set_HasOne_Relationships()
342342
Assert.Equal(owner.Id, todoItemResult.OwnerId);
343343
}
344344

345+
[Fact]
346+
public async Task Can_Create_And_Set_HasOne_Relationships_From_Independent_Side()
347+
{
348+
// arrange
349+
var builder = new WebHostBuilder()
350+
.UseStartup<ClientGeneratedIdsStartup>();
351+
var httpMethod = new HttpMethod("POST");
352+
var server = new TestServer(builder);
353+
var client = server.CreateClient();
354+
355+
var context = _fixture.GetService<AppDbContext>();
356+
357+
var person = new JsonApiDotNetCoreExample.Models.Person();
358+
context.People.Add(person);
359+
await context.SaveChangesAsync();
360+
361+
var route = "/api/v1/person-roles";
362+
var request = new HttpRequestMessage(httpMethod, route);
363+
var clientDefinedId = Guid.NewGuid();
364+
var content = new
365+
{
366+
data = new
367+
{
368+
type = "person-roles",
369+
relationships = new
370+
{
371+
person = new
372+
{
373+
data = new
374+
{
375+
type = "people",
376+
id = person.Id.ToString()
377+
}
378+
}
379+
}
380+
}
381+
};
382+
383+
request.Content = new StringContent(JsonConvert.SerializeObject(content));
384+
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.api+json");
385+
386+
// act
387+
var response = await client.SendAsync(request);
388+
var body = await response.Content.ReadAsStringAsync();
389+
390+
// assert
391+
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
392+
var deserializedBody = (PersonRole)_fixture.GetService<IJsonApiDeSerializer>().Deserialize(body);
393+
Assert.Equal(person.Id, deserializedBody.Person.Id);
394+
}
395+
345396
[Fact]
346397
public async Task ShouldReceiveLocationHeader_InResponse()
347398
{

0 commit comments

Comments
 (0)