mirror of https://github.com/abpframework/abp.git
8 changed files with 189 additions and 4 deletions
@ -0,0 +1,17 @@ |
|||||
|
using Volo.Abp.EntityFrameworkCore.GlobalFilters; |
||||
|
using Volo.Abp.Modularity; |
||||
|
|
||||
|
namespace Volo.Abp.EntityFrameworkCore.DataFiltering; |
||||
|
|
||||
|
// Disables UseDbFunction so the EF.Property soft-delete filter path is exercised.
|
||||
|
[DependsOn(typeof(AbpEntityFrameworkCoreTestModule))] |
||||
|
public class AbpEntityFrameworkCoreTestModuleWithoutDbFunction : AbpModule |
||||
|
{ |
||||
|
public override void ConfigureServices(ServiceConfigurationContext context) |
||||
|
{ |
||||
|
Configure<AbpEfCoreGlobalFilterOptions>(options => |
||||
|
{ |
||||
|
options.UseDbFunction = false; |
||||
|
}); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,49 @@ |
|||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Shouldly; |
||||
|
using Volo.Abp.Data; |
||||
|
using Volo.Abp.Domain.Repositories; |
||||
|
using Volo.Abp.MultiTenancy; |
||||
|
using Volo.Abp.TestApp.Domain; |
||||
|
using Volo.Abp.TestApp.EntityFrameworkCore; |
||||
|
using Volo.Abp.TestApp.Testing; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Volo.Abp.EntityFrameworkCore.DataFiltering; |
||||
|
|
||||
|
public class MultiTenant_With_Custom_Column_Name_Tests : TestAppTestBase<AbpEntityFrameworkCoreTestModuleWithoutDbFunction> |
||||
|
{ |
||||
|
private readonly IRepository<EntityWithCustomTenantIdColumn, Guid> _repository; |
||||
|
private readonly IDataFilter<IMultiTenant> _multiTenantFilter; |
||||
|
|
||||
|
public MultiTenant_With_Custom_Column_Name_Tests() |
||||
|
{ |
||||
|
_repository = GetRequiredService<IRepository<EntityWithCustomTenantIdColumn, Guid>>(); |
||||
|
_multiTenantFilter = GetRequiredService<IDataFilter<IMultiTenant>>(); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task MultiTenant_Filter_Should_Work_When_TenantId_Has_Custom_Column_Name() |
||||
|
{ |
||||
|
var ctx = ServiceProvider.GetRequiredService<TestAppDbContext>(); |
||||
|
var tenantIdProperty = ctx.Model.FindEntityType(typeof(EntityWithCustomTenantIdColumn))! |
||||
|
.FindProperty(nameof(IMultiTenant.TenantId))!; |
||||
|
tenantIdProperty.GetColumnName().ShouldBe("custom_tenant_id_column"); |
||||
|
tenantIdProperty.Name.ShouldBe(nameof(IMultiTenant.TenantId)); |
||||
|
|
||||
|
using (_multiTenantFilter.Disable()) |
||||
|
{ |
||||
|
await _repository.InsertAsync(new EntityWithCustomTenantIdColumn { Name = "host", TenantId = null }); |
||||
|
await _repository.InsertAsync(new EntityWithCustomTenantIdColumn { Name = "tenant", TenantId = Guid.NewGuid() }); |
||||
|
|
||||
|
var all = await _repository.GetListAsync(); |
||||
|
all.Count.ShouldBe(2); |
||||
|
} |
||||
|
|
||||
|
var hostScoped = await _repository.GetListAsync(); |
||||
|
hostScoped.Count.ShouldBe(1); |
||||
|
hostScoped[0].Name.ShouldBe("host"); |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,49 @@ |
|||||
|
using System; |
||||
|
using System.Threading.Tasks; |
||||
|
using Microsoft.EntityFrameworkCore; |
||||
|
using Microsoft.Extensions.DependencyInjection; |
||||
|
using Shouldly; |
||||
|
using Volo.Abp.Data; |
||||
|
using Volo.Abp.Domain.Repositories; |
||||
|
using Volo.Abp.TestApp.Domain; |
||||
|
using Volo.Abp.TestApp.EntityFrameworkCore; |
||||
|
using Volo.Abp.TestApp.Testing; |
||||
|
using Xunit; |
||||
|
|
||||
|
namespace Volo.Abp.EntityFrameworkCore.DataFiltering; |
||||
|
|
||||
|
public class SoftDelete_With_Custom_Column_Name_Tests : TestAppTestBase<AbpEntityFrameworkCoreTestModuleWithoutDbFunction> |
||||
|
{ |
||||
|
private readonly IRepository<EntityWithCustomSoftDeleteColumn, Guid> _repository; |
||||
|
private readonly IDataFilter<ISoftDelete> _softDeleteFilter; |
||||
|
|
||||
|
public SoftDelete_With_Custom_Column_Name_Tests() |
||||
|
{ |
||||
|
_repository = GetRequiredService<IRepository<EntityWithCustomSoftDeleteColumn, Guid>>(); |
||||
|
_softDeleteFilter = GetRequiredService<IDataFilter<ISoftDelete>>(); |
||||
|
} |
||||
|
|
||||
|
[Fact] |
||||
|
public async Task SoftDelete_Filter_Should_Work_When_IsDeleted_Has_Custom_Column_Name() |
||||
|
{ |
||||
|
var ctx = ServiceProvider.GetRequiredService<TestAppDbContext>(); |
||||
|
var isDeletedProperty = ctx.Model.FindEntityType(typeof(EntityWithCustomSoftDeleteColumn))! |
||||
|
.FindProperty(nameof(ISoftDelete.IsDeleted))!; |
||||
|
isDeletedProperty.GetColumnName().ShouldBe("custom_is_deleted_column"); |
||||
|
isDeletedProperty.Name.ShouldBe(nameof(ISoftDelete.IsDeleted)); |
||||
|
|
||||
|
await _repository.InsertAsync(new EntityWithCustomSoftDeleteColumn { Name = "kept" }); |
||||
|
await _repository.InsertAsync(new EntityWithCustomSoftDeleteColumn { Name = "removed", IsDeleted = true }); |
||||
|
|
||||
|
var visible = await _repository.GetListAsync(); |
||||
|
visible.Count.ShouldBe(1); |
||||
|
visible[0].Name.ShouldBe("kept"); |
||||
|
|
||||
|
using (_softDeleteFilter.Disable()) |
||||
|
{ |
||||
|
var all = await _repository.GetListAsync(); |
||||
|
all.Count.ShouldBe(2); |
||||
|
all.ShouldContain(x => x.Name == "removed" && x.IsDeleted); |
||||
|
} |
||||
|
} |
||||
|
} |
||||
@ -0,0 +1,11 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.Domain.Entities; |
||||
|
|
||||
|
namespace Volo.Abp.TestApp.Domain; |
||||
|
|
||||
|
public class EntityWithCustomSoftDeleteColumn : AggregateRoot<Guid>, ISoftDelete |
||||
|
{ |
||||
|
public string Name { get; set; } |
||||
|
|
||||
|
public bool IsDeleted { get; set; } |
||||
|
} |
||||
@ -0,0 +1,12 @@ |
|||||
|
using System; |
||||
|
using Volo.Abp.Domain.Entities; |
||||
|
using Volo.Abp.MultiTenancy; |
||||
|
|
||||
|
namespace Volo.Abp.TestApp.Domain; |
||||
|
|
||||
|
public class EntityWithCustomTenantIdColumn : AggregateRoot<Guid>, IMultiTenant |
||||
|
{ |
||||
|
public string Name { get; set; } |
||||
|
|
||||
|
public Guid? TenantId { get; set; } |
||||
|
} |
||||
Loading…
Reference in new issue