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