55using Moq ;
66using Xunit ;
77using System . Threading . Tasks ;
8+ using JsonApiDotNetCore . Configuration ;
89using JsonApiDotNetCore . Internal ;
10+ using Microsoft . AspNetCore . Http ;
11+ using Microsoft . AspNetCore . Mvc ;
912
1013namespace UnitTests
1114{
@@ -143,6 +146,8 @@ public async Task PatchAsync_Calls_Service()
143146 const int id = 0 ;
144147 var resource = new Resource ( ) ;
145148 var serviceMock = new Mock < IUpdateService < Resource > > ( ) ;
149+ _jsonApiContextMock . Setup ( a => a . ApplyContext < Resource > ( It . IsAny < BaseJsonApiController < Resource > > ( ) ) ) . Returns ( _jsonApiContextMock . Object ) ;
150+ _jsonApiContextMock . SetupGet ( a => a . Options ) . Returns ( new JsonApiOptions ( ) ) ;
146151 var controller = new BaseJsonApiController < Resource > ( _jsonApiContextMock . Object , update : serviceMock . Object ) ;
147152
148153 // act
@@ -153,6 +158,47 @@ public async Task PatchAsync_Calls_Service()
153158 VerifyApplyContext ( ) ;
154159 }
155160
161+ [ Fact ]
162+ public async Task PatchAsync_ModelStateInvalid_ValidateModelStateDisbled ( )
163+ {
164+ // arrange
165+ const int id = 0 ;
166+ var resource = new Resource ( ) ;
167+ var serviceMock = new Mock < IUpdateService < Resource > > ( ) ;
168+ _jsonApiContextMock . Setup ( a => a . ApplyContext < Resource > ( It . IsAny < BaseJsonApiController < Resource > > ( ) ) ) . Returns ( _jsonApiContextMock . Object ) ;
169+ _jsonApiContextMock . SetupGet ( a => a . Options ) . Returns ( new JsonApiOptions { ValidateModelState = false } ) ;
170+ var controller = new BaseJsonApiController < Resource > ( _jsonApiContextMock . Object , update : serviceMock . Object ) ;
171+
172+ // act
173+ var response = await controller . PatchAsync ( id , resource ) ;
174+
175+ // assert
176+ serviceMock . Verify ( m => m . UpdateAsync ( id , It . IsAny < Resource > ( ) ) , Times . Once ) ;
177+ VerifyApplyContext ( ) ;
178+ Assert . IsNotType < BadRequestObjectResult > ( response ) ;
179+ }
180+
181+ [ Fact ]
182+ public async Task PatchAsync_ModelStateInvalid_ValidateModelStateEnabled ( )
183+ {
184+ // arrange
185+ const int id = 0 ;
186+ var resource = new Resource ( ) ;
187+ var serviceMock = new Mock < IUpdateService < Resource > > ( ) ;
188+ _jsonApiContextMock . Setup ( a => a . ApplyContext < Resource > ( It . IsAny < BaseJsonApiController < Resource > > ( ) ) ) . Returns ( _jsonApiContextMock . Object ) ;
189+ _jsonApiContextMock . SetupGet ( a => a . Options ) . Returns ( new JsonApiOptions { ValidateModelState = true } ) ;
190+ var controller = new BaseJsonApiController < Resource > ( _jsonApiContextMock . Object , update : serviceMock . Object ) ;
191+ controller . ModelState . AddModelError ( "Id" , "Failed Validation" ) ;
192+
193+ // act
194+ var response = await controller . PatchAsync ( id , resource ) ;
195+
196+ // assert
197+ serviceMock . Verify ( m => m . UpdateAsync ( id , It . IsAny < Resource > ( ) ) , Times . Never ) ;
198+ Assert . IsType < BadRequestObjectResult > ( response ) ;
199+ Assert . IsType < ErrorCollection > ( ( ( BadRequestObjectResult ) response ) . Value ) ;
200+ }
201+
156202 [ Fact ]
157203 public async Task PatchAsync_Throws_405_If_No_Service ( )
158204 {
@@ -168,6 +214,67 @@ public async Task PatchAsync_Throws_405_If_No_Service()
168214 Assert . Equal ( 405 , exception . GetStatusCode ( ) ) ;
169215 }
170216
217+ [ Fact ]
218+ public async Task PostAsync_Calls_Service ( )
219+ {
220+ // arrange
221+ var resource = new Resource ( ) ;
222+ var serviceMock = new Mock < ICreateService < Resource > > ( ) ;
223+ _jsonApiContextMock . Setup ( a => a . ApplyContext < Resource > ( It . IsAny < BaseJsonApiController < Resource > > ( ) ) ) . Returns ( _jsonApiContextMock . Object ) ;
224+ _jsonApiContextMock . SetupGet ( a => a . Options ) . Returns ( new JsonApiOptions ( ) ) ;
225+ var controller = new BaseJsonApiController < Resource > ( _jsonApiContextMock . Object , create : serviceMock . Object ) ;
226+ serviceMock . Setup ( m => m . CreateAsync ( It . IsAny < Resource > ( ) ) ) . ReturnsAsync ( resource ) ;
227+ controller . ControllerContext = new Microsoft . AspNetCore . Mvc . ControllerContext { HttpContext = new DefaultHttpContext ( ) } ;
228+
229+ // act
230+ await controller . PostAsync ( resource ) ;
231+
232+ // assert
233+ serviceMock . Verify ( m => m . CreateAsync ( It . IsAny < Resource > ( ) ) , Times . Once ) ;
234+ VerifyApplyContext ( ) ;
235+ }
236+
237+ [ Fact ]
238+ public async Task PostAsync_ModelStateInvalid_ValidateModelStateDisabled ( )
239+ {
240+ // arrange
241+ var resource = new Resource ( ) ;
242+ var serviceMock = new Mock < ICreateService < Resource > > ( ) ;
243+ _jsonApiContextMock . Setup ( a => a . ApplyContext < Resource > ( It . IsAny < BaseJsonApiController < Resource > > ( ) ) ) . Returns ( _jsonApiContextMock . Object ) ;
244+ _jsonApiContextMock . SetupGet ( a => a . Options ) . Returns ( new JsonApiOptions { ValidateModelState = false } ) ;
245+ var controller = new BaseJsonApiController < Resource > ( _jsonApiContextMock . Object , create : serviceMock . Object ) ;
246+ serviceMock . Setup ( m => m . CreateAsync ( It . IsAny < Resource > ( ) ) ) . ReturnsAsync ( resource ) ;
247+ controller . ControllerContext = new Microsoft . AspNetCore . Mvc . ControllerContext { HttpContext = new DefaultHttpContext ( ) } ;
248+
249+ // act
250+ var response = await controller . PostAsync ( resource ) ;
251+
252+ // assert
253+ serviceMock . Verify ( m => m . CreateAsync ( It . IsAny < Resource > ( ) ) , Times . Once ) ;
254+ VerifyApplyContext ( ) ;
255+ Assert . IsNotType < BadRequestObjectResult > ( response ) ;
256+ }
257+
258+ [ Fact ]
259+ public async Task PostAsync_ModelStateInvalid_ValidateModelStateEnabled ( )
260+ {
261+ // arrange
262+ var resource = new Resource ( ) ;
263+ var serviceMock = new Mock < ICreateService < Resource > > ( ) ;
264+ _jsonApiContextMock . Setup ( a => a . ApplyContext < Resource > ( It . IsAny < BaseJsonApiController < Resource > > ( ) ) ) . Returns ( _jsonApiContextMock . Object ) ;
265+ _jsonApiContextMock . SetupGet ( a => a . Options ) . Returns ( new JsonApiOptions { ValidateModelState = true } ) ;
266+ var controller = new BaseJsonApiController < Resource > ( _jsonApiContextMock . Object , create : serviceMock . Object ) ;
267+ controller . ModelState . AddModelError ( "Id" , "Failed Validation" ) ;
268+
269+ // act
270+ var response = await controller . PostAsync ( resource ) ;
271+
272+ // assert
273+ serviceMock . Verify ( m => m . CreateAsync ( It . IsAny < Resource > ( ) ) , Times . Never ) ;
274+ Assert . IsType < BadRequestObjectResult > ( response ) ;
275+ Assert . IsType < ErrorCollection > ( ( ( BadRequestObjectResult ) response ) . Value ) ;
276+ }
277+
171278 [ Fact ]
172279 public async Task PatchRelationshipsAsync_Calls_Service ( )
173280 {
0 commit comments