Skip to content

Commit 1c5517b

Browse files
committed
fix: e2e remaining CreatingDataTests
1 parent 6427504 commit 1c5517b

File tree

2 files changed

+67
-118
lines changed

2 files changed

+67
-118
lines changed

test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/CreatingDataTests.cs

Lines changed: 49 additions & 118 deletions
Original file line numberDiff line numberDiff line change
@@ -54,7 +54,7 @@ public async Task Can_Create_Guid_Identifiable_Entity()
5454

5555
var context = _fixture.GetService<AppDbContext>();
5656

57-
var owner = new JsonApiDotNetCoreExample.Models.Person();
57+
var owner = new Person();
5858
context.People.Add(owner);
5959
await context.SaveChangesAsync();
6060

@@ -212,7 +212,6 @@ public async Task Can_Create_And_Set_HasMany_Relationships()
212212
var httpMethod = new HttpMethod("POST");
213213
var server = new TestServer(builder);
214214
var client = server.CreateClient();
215-
216215
var context = _fixture.GetService<AppDbContext>();
217216

218217
var owner = new Person();
@@ -286,7 +285,7 @@ public async Task Can_Create_With_HasMany_Relationship_And_Include_Result()
286285

287286
var context = _fixture.GetService<AppDbContext>();
288287

289-
var owner = new JsonApiDotNetCoreExample.Models.Person();
288+
var owner = new Person();
290289
var todoItem = new TodoItem();
291290
todoItem.Owner = owner;
292291
todoItem.Description = "Description";
@@ -296,43 +295,21 @@ public async Task Can_Create_With_HasMany_Relationship_And_Include_Result()
296295

297296
var route = "/api/v1/todo-collections?include=todo-items";
298297
var request = new HttpRequestMessage(httpMethod, route);
299-
var content = new
300-
{
301-
data = new
302-
{
303-
type = "todo-collections",
304-
relationships = new Dictionary<string, dynamic>
305-
{
306-
{ "owner", new {
307-
data = new
308-
{
309-
type = "people",
310-
id = owner.Id.ToString()
311-
}
312-
} },
313-
{ "todo-items", new {
314-
data = new dynamic[]
315-
{
316-
new {
317-
type = "todo-items",
318-
id = todoItem.Id.ToString()
319-
}
320-
}
321-
} }
322-
}
323-
}
324-
};
325-
326-
request.Content = new StringContent(JsonConvert.SerializeObject(content));
298+
var todoItemCollection = new TodoItemCollection { Owner = owner, TodoItems = new List<TodoItem> { todoItem } };
299+
var serializer = _fixture.GetSerializer<TodoItemCollection>(tic => new { }, tic => new { tic.TodoItems, tic.Owner });
300+
request.Content = new StringContent(serializer.Serialize(todoItemCollection));
327301
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.api+json");
328302

303+
var graph = new ResourceGraphBuilder().AddResource<TodoItemClient>("todo-items").AddResource<Person>().AddResource<TodoItemCollectionClient, Guid>().Build();
304+
var deserializer = new ResponseDeserializer(graph);
305+
329306
// act
330307
var response = await client.SendAsync(request);
331308

332309
// assert
333310
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
334311
var body = await response.Content.ReadAsStringAsync();
335-
var collectionResult = _fixture.GetDeserializer().DeserializeSingle<TodoItemCollection>(body).Data;
312+
var collectionResult = deserializer.DeserializeSingle<TodoItemCollectionClient>(body).Data;
336313

337314
Assert.NotNull(collectionResult);
338315
Assert.NotEmpty(collectionResult.TodoItems);
@@ -352,40 +329,28 @@ public async Task Can_Create_And_Set_HasOne_Relationships()
352329
var context = _fixture.GetService<AppDbContext>();
353330

354331
var todoItem = new TodoItem();
355-
var owner = new JsonApiDotNetCoreExample.Models.Person();
332+
var owner = new Person();
356333
context.People.Add(owner);
357334
await context.SaveChangesAsync();
335+
todoItem.Owner = owner;
358336

359337
var route = "/api/v1/todo-items";
360338
var request = new HttpRequestMessage(httpMethod, route);
361-
var content = new
362-
{
363-
data = new
364-
{
365-
type = "todo-items",
366-
relationships = new Dictionary<string, dynamic>
367-
{
368-
{ "owner", new {
369-
data = new
370-
{
371-
type = "people",
372-
id = owner.Id.ToString()
373-
}
374-
} }
375-
}
376-
}
377-
};
378-
379-
request.Content = new StringContent(JsonConvert.SerializeObject(content));
339+
var serializer = _fixture.GetSerializer<TodoItem>(attributes: ti => new { }, relationships: ti => new { ti.Owner });
340+
var content = serializer.Serialize(todoItem);
341+
request.Content = new StringContent(content);
380342
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.api+json");
381343

344+
var graph = new ResourceGraphBuilder().AddResource<Person>().AddResource<TodoItemClient>("todo-items").Build();
345+
var deserializer = new ResponseDeserializer(graph);
346+
382347
// act
383348
var response = await client.SendAsync(request);
384349
var body = await response.Content.ReadAsStringAsync();
385350

386351
// assert
387352
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
388-
var deserializedBody = _fixture.GetDeserializer().DeserializeSingle<TodoItem>(body).Data;
353+
var deserializedBody = deserializer.DeserializeSingle<TodoItem>(body).Data;
389354
var newId = deserializedBody.Id;
390355

391356
context = _fixture.GetService<AppDbContext>();
@@ -400,53 +365,38 @@ public async Task Can_Create_And_Set_HasOne_Relationships()
400365
public async Task Can_Create_With_HasOne_Relationship_And_Include_Result()
401366
{
402367
// arrange
403-
var builder = new WebHostBuilder().UseStartup<Startup>();
404-
368+
// arrange
369+
var builder = new WebHostBuilder()
370+
.UseStartup<Startup>();
405371
var httpMethod = new HttpMethod("POST");
406372
var server = new TestServer(builder);
407373
var client = server.CreateClient();
408374

409375
var context = _fixture.GetService<AppDbContext>();
410376

411377
var todoItem = new TodoItem();
412-
var owner = new JsonApiDotNetCoreExample.Models.Person
413-
{
414-
FirstName = "Alice"
415-
};
378+
var owner = new Person { FirstName = "Alice" };
416379
context.People.Add(owner);
417-
418380
await context.SaveChangesAsync();
381+
todoItem.Owner = owner;
419382

420383
var route = "/api/v1/todo-items?include=owner";
421384
var request = new HttpRequestMessage(httpMethod, route);
422-
var content = new
423-
{
424-
data = new
425-
{
426-
type = "todo-items",
427-
relationships = new Dictionary<string, dynamic>
428-
{
429-
{ "owner", new {
430-
data = new
431-
{
432-
type = "people",
433-
id = owner.Id.ToString()
434-
}
435-
} }
436-
}
437-
}
438-
};
439-
440-
request.Content = new StringContent(JsonConvert.SerializeObject(content));
385+
var serializer = _fixture.GetSerializer<TodoItem>(attributes: ti => new { }, relationships: ti => new { ti.Owner });
386+
var content = serializer.Serialize(todoItem);
387+
request.Content = new StringContent(content);
441388
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.api+json");
442389

390+
var graph = new ResourceGraphBuilder().AddResource<Person>().AddResource<TodoItemClient>("todo-items").Build();
391+
var deserializer = new ResponseDeserializer(graph);
392+
443393
// act
444394
var response = await client.SendAsync(request);
445395
var body = await response.Content.ReadAsStringAsync();
446396

447397
// assert
448398
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
449-
var todoItemResult = _fixture.GetDeserializer().DeserializeSingle<TodoItem>(body).Data;
399+
var todoItemResult = deserializer.DeserializeSingle<TodoItem>(body).Data;
450400
Assert.NotNull(todoItemResult);
451401
Assert.NotNull(todoItemResult.Owner);
452402
Assert.Equal(owner.FirstName, todoItemResult.Owner.FirstName);
@@ -464,33 +414,16 @@ public async Task Can_Create_And_Set_HasOne_Relationships_From_Independent_Side(
464414

465415
var context = _fixture.GetService<AppDbContext>();
466416

467-
var person = new JsonApiDotNetCoreExample.Models.Person();
417+
var person = new Person();
468418
context.People.Add(person);
469419
await context.SaveChangesAsync();
470-
420+
var personRole = new PersonRole { Person = person };
471421
var route = "/api/v1/person-roles";
472422
var request = new HttpRequestMessage(httpMethod, route);
473423
var clientDefinedId = Guid.NewGuid();
474-
var content = new
475-
{
476-
data = new
477-
{
478-
type = "person-roles",
479-
relationships = new
480-
{
481-
person = new
482-
{
483-
data = new
484-
{
485-
type = "people",
486-
id = person.Id.ToString()
487-
}
488-
}
489-
}
490-
}
491-
};
424+
var content = _fixture.GetSerializer<PersonRole>(pr => new { }, pr => new { pr.Person }).Serialize(personRole);
492425

493-
request.Content = new StringContent(JsonConvert.SerializeObject(content));
426+
request.Content = new StringContent(content);
494427
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.api+json");
495428

496429
// act
@@ -499,8 +432,13 @@ public async Task Can_Create_And_Set_HasOne_Relationships_From_Independent_Side(
499432

500433
// assert
501434
Assert.Equal(HttpStatusCode.Created, response.StatusCode);
502-
var deserializedBody = _fixture.GetDeserializer().DeserializeSingle<PersonRole>(body).Data;
503-
Assert.Equal(person.Id, deserializedBody.Person.Id);
435+
context = _fixture.GetService<AppDbContext>();
436+
var newId = _fixture.GetDeserializer().DeserializeSingle<PersonRole>(body).Data.Id;
437+
Assert.NotEqual(0, newId);
438+
var personRoleResult = context.PersonRoles
439+
.Include(c => c.Person)
440+
.SingleOrDefault(c => c.Id == newId);
441+
Assert.Equal(person.Id, personRoleResult.Person.Id);
504442
}
505443

506444
[Fact]
@@ -515,26 +453,19 @@ public async Task ShouldReceiveLocationHeader_InResponse()
515453
var client = server.CreateClient();
516454
var request = new HttpRequestMessage(httpMethod, route);
517455
var todoItem = _todoItemFaker.Generate();
518-
var content = new
519-
{
520-
data = new
521-
{
522-
type = "todo-items",
523-
attributes = new
524-
{
525-
description = todoItem.Description,
526-
ordinal = todoItem.Ordinal,
527-
createdDate = DateTime.Now
528-
}
529-
}
530-
};
531-
request.Content = new StringContent(JsonConvert.SerializeObject(content));
456+
todoItem.CreatedDate = DateTime.Now;
457+
458+
var serializer = _fixture.GetSerializer<TodoItem>(ti => new { ti.CreatedDate, ti.Description, ti.Ordinal });
459+
460+
request.Content = new StringContent(serializer.Serialize(todoItem));
532461
request.Content.Headers.ContentType = new MediaTypeHeaderValue("application/vnd.api+json");
533462

534463
// act
464+
var graph = new ResourceGraphBuilder().AddResource<Person>().AddResource<TodoItemClient>("todo-items").Build();
465+
var deserializer = new ResponseDeserializer(graph);
535466
var response = await client.SendAsync(request);
536467
var body = await response.Content.ReadAsStringAsync();
537-
var deserializedBody = _fixture.GetDeserializer().DeserializeSingle<TodoItem>(body).Data;
468+
var deserializedBody = deserializer.DeserializeSingle<TodoItemClient>(body).Data;
538469

539470
// assert
540471
Assert.Equal(HttpStatusCode.Created, response.StatusCode);

test/JsonApiDotNetCoreExampleTests/Helpers/Models/TodoItemClient.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,5 @@
1+
using System;
2+
using System.Collections.Generic;
13
using JsonApiDotNetCore.Models;
24
using JsonApiDotNetCoreExample.Models;
35

@@ -14,4 +16,20 @@ public class TodoItemClient : TodoItem
1416
[Attr("calculated-value")]
1517
public new string CalculatedValue { get; set; }
1618
}
19+
20+
21+
22+
[Resource("todo-collections")]
23+
public class TodoItemCollectionClient : Identifiable<Guid>
24+
{
25+
[Attr("name")]
26+
public string Name { get; set; }
27+
public int OwnerId { get; set; }
28+
29+
[HasMany("todo-items")]
30+
public virtual List<TodoItemClient> TodoItems { get; set; }
31+
32+
[HasOne("owner")]
33+
public virtual Person Owner { get; set; }
34+
}
1735
}

0 commit comments

Comments
 (0)