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
{
/// <summary>
/// Max expected result count.
/// Maximum result count should be returned.
/// This is generally used to limit result count on paging.
/// </summary>
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.Collections.Generic;
using System.ComponentModel.DataAnnotations;
namespace Volo.Abp.Application.Dtos
@ -7,11 +8,32 @@ namespace Volo.Abp.Application.Dtos
/// Simply implements <see cref="ILimitedResultRequest"/>.
/// </summary>
[Serializable]
public class LimitedResultRequestDto : ILimitedResultRequest
public class LimitedResultRequestDto : ILimitedResultRequest, IValidatableObject
{
/// <summary>
/// Default value: 10.
/// </summary>
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)]
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>
<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="..\..\src\Volo.Abp.Validation\Volo.Abp.Validation.csproj" />
<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.Collections.Generic;
using System.ComponentModel.DataAnnotations;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.Extensions.DependencyInjection;
using Shouldly;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Autofac;
using Volo.Abp.DependencyInjection;
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]
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> MyMethod8(MyClassWithRecursiveReference input);
Task MyMethodWithNullableEnum(MyEnum? value);
Task MyMethodWithLimitedResult(LimitedResultRequestDto input);
}
public class MyAppService : IMyAppService, ITransientDependency
@ -240,6 +267,11 @@ namespace Volo.Abp.Validation
return Task.FromResult(new MyMethodOutput { Result = 42 });
}
public Task MyMethodWithLimitedResult(LimitedResultRequestDto input)
{
return Task.CompletedTask;
}
public Task MyMethodWithNullableEnum(MyEnum? value)
{
return Task.CompletedTask;

Loading…
Cancel
Save