Skip to content

Commit dc7ae14

Browse files
authored
Acceptance tests EF inheritance (#610)
* chore: create inheritance model + controller * test: create and patch acceptance test * chore: close issue
1 parent a4802b2 commit dc7ae14

File tree

8 files changed

+64
-3
lines changed

8 files changed

+64
-3
lines changed

src/Examples/JsonApiDotNetCoreExample/Controllers/UsersController.cs

+10
Original file line numberDiff line numberDiff line change
@@ -15,4 +15,14 @@ public UsersController(
1515
: base(jsonApiOptions, resourceService, loggerFactory)
1616
{ }
1717
}
18+
19+
public class SuperUsersController : JsonApiController<SuperUser>
20+
{
21+
public SuperUsersController(
22+
IJsonApiOptions jsonApiOptions,
23+
IResourceService<SuperUser> resourceService,
24+
ILoggerFactory loggerFactory)
25+
: base(jsonApiOptions, resourceService, loggerFactory)
26+
{ }
27+
}
1828
}

src/Examples/JsonApiDotNetCoreExample/Data/AppDbContext.cs

+3
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ public class AppDbContext : DbContext
1414
public DbSet<Author> AuthorDifferentDbContextName { get; set; }
1515
public DbSet<NonJsonApiResource> NonJsonApiResources { get; set; }
1616
public DbSet<User> Users { get; set; }
17+
public DbSet<SuperUser> SuperUsers { get; set; }
1718
public DbSet<PersonRole> PersonRoles { get; set; }
1819
public DbSet<ArticleTag> ArticleTags { get; set; }
1920
public DbSet<IdentifiableArticleTag> IdentifiableArticleTags { get; set; }
@@ -23,6 +24,8 @@ public AppDbContext(DbContextOptions<AppDbContext> options) : base(options) { }
2324

2425
protected override void OnModelCreating(ModelBuilder modelBuilder)
2526
{
27+
modelBuilder.Entity<SuperUser>().HasBaseType<User>();
28+
2629
modelBuilder.Entity<TodoItem>()
2730
.Property(t => t.CreatedDate).HasDefaultValueSql("CURRENT_TIMESTAMP").IsRequired();
2831

src/Examples/JsonApiDotNetCoreExample/Models/User.cs

+5
Original file line numberDiff line numberDiff line change
@@ -8,4 +8,9 @@ public class User : Identifiable
88
[Attr] public string Username { get; set; }
99
[Attr] public string Password { get; set; }
1010
}
11+
12+
public class SuperUser : User
13+
{
14+
[Attr] public int SecurityLevel { get; set; }
15+
}
1116
}

src/JsonApiDotNetCore/Internal/DefaultRoutingConvention.cs

+1
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,7 @@ public void Apply(ApplicationModel application)
5858
foreach (var controller in application.Controllers)
5959
{
6060
var resourceType = GetResourceTypeFromController(controller.ControllerType);
61+
6162
if (resourceType != null)
6263
_registeredResources.Add(controller.ControllerName, resourceType);
6364

test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/CreatingDataTests.cs

+17
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,23 @@ public CreatingDataTests(TestFixture<Startup> fixture) : base(fixture)
3636

3737
}
3838

39+
[Fact]
40+
public async Task CreateResource_ModelWithEntityFrameworkInHeritance_IsCreated()
41+
{
42+
// Arrange
43+
var dbContext = PrepareTest<Startup>();
44+
var serializer = GetSerializer<SuperUser>(e => new { e.SecurityLevel, e.Username, e.Password });
45+
var superUser = new SuperUser { SecurityLevel = 1337, Username = "Super", Password = "User" };
46+
47+
// Act
48+
var (body, response) = await Post("/api/v1/super-users", serializer.Serialize(superUser));
49+
50+
// Assert
51+
AssertEqualStatusCode(HttpStatusCode.Created, response);
52+
var createdSuperUser = _deserializer.DeserializeSingle<SuperUser>(body).Data;
53+
var created = dbContext.SuperUsers.Where(e => e.Id.Equals(createdSuperUser.Id)).First();
54+
}
55+
3956
[Fact]
4057
public async Task CreateResource_GuidResource_IsCreated()
4158
{

test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/EndToEndTest.cs

+5
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,11 @@ public AppDbContext GetDbContext()
6161
return SendRequest("POST", route, content);
6262
}
6363

64+
public Task<(string, HttpResponseMessage)> Patch(string route, string content)
65+
{
66+
return SendRequest("PATCH", route, content);
67+
}
68+
6469
public IRequestSerializer GetSerializer<TResource>(Expression<Func<TResource, dynamic>> attributes = null, Expression<Func<TResource, dynamic>> relationships = null) where TResource : class, IIdentifiable
6570
{
6671
return _fixture.GetSerializer(attributes, relationships);

test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/UpdatingDataTests.cs

+22-3
Original file line numberDiff line numberDiff line change
@@ -20,15 +20,15 @@
2020
namespace JsonApiDotNetCoreExampleTests.Acceptance.Spec
2121
{
2222
[Collection("WebHostCollection")]
23-
public class UpdatingDataTests
23+
public class UpdatingDataTests : EndToEndTest
2424
{
2525
private TestFixture<Startup> _fixture;
2626
private AppDbContext _context;
2727
private Faker<TodoItem> _todoItemFaker;
2828
private Faker<Person> _personFaker;
2929

30-
public UpdatingDataTests(TestFixture<Startup> fixture)
31-
{
30+
public UpdatingDataTests(TestFixture<Startup> fixture) : base(fixture)
31+
{
3232
_fixture = fixture;
3333
_context = fixture.GetService<AppDbContext>();
3434

@@ -41,6 +41,25 @@ public UpdatingDataTests(TestFixture<Startup> fixture)
4141
.RuleFor(p => p.LastName, f => f.Name.LastName());
4242
}
4343

44+
[Fact]
45+
public async Task PatchResource_ModelWithEntityFrameworkInHeritance_IsPatched()
46+
{
47+
// Arrange
48+
var dbContext = PrepareTest<Startup>();
49+
var serializer = GetSerializer<SuperUser>(e => new { e.SecurityLevel });
50+
var superUser = new SuperUser { SecurityLevel = 1337, Username = "Super", Password = "User" };
51+
dbContext.SuperUsers.Add(superUser);
52+
dbContext.SaveChanges();
53+
var su = new SuperUser { Id = superUser.Id, SecurityLevel = 2674 };
54+
55+
// Act
56+
var (body, response) = await Patch($"/api/v1/super-users/{su.Id}", serializer.Serialize(su));
57+
58+
// Assert
59+
AssertEqualStatusCode(HttpStatusCode.OK, response);
60+
var updated = _deserializer.DeserializeSingle<SuperUser>(body).Data;
61+
Assert.Equal(2674, updated.SecurityLevel);
62+
}
4463

4564
[Fact]
4665
public async Task Response400IfUpdatingNotSettableAttribute()

test/JsonApiDotNetCoreExampleTests/Acceptance/TestFixture.cs

+1
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,7 @@ public IResponseDeserializer GetDeserializer()
5252
.AddResource<Tag>()
5353
.AddResource<CamelCasedModel>()
5454
.AddResource<User>()
55+
.AddResource<SuperUser>()
5556
.AddResource<Person>()
5657
.AddResource<Author>()
5758
.AddResource<Passport>()

0 commit comments

Comments
 (0)