Browse Source

Resolved #2467: Add MaxMaxResultCount to LimitedResultRequestDto.

pull/2470/head
Halil İbrahim Kalkan 7 years ago
parent
commit
ee403c37e9
  1. 3
      framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ILimitedResultRequest.cs
  2. 24
      framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/LimitedResultRequestDto.cs
  3. 1
      framework/test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.csproj
  4. 32
      framework/test/Volo.Abp.Validation.Tests/Volo/Abp/Validation/ApplicationService_Validation_Tests.cs

3
framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/ILimitedResultRequest.cs

@ -6,7 +6,8 @@ namespace Volo.Abp.Application.Dtos
public interface ILimitedResultRequest public interface ILimitedResultRequest
{ {
/// <summary> /// <summary>
/// Max expected result count. /// Maximum result count should be returned.
/// This is generally used to limit result count on paging.
/// </summary> /// </summary>
int MaxResultCount { get; set; } int MaxResultCount { get; set; }
} }

24
framework/src/Volo.Abp.Ddd.Application.Contracts/Volo/Abp/Application/Dtos/LimitedResultRequestDto.cs

@ -1,4 +1,5 @@
using System; using System;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
namespace Volo.Abp.Application.Dtos namespace Volo.Abp.Application.Dtos
@ -7,11 +8,32 @@ namespace Volo.Abp.Application.Dtos
/// Simply implements <see cref="ILimitedResultRequest"/>. /// Simply implements <see cref="ILimitedResultRequest"/>.
/// </summary> /// </summary>
[Serializable] [Serializable]
public class LimitedResultRequestDto : ILimitedResultRequest public class LimitedResultRequestDto : ILimitedResultRequest, IValidatableObject
{ {
/// <summary>
/// Default value: 10.
/// </summary>
public static int DefaultMaxResultCount { get; set; } = 10; public static int DefaultMaxResultCount { get; set; } = 10;
/// <summary>
/// Maximum possible value of the <see cref="MaxResultCount"/>.
/// Default value: 1,000.
/// </summary>
public static int MaxMaxResultCount { get; set; } = 1000;
/// <summary>
/// Maximum result count should be returned.
/// This is generally used to limit result count on paging.
/// </summary>
[Range(1, int.MaxValue)] [Range(1, int.MaxValue)]
public virtual int MaxResultCount { get; set; } = DefaultMaxResultCount; public virtual int MaxResultCount { get; set; } = DefaultMaxResultCount;
public virtual IEnumerable<ValidationResult> Validate(ValidationContext validationContext)
{
if (MaxResultCount > MaxMaxResultCount)
{
yield return new ValidationResult($"{nameof(MaxResultCount)} can not be more than {MaxMaxResultCount}! Increase {typeof(LimitedResultRequestDto).FullName}.{nameof(MaxMaxResultCount)} on the server side to allow more results.", new []{nameof(MaxResultCount)});
}
}
} }
} }

1
framework/test/Volo.Abp.Validation.Tests/Volo.Abp.Validation.Tests.csproj

@ -9,6 +9,7 @@
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" /> <ProjectReference Include="..\..\src\Volo.Abp.Autofac\Volo.Abp.Autofac.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Ddd.Application.Contracts\Volo.Abp.Ddd.Application.Contracts.csproj" />
<ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" /> <ProjectReference Include="..\AbpTestBase\AbpTestBase.csproj" />
<ProjectReference Include="..\..\src\Volo.Abp.Validation\Volo.Abp.Validation.csproj" /> <ProjectReference Include="..\..\src\Volo.Abp.Validation\Volo.Abp.Validation.csproj" />
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" /> <PackageReference Include="Microsoft.NET.Test.Sdk" Version="16.3.0" />

32
framework/test/Volo.Abp.Validation.Tests/Volo/Abp/Validation/ApplicationService_Validation_Tests.cs

@ -1,9 +1,11 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.DependencyInjection;
using Shouldly; using Shouldly;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Autofac; using Volo.Abp.Autofac;
using Volo.Abp.DependencyInjection; using Volo.Abp.DependencyInjection;
using Volo.Abp.Modularity; using Volo.Abp.Modularity;
@ -135,6 +137,30 @@ namespace Volo.Abp.Validation
}); });
} }
//TODO: Create a Volo.Abp.Ddd.Application.Contracts.Tests project and move this to there and remove Volo.Abp.Ddd.Application.Contracts dependency from this project.
[Fact]
public async Task LimitedResultRequestDto_Should_Throw_Exception_For_Requests_More_Than_MaxMaxResultCount()
{
var exception = await Assert.ThrowsAsync<AbpValidationException>(async () =>
{
await _myAppService.MyMethodWithLimitedResult(new LimitedResultRequestDto
{
MaxResultCount = LimitedResultRequestDto.MaxMaxResultCount + 1
});
});
exception.ValidationErrors.ShouldContain(e => e.MemberNames.Contains(nameof(LimitedResultRequestDto.MaxResultCount)));
}
[Fact]
public async Task LimitedResultRequestDto_Should_Be_Valid_For_Requests_Less_Than_MaxMaxResultCount()
{
await _myAppService.MyMethodWithLimitedResult(new LimitedResultRequestDto
{
MaxResultCount = LimitedResultRequestDto.MaxMaxResultCount -1
});
}
[Fact] [Fact]
public async Task Should_Stop_Recursive_Validation_In_A_Constant_Depth() public async Task Should_Stop_Recursive_Validation_In_A_Constant_Depth()
{ {
@ -195,6 +221,7 @@ namespace Volo.Abp.Validation
Task<MyMethodOutput> MyMethod6(MyMethod6Input input); Task<MyMethodOutput> MyMethod6(MyMethod6Input input);
Task<MyMethodOutput> MyMethod8(MyClassWithRecursiveReference input); Task<MyMethodOutput> MyMethod8(MyClassWithRecursiveReference input);
Task MyMethodWithNullableEnum(MyEnum? value); Task MyMethodWithNullableEnum(MyEnum? value);
Task MyMethodWithLimitedResult(LimitedResultRequestDto input);
} }
public class MyAppService : IMyAppService, ITransientDependency public class MyAppService : IMyAppService, ITransientDependency
@ -240,6 +267,11 @@ namespace Volo.Abp.Validation
return Task.FromResult(new MyMethodOutput { Result = 42 }); return Task.FromResult(new MyMethodOutput { Result = 42 });
} }
public Task MyMethodWithLimitedResult(LimitedResultRequestDto input)
{
return Task.CompletedTask;
}
public Task MyMethodWithNullableEnum(MyEnum? value) public Task MyMethodWithNullableEnum(MyEnum? value)
{ {
return Task.CompletedTask; return Task.CompletedTask;

Loading…
Cancel
Save