mirror of https://github.com/abpframework/abp.git
24 changed files with 469 additions and 35 deletions
@ -0,0 +1,19 @@ |
|||||
|
@page |
||||
|
@model Volo.Abp.AspNetCore.Mvc.Auditing.AuditTestPage |
||||
|
|
||||
|
@{ |
||||
|
Layout = null; |
||||
|
} |
||||
|
|
||||
|
<!DOCTYPE html> |
||||
|
|
||||
|
<html> |
||||
|
<head> |
||||
|
<title></title> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div> |
||||
|
|
||||
|
</div> |
||||
|
</body> |
||||
|
</html> |
||||
@ -0,0 +1,33 @@ |
|||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Microsoft.AspNetCore.Mvc.RazorPages; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; |
||||
|
using Volo.Abp.Auditing; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.Mvc.Auditing |
||||
|
{ |
||||
|
public class AuditTestPage : AbpPageModel |
||||
|
{ |
||||
|
private readonly AbpAuditingOptions _options; |
||||
|
|
||||
|
public AuditTestPage(IOptions<AbpAuditingOptions> options) |
||||
|
{ |
||||
|
_options = options.Value; |
||||
|
} |
||||
|
|
||||
|
public IActionResult OnGetAuditSuccessForGetRequests() |
||||
|
{ |
||||
|
return new OkResult(); |
||||
|
} |
||||
|
|
||||
|
public IActionResult OnGetAuditFailForGetRequests() |
||||
|
{ |
||||
|
throw new UserFriendlyException("Exception occurred!"); |
||||
|
} |
||||
|
|
||||
|
public ObjectResult OnGetAuditFailForGetRequestsReturningObject() |
||||
|
{ |
||||
|
throw new UserFriendlyException("Exception occurred!"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,65 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Microsoft.Extensions.DependencyInjection.Extensions; |
||||
|
using Microsoft.Extensions.Hosting; |
||||
|
using Microsoft.Extensions.Options; |
||||
|
using NSubstitute; |
||||
|
using Volo.Abp.Auditing; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.Mvc.Auditing |
||||
|
{ |
||||
|
public class AuditTestPage_Tests : AspNetCoreMvcTestBase |
||||
|
{ |
||||
|
private readonly AbpAuditingOptions _options; |
||||
|
private IAuditingStore _auditingStore; |
||||
|
|
||||
|
public AuditTestPage_Tests() |
||||
|
{ |
||||
|
_options = ServiceProvider.GetRequiredService<IOptions<AbpAuditingOptions>>().Value; |
||||
|
_auditingStore = ServiceProvider.GetRequiredService<IAuditingStore>(); |
||||
|
} |
||||
|
|
||||
|
protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) |
||||
|
{ |
||||
|
_auditingStore = Substitute.For<IAuditingStore>(); |
||||
|
services.Replace(ServiceDescriptor.Singleton(_auditingStore)); |
||||
|
base.ConfigureServices(context, services); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_Trigger_Middleware_And_AuditLog_Success_For_GetRequests() |
||||
|
{ |
||||
|
_options.IsEnabledForGetRequests = true; |
||||
|
_options.AlwaysLogOnException = false; |
||||
|
await GetResponseAsync("/Auditing/AuditTestPage?handler=AuditSuccessForGetRequests"); |
||||
|
await _auditingStore.Received().SaveAsync(Arg.Any<AuditLogInfo>()); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_Trigger_Middleware_And_AuditLog_Exception_Always() |
||||
|
{ |
||||
|
_options.IsEnabled = true; |
||||
|
_options.AlwaysLogOnException = true; |
||||
|
|
||||
|
try |
||||
|
{ |
||||
|
await GetResponseAsync("/Auditing/AuditTestPage?handler=AuditFailForGetRequests", System.Net.HttpStatusCode.Forbidden); |
||||
|
} |
||||
|
catch { } |
||||
|
|
||||
|
await _auditingStore.Received().SaveAsync(Arg.Any<AuditLogInfo>()); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_Trigger_Middleware_And_AuditLog_Exception_When_Returns_Object() |
||||
|
{ |
||||
|
_options.IsEnabled = true; |
||||
|
_options.AlwaysLogOnException = true; |
||||
|
|
||||
|
await GetResponseAsync("/Auditing/AuditTestPage?handler=AuditFailForGetRequestsReturningObject", System.Net.HttpStatusCode.Forbidden); |
||||
|
|
||||
|
await _auditingStore.Received().SaveAsync(Arg.Any<AuditLogInfo>()); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
@page |
||||
|
@model Volo.Abp.AspNetCore.Mvc.ExceptionHandling.ExceptionTestPage |
||||
|
|
||||
|
@{ |
||||
|
Layout = null; |
||||
|
} |
||||
|
|
||||
|
<!DOCTYPE html> |
||||
|
|
||||
|
<html> |
||||
|
<head> |
||||
|
<title></title> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div> |
||||
|
|
||||
|
</div> |
||||
|
</body> |
||||
|
</html> |
||||
@ -0,0 +1,18 @@ |
|||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling |
||||
|
{ |
||||
|
public class ExceptionTestPage : AbpPageModel |
||||
|
{ |
||||
|
public void OnGetUserFriendlyException1() |
||||
|
{ |
||||
|
throw new UserFriendlyException("This is a sample exception!"); |
||||
|
} |
||||
|
|
||||
|
public IActionResult OnGetUserFriendlyException2() |
||||
|
{ |
||||
|
throw new UserFriendlyException("This is a sample exception!"); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,56 @@ |
|||||
|
using System.Net; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Microsoft.Extensions.Hosting; |
||||
|
using NSubstitute; |
||||
|
using Shouldly; |
||||
|
using Volo.Abp.ExceptionHandling; |
||||
|
using Volo.Abp.Http; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.Mvc.ExceptionHandling |
||||
|
{ |
||||
|
public class ExceptionTestPage_Tests : AspNetCoreMvcTestBase |
||||
|
{ |
||||
|
private IExceptionSubscriber _fakeExceptionSubscriber; |
||||
|
|
||||
|
protected override void ConfigureServices(HostBuilderContext context, IServiceCollection services) |
||||
|
{ |
||||
|
base.ConfigureServices(context, services); |
||||
|
|
||||
|
_fakeExceptionSubscriber = Substitute.For<IExceptionSubscriber>(); |
||||
|
|
||||
|
services.AddSingleton(_fakeExceptionSubscriber); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_Return_RemoteServiceErrorResponse_For_UserFriendlyException_For_Void_Return_Value() |
||||
|
{ |
||||
|
var result = await GetResponseAsObjectAsync<RemoteServiceErrorResponse>("/ExceptionHandling/ExceptionTestPage?handler=UserFriendlyException1", HttpStatusCode.Forbidden); |
||||
|
result.Error.ShouldNotBeNull(); |
||||
|
result.Error.Message.ShouldBe("This is a sample exception!"); |
||||
|
|
||||
|
#pragma warning disable 4014
|
||||
|
_fakeExceptionSubscriber |
||||
|
.Received() |
||||
|
.HandleAsync(Arg.Any<ExceptionNotificationContext>()); |
||||
|
#pragma warning restore 4014
|
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_Not_Handle_Exceptions_For_ActionResult_Return_Values() |
||||
|
{ |
||||
|
await Assert.ThrowsAsync<UserFriendlyException>( |
||||
|
async () => await GetResponseAsObjectAsync<RemoteServiceErrorResponse>( |
||||
|
"/ExceptionHandling/ExceptionTestPage?handler=UserFriendlyException2" |
||||
|
) |
||||
|
); |
||||
|
|
||||
|
#pragma warning disable 4014
|
||||
|
_fakeExceptionSubscriber |
||||
|
.DidNotReceive() |
||||
|
.HandleAsync(Arg.Any<ExceptionNotificationContext>()); |
||||
|
#pragma warning restore 4014
|
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
@page |
||||
|
@model Volo.Abp.AspNetCore.Mvc.Features.FeatureTestPage |
||||
|
|
||||
|
@{ |
||||
|
Layout = null; |
||||
|
} |
||||
|
|
||||
|
<!DOCTYPE html> |
||||
|
|
||||
|
<html> |
||||
|
<head> |
||||
|
<title></title> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div> |
||||
|
|
||||
|
</div> |
||||
|
</body> |
||||
|
</html> |
||||
@ -0,0 +1,27 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; |
||||
|
using Volo.Abp.Features; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.Mvc.Features |
||||
|
{ |
||||
|
public class FeatureTestPage : AbpPageModel |
||||
|
{ |
||||
|
[RequiresFeature("AllowedFeature")] |
||||
|
public Task OnGetAllowedFeatureAsync() |
||||
|
{ |
||||
|
return Task.CompletedTask; |
||||
|
} |
||||
|
|
||||
|
[RequiresFeature("NotAllowedFeature")] |
||||
|
public void OnGetNotAllowedFeature() |
||||
|
{ |
||||
|
|
||||
|
} |
||||
|
|
||||
|
public ObjectResult OnGetNoFeature() |
||||
|
{ |
||||
|
return new ObjectResult(42); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,34 @@ |
|||||
|
using System.Net; |
||||
|
using System.Threading.Tasks; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.Mvc.Features |
||||
|
{ |
||||
|
public class FeatureTestPage_Tests : AspNetCoreMvcTestBase |
||||
|
{ |
||||
|
[Fact] |
||||
|
public async Task Should_Allow_Enabled_Features() |
||||
|
{ |
||||
|
await GetResponseAsStringAsync( |
||||
|
"/Features/FeatureTestPage?handler=AllowedFeature" |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_Not_Allow_Not_Enabled_Features() |
||||
|
{ |
||||
|
await GetResponseAsStringAsync( |
||||
|
"/Features/FeatureTestPage?handler=NotAllowedFeature", |
||||
|
HttpStatusCode.Unauthorized |
||||
|
); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_Allow_Actions_With_No_Feature() |
||||
|
{ |
||||
|
await GetResponseAsStringAsync( |
||||
|
"/Features/FeatureTestPage?handler=NoFeature" |
||||
|
); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,37 @@ |
|||||
|
using System.Linq; |
||||
|
using System.Net; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Shouldly; |
||||
|
using Volo.Abp.Http; |
||||
|
using Volo.Abp.Json; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.Mvc.Uow |
||||
|
{ |
||||
|
public class UnitOfWorkPageFilter_Exception_Rollback_Tests : AspNetCoreMvcTestBase |
||||
|
{ |
||||
|
[Fact] |
||||
|
public async Task Should_Rollback_Transaction_For_Handled_Exceptions() |
||||
|
{ |
||||
|
var result = await GetResponseAsObjectAsync<RemoteServiceErrorResponse>("/Uow/UnitOfWorkTestPage?handler=HandledException", HttpStatusCode.Forbidden); |
||||
|
result.Error.ShouldNotBeNull(); |
||||
|
result.Error.Message.ShouldBe("This is a sample exception!"); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Should_Gracefully_Handle_Exceptions_On_Complete() |
||||
|
{ |
||||
|
var response = await GetResponseAsync("/Uow/UnitOfWorkTestPage?handler=ExceptionOnComplete", HttpStatusCode.Forbidden); |
||||
|
|
||||
|
response.Headers.GetValues(AbpHttpConsts.AbpErrorFormat).FirstOrDefault().ShouldBe("true"); |
||||
|
|
||||
|
var resultAsString = await response.Content.ReadAsStringAsync(); |
||||
|
|
||||
|
var result = ServiceProvider.GetRequiredService<IJsonSerializer>().Deserialize<RemoteServiceErrorResponse>(resultAsString); |
||||
|
|
||||
|
result.Error.ShouldNotBeNull(); |
||||
|
result.Error.Message.ShouldBe(TestUnitOfWorkConfig.ExceptionOnCompleteMessage); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,22 @@ |
|||||
|
using System.Threading.Tasks; |
||||
|
using Shouldly; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.Mvc.Uow |
||||
|
{ |
||||
|
public class UnitOfWorkPageFilter_Tests: AspNetCoreMvcTestBase |
||||
|
{ |
||||
|
[Fact] |
||||
|
public async Task Get_Actions_Should_Not_Be_Transactional() |
||||
|
{ |
||||
|
await GetResponseAsStringAsync("/Uow/UnitOfWorkTestPage?handler=RequiresUow"); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task Non_Get_Actions_Should_Be_Transactional() |
||||
|
{ |
||||
|
var result = await Client.PostAsync("/Uow/UnitOfWorkTestPage?handler=RequiresUow", null); |
||||
|
result.IsSuccessStatusCode.ShouldBeTrue(); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,19 @@ |
|||||
|
@page |
||||
|
@model Volo.Abp.AspNetCore.Mvc.Uow.UnitOfWorkTestPage |
||||
|
|
||||
|
@{ |
||||
|
Layout = null; |
||||
|
} |
||||
|
|
||||
|
<!DOCTYPE html> |
||||
|
|
||||
|
<html> |
||||
|
<head> |
||||
|
<title></title> |
||||
|
</head> |
||||
|
<body> |
||||
|
<div> |
||||
|
|
||||
|
</div> |
||||
|
</body> |
||||
|
</html> |
||||
@ -0,0 +1,54 @@ |
|||||
|
using Microsoft.AspNetCore.Mvc; |
||||
|
using Shouldly; |
||||
|
using Volo.Abp.AspNetCore.Mvc.UI.RazorPages; |
||||
|
using Volo.Abp.Uow; |
||||
|
|
||||
|
namespace Volo.Abp.AspNetCore.Mvc.Uow |
||||
|
{ |
||||
|
[IgnoreAntiforgeryToken] |
||||
|
public class UnitOfWorkTestPage : AbpPageModel |
||||
|
{ |
||||
|
private readonly TestUnitOfWorkConfig _testUnitOfWorkConfig; |
||||
|
|
||||
|
public UnitOfWorkTestPage(TestUnitOfWorkConfig testUnitOfWorkConfig) |
||||
|
{ |
||||
|
_testUnitOfWorkConfig = testUnitOfWorkConfig; |
||||
|
} |
||||
|
|
||||
|
public IActionResult OnGetRequiresUow() |
||||
|
{ |
||||
|
CurrentUnitOfWork.ShouldNotBeNull(); |
||||
|
CurrentUnitOfWork.Options.IsTransactional.ShouldBeFalse(); |
||||
|
|
||||
|
return Content("OK"); |
||||
|
} |
||||
|
|
||||
|
public IActionResult OnPostRequiresUow() |
||||
|
{ |
||||
|
CurrentUnitOfWork.ShouldNotBeNull(); |
||||
|
CurrentUnitOfWork.Options.IsTransactional.ShouldBeTrue(); |
||||
|
|
||||
|
return Content("OK"); |
||||
|
} |
||||
|
|
||||
|
[UnitOfWork(isTransactional: true)] |
||||
|
public void OnGetHandledException() |
||||
|
{ |
||||
|
CurrentUnitOfWork.ShouldNotBeNull(); |
||||
|
CurrentUnitOfWork.Options.IsTransactional.ShouldBeTrue(); |
||||
|
|
||||
|
throw new UserFriendlyException("This is a sample exception!"); |
||||
|
} |
||||
|
|
||||
|
public ObjectResult OnGetExceptionOnComplete() |
||||
|
{ |
||||
|
CurrentUnitOfWork.ShouldNotBeNull(); |
||||
|
CurrentUnitOfWork.Options.IsTransactional.ShouldBeFalse(); |
||||
|
|
||||
|
_testUnitOfWorkConfig.ThrowExceptionOnComplete = true; |
||||
|
|
||||
|
//Prevent rendering of pages.
|
||||
|
return new ObjectResult(""); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
Loading…
Reference in new issue