From 3367ef5aeec2775b8b38c41f6327b47d6a83f2d0 Mon Sep 17 00:00:00 2001 From: Maurits Moeys Date: Fri, 1 Nov 2019 17:06:26 +0100 Subject: [PATCH 1/3] chore: create inheritance model + controller --- .../Controllers/UsersController.cs | 10 ++++++++++ .../JsonApiDotNetCoreExample/Data/AppDbContext.cs | 2 ++ src/Examples/JsonApiDotNetCoreExample/Models/User.cs | 5 +++++ 3 files changed, 17 insertions(+) diff --git a/src/Examples/JsonApiDotNetCoreExample/Controllers/UsersController.cs b/src/Examples/JsonApiDotNetCoreExample/Controllers/UsersController.cs index cc47e88d84..9009747cdb 100644 --- a/src/Examples/JsonApiDotNetCoreExample/Controllers/UsersController.cs +++ b/src/Examples/JsonApiDotNetCoreExample/Controllers/UsersController.cs @@ -15,4 +15,14 @@ public UsersController( : base(jsonApiOptions, resourceService, loggerFactory) { } } + + public class SuperUsersContrroller : JsonApiController + { + public SuperUsersContrroller( + IJsonApiOptions jsonApiOptions, + IResourceService resourceService, + ILoggerFactory loggerFactory) + : base(jsonApiOptions, resourceService, loggerFactory) + { } + } } diff --git a/src/Examples/JsonApiDotNetCoreExample/Data/AppDbContext.cs b/src/Examples/JsonApiDotNetCoreExample/Data/AppDbContext.cs index 7faa22bd55..53a7b25f7e 100644 --- a/src/Examples/JsonApiDotNetCoreExample/Data/AppDbContext.cs +++ b/src/Examples/JsonApiDotNetCoreExample/Data/AppDbContext.cs @@ -23,6 +23,8 @@ public AppDbContext(DbContextOptions options) : base(options) { } protected override void OnModelCreating(ModelBuilder modelBuilder) { + modelBuilder.Entity().HasBaseType(); + modelBuilder.Entity() .Property(t => t.CreatedDate).HasDefaultValueSql("CURRENT_TIMESTAMP").IsRequired(); diff --git a/src/Examples/JsonApiDotNetCoreExample/Models/User.cs b/src/Examples/JsonApiDotNetCoreExample/Models/User.cs index f966cb84cd..d0e38b93e7 100644 --- a/src/Examples/JsonApiDotNetCoreExample/Models/User.cs +++ b/src/Examples/JsonApiDotNetCoreExample/Models/User.cs @@ -8,4 +8,9 @@ public class User : Identifiable [Attr] public string Username { get; set; } [Attr] public string Password { get; set; } } + + public class SuperUser : User + { + [Attr] public int SecurityLevel { get; set; } + } } From c8af9fb2fe62a289521ff97b6356b6b132b91582 Mon Sep 17 00:00:00 2001 From: Maurits Moeys Date: Fri, 1 Nov 2019 17:27:19 +0100 Subject: [PATCH 2/3] test: create and patch acceptance test --- .../Controllers/UsersController.cs | 4 +-- .../Data/AppDbContext.cs | 1 + .../Internal/DefaultRoutingConvention.cs | 1 + .../Acceptance/Spec/CreatingDataTests.cs | 17 +++++++++++++ .../Acceptance/Spec/EndToEndTest.cs | 5 ++++ .../Acceptance/Spec/UpdatingDataTests.cs | 25 ++++++++++++++++--- 6 files changed, 48 insertions(+), 5 deletions(-) diff --git a/src/Examples/JsonApiDotNetCoreExample/Controllers/UsersController.cs b/src/Examples/JsonApiDotNetCoreExample/Controllers/UsersController.cs index 9009747cdb..de1996d5e5 100644 --- a/src/Examples/JsonApiDotNetCoreExample/Controllers/UsersController.cs +++ b/src/Examples/JsonApiDotNetCoreExample/Controllers/UsersController.cs @@ -16,9 +16,9 @@ public UsersController( { } } - public class SuperUsersContrroller : JsonApiController + public class SuperUsersController : JsonApiController { - public SuperUsersContrroller( + public SuperUsersController( IJsonApiOptions jsonApiOptions, IResourceService resourceService, ILoggerFactory loggerFactory) diff --git a/src/Examples/JsonApiDotNetCoreExample/Data/AppDbContext.cs b/src/Examples/JsonApiDotNetCoreExample/Data/AppDbContext.cs index 53a7b25f7e..9411f48a4f 100644 --- a/src/Examples/JsonApiDotNetCoreExample/Data/AppDbContext.cs +++ b/src/Examples/JsonApiDotNetCoreExample/Data/AppDbContext.cs @@ -14,6 +14,7 @@ public class AppDbContext : DbContext public DbSet AuthorDifferentDbContextName { get; set; } public DbSet NonJsonApiResources { get; set; } public DbSet Users { get; set; } + public DbSet SuperUsers { get; set; } public DbSet PersonRoles { get; set; } public DbSet ArticleTags { get; set; } public DbSet IdentifiableArticleTags { get; set; } diff --git a/src/JsonApiDotNetCore/Internal/DefaultRoutingConvention.cs b/src/JsonApiDotNetCore/Internal/DefaultRoutingConvention.cs index eb68142e31..f694d95010 100644 --- a/src/JsonApiDotNetCore/Internal/DefaultRoutingConvention.cs +++ b/src/JsonApiDotNetCore/Internal/DefaultRoutingConvention.cs @@ -58,6 +58,7 @@ public void Apply(ApplicationModel application) foreach (var controller in application.Controllers) { var resourceType = GetResourceTypeFromController(controller.ControllerType); + if (resourceType != null) _registeredResources.Add(controller.ControllerName, resourceType); diff --git a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/CreatingDataTests.cs b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/CreatingDataTests.cs index 32ac423eee..d3df6a47e3 100644 --- a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/CreatingDataTests.cs +++ b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/CreatingDataTests.cs @@ -36,6 +36,23 @@ public CreatingDataTests(TestFixture fixture) : base(fixture) } + [Fact] + public async Task CreateResource_ModelWithEntityFrameworkInHeritance_IsCreated() + { + // Arrange + var dbContext = PrepareTest(); + var serializer = GetSerializer(e => new { }, e => new { e.SecurityLevel, e.Username, e.Password }); + var superUser = new SuperUser { SecurityLevel = 1337, Username = "Super", Password = "User" }; + + // Act + var (body, response) = await Post("/api/v1/super-users", serializer.Serialize(superUser)); + + // Assert + AssertEqualStatusCode(HttpStatusCode.Created, response); + var createdSuperUser = _deserializer.DeserializeSingle(body).Data; + dbContext.SuperUsers.Where(e => e.Id.Equals(createdSuperUser.Id)).First(); + } + [Fact] public async Task CreateResource_GuidResource_IsCreated() { diff --git a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/EndToEndTest.cs b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/EndToEndTest.cs index e287e1ae20..0f0d045bdc 100644 --- a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/EndToEndTest.cs +++ b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/EndToEndTest.cs @@ -61,6 +61,11 @@ public AppDbContext GetDbContext() return SendRequest("POST", route, content); } + public Task<(string, HttpResponseMessage)> Patch(string route, string content) + { + return SendRequest("PATCH", route, content); + } + public IRequestSerializer GetSerializer(Expression> attributes = null, Expression> relationships = null) where TResource : class, IIdentifiable { return _fixture.GetSerializer(attributes, relationships); diff --git a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/UpdatingDataTests.cs b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/UpdatingDataTests.cs index 9860f4e2cf..df4cdfe803 100644 --- a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/UpdatingDataTests.cs +++ b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/UpdatingDataTests.cs @@ -20,15 +20,15 @@ namespace JsonApiDotNetCoreExampleTests.Acceptance.Spec { [Collection("WebHostCollection")] - public class UpdatingDataTests + public class UpdatingDataTests : EndToEndTest { private TestFixture _fixture; private AppDbContext _context; private Faker _todoItemFaker; private Faker _personFaker; - public UpdatingDataTests(TestFixture fixture) - { + public UpdatingDataTests(TestFixture fixture) : base(fixture) + { _fixture = fixture; _context = fixture.GetService(); @@ -41,6 +41,25 @@ public UpdatingDataTests(TestFixture fixture) .RuleFor(p => p.LastName, f => f.Name.LastName()); } + [Fact] + public async Task PatchResource_ModelWithEntityFrameworkInHeritance_IsPatched() + { + // Arrange + var dbContext = PrepareTest(); + var serializer = GetSerializer(e => new { e.SecurityLevel }); + var superUser = new SuperUser { SecurityLevel = 1337, Username = "Super", Password = "User" }; + var su = new SuperUser { Id = superUser.Id, SecurityLevel = 2674 }; + dbContext.SuperUsers.Add(superUser); + dbContext.SaveChanges(); + + // Act + var (body, response) = await Patch($"/api/v1/super-users/{su.Id}", serializer.Serialize(superUser)); + + // Assert + AssertEqualStatusCode(HttpStatusCode.OK, response); + var updated = dbContext.SuperUsers.AsNoTracking().Where(e => e.Id.Equals(su.Id)).First(); + Assert.Equal(2674, updated.SecurityLevel); + } [Fact] public async Task Response400IfUpdatingNotSettableAttribute() From 4fcd5c0bf9cc6ccd92605116c04aaad598852dc3 Mon Sep 17 00:00:00 2001 From: Maurits Moeys Date: Fri, 1 Nov 2019 17:36:16 +0100 Subject: [PATCH 3/3] chore: close issue --- .../Acceptance/Spec/CreatingDataTests.cs | 4 ++-- .../Acceptance/Spec/UpdatingDataTests.cs | 6 +++--- .../JsonApiDotNetCoreExampleTests/Acceptance/TestFixture.cs | 1 + 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/CreatingDataTests.cs b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/CreatingDataTests.cs index d3df6a47e3..982dfdd100 100644 --- a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/CreatingDataTests.cs +++ b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/CreatingDataTests.cs @@ -41,7 +41,7 @@ public async Task CreateResource_ModelWithEntityFrameworkInHeritance_IsCreated() { // Arrange var dbContext = PrepareTest(); - var serializer = GetSerializer(e => new { }, e => new { e.SecurityLevel, e.Username, e.Password }); + var serializer = GetSerializer(e => new { e.SecurityLevel, e.Username, e.Password }); var superUser = new SuperUser { SecurityLevel = 1337, Username = "Super", Password = "User" }; // Act @@ -50,7 +50,7 @@ public async Task CreateResource_ModelWithEntityFrameworkInHeritance_IsCreated() // Assert AssertEqualStatusCode(HttpStatusCode.Created, response); var createdSuperUser = _deserializer.DeserializeSingle(body).Data; - dbContext.SuperUsers.Where(e => e.Id.Equals(createdSuperUser.Id)).First(); + var created = dbContext.SuperUsers.Where(e => e.Id.Equals(createdSuperUser.Id)).First(); } [Fact] diff --git a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/UpdatingDataTests.cs b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/UpdatingDataTests.cs index df4cdfe803..9d58f4d75c 100644 --- a/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/UpdatingDataTests.cs +++ b/test/JsonApiDotNetCoreExampleTests/Acceptance/Spec/UpdatingDataTests.cs @@ -48,16 +48,16 @@ public async Task PatchResource_ModelWithEntityFrameworkInHeritance_IsPatched() var dbContext = PrepareTest(); var serializer = GetSerializer(e => new { e.SecurityLevel }); var superUser = new SuperUser { SecurityLevel = 1337, Username = "Super", Password = "User" }; - var su = new SuperUser { Id = superUser.Id, SecurityLevel = 2674 }; dbContext.SuperUsers.Add(superUser); dbContext.SaveChanges(); + var su = new SuperUser { Id = superUser.Id, SecurityLevel = 2674 }; // Act - var (body, response) = await Patch($"/api/v1/super-users/{su.Id}", serializer.Serialize(superUser)); + var (body, response) = await Patch($"/api/v1/super-users/{su.Id}", serializer.Serialize(su)); // Assert AssertEqualStatusCode(HttpStatusCode.OK, response); - var updated = dbContext.SuperUsers.AsNoTracking().Where(e => e.Id.Equals(su.Id)).First(); + var updated = _deserializer.DeserializeSingle(body).Data; Assert.Equal(2674, updated.SecurityLevel); } diff --git a/test/JsonApiDotNetCoreExampleTests/Acceptance/TestFixture.cs b/test/JsonApiDotNetCoreExampleTests/Acceptance/TestFixture.cs index a24bf58208..92cb977c58 100644 --- a/test/JsonApiDotNetCoreExampleTests/Acceptance/TestFixture.cs +++ b/test/JsonApiDotNetCoreExampleTests/Acceptance/TestFixture.cs @@ -52,6 +52,7 @@ public IResponseDeserializer GetDeserializer() .AddResource() .AddResource() .AddResource() + .AddResource() .AddResource() .AddResource() .AddResource()