using System;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
using Moq;
using Util.Domain.Properties;
using Util.Domain.Tests.Samples;
using Util.Domain.Tests.XUnitHelpers;
using Util.Domain.Trees;
using Util.Exceptions;
using Xunit;
namespace Util.Domain.Tests.Trees;
///
/// 树型更新路径服务测试
///
public class UpdatePathManagerTest {
///
/// 树型服务
///
private readonly UpdatePathManager _manager;
///
/// 角色仓储
///
private readonly Mock _mockRepository;
///
/// 编号
///
private readonly Guid _id = "10000001-AAF2-4D03-9310-FEF2F47B9FE2".ToGuid();
///
/// 编号2
///
private readonly Guid _id2 = "10000002-AAF2-4D03-9310-FEF2F47B9FE2".ToGuid();
///
/// 编号3
///
private readonly Guid _id3 = "10000003-AAF2-4D03-9310-FEF2F47B9FE2".ToGuid();
///
/// 编号4
///
private readonly Guid _id4 = "10000004-AAF2-4D03-9310-FEF2F47B9FE2".ToGuid();
///
/// 编号5
///
private readonly Guid _id5 = "10000005-AAF2-4D03-9310-FEF2F47B9FE2".ToGuid();
///
/// 测试初始化
///
public UpdatePathManagerTest() {
_mockRepository = new Mock();
_manager = new UpdatePathManager( _mockRepository.Object );
}
///
/// 修改父节点 - 数据库中未找到 - Path无变化
///
[Fact]
public async Task TestUpdatePathAsync_1() {
//设置
string path = $"{_id},";
_mockRepository.Setup( t => t.FindByIdAsync( _id, It.IsAny() ) ).Returns( Task.FromResult( null ) );
//执行
Role role = new Role( _id, path, 0 ) { ParentId = _id2 };
await _manager.UpdatePathAsync( role );
//验证
_mockRepository.Verify( t => t.GetAllChildrenAsync( role ), Times.Never );
Assert.Equal( path, role.Path );
}
///
/// 修改父节点 - 父节点未修改 - Path无变化
///
[Fact]
public async Task TestUpdatePathAsync_2() {
//设置
string path = $"{_id2},{_id},";
_mockRepository.Setup( t => t.FindByIdAsync( _id, It.IsAny() ) ).ReturnsAsync( new Role( _id, path, 2 ) { ParentId = _id2 } );
//执行
Role role = new Role( _id, path, 2 ) { ParentId = _id2 };
await _manager.UpdatePathAsync( role );
//验证
_mockRepository.Verify(t => t.GetAllChildrenAsync( role ),Times.Never );
Assert.Equal( path, role.Path );
}
///
/// 修改父节点 - 父节点已修改 - 无下级子节点
///
[Fact]
public async Task TestUpdatePathAsync_3() {
//设置
string path = $"{_id2},{_id},";
var old = new Role( _id, path, 2 ) { ParentId = _id2 };
_mockRepository.Setup( t => t.FindByIdAsync( _id, It.IsAny() ) ).ReturnsAsync( old );
_mockRepository.Setup( t => t.FindByIdAsync( _id3, It.IsAny() ) ).ReturnsAsync( new Role( _id3, $"{_id3},", 1 ) );
var list = new List { };
_mockRepository.Setup( t => t.GetAllChildrenAsync( old ) ).ReturnsAsync( list );
//执行
Role role = new Role( _id, path, 2 ) { ParentId = _id3 };
await _manager.UpdatePathAsync( role );
//验证
Assert.Equal( $"{_id3},{_id},", role.Path );
Assert.Equal( 2, role.Level );
}
///
/// 修改父节点 - 父节点已修改 - 下级1个子节点
///
[Fact]
public async Task TestUpdatePathAsync_4() {
//设置
string path = $"{_id2},{_id},";
var old = new Role( _id, path, 2 ) { ParentId = _id2 };
var child = new Role( _id4, $"{path},{_id4}", 3 ) { ParentId = _id };
_mockRepository.Setup( t => t.FindByIdAsync( _id, It.IsAny() ) ).ReturnsAsync( old );
_mockRepository.Setup( t => t.FindByIdAsync( _id3, It.IsAny() ) ).ReturnsAsync( new Role( _id3, $"{_id3},", 1 ) );
var list = new List { child };
_mockRepository.Setup( t => t.GetAllChildrenAsync( old ) ).ReturnsAsync( list );
//执行
Role role = new Role( _id, path, 2 ) { ParentId = _id3 };
await _manager.UpdatePathAsync( role );
//验证
Assert.Equal( $"{_id3},{_id},", role.Path );
Assert.Equal( $"{_id3},{_id},{_id4},", list[0].Path );
}
///
/// 修改父节点 - 父节点已修改 - 直接下级2个子节点
///
[Fact]
public async Task TestUpdatePathAsync_5() {
//设置
string path = $"{_id2},{_id},";
var old = new Role( _id, path, 2 ) { ParentId = _id2 };
var child1 = new Role( _id4, $"{path},{_id4}", 3 ) { ParentId = _id };
var child2 = new Role( _id5, $"{path},{_id5}", 3 ) { ParentId = _id };
_mockRepository.Setup( t => t.FindByIdAsync( _id, It.IsAny() ) ).ReturnsAsync( old );
_mockRepository.Setup( t => t.FindByIdAsync( _id3, It.IsAny() ) ).ReturnsAsync( new Role( _id3, $"{_id3},", 1 ) );
var list = new List { child1, child2 };
_mockRepository.Setup( t => t.GetAllChildrenAsync( old ) ).ReturnsAsync( list );
//执行
Role role = new Role( _id, path, 2 ) { ParentId = _id3 };
await _manager.UpdatePathAsync( role );
//验证
Assert.Equal( $"{_id3},{_id},", role.Path );
Assert.Equal( $"{_id3},{_id},{_id4},", list[0].Path );
Assert.Equal( $"{_id3},{_id},{_id5},", list[1].Path );
}
///
/// 修改父节点 - 父节点已修改 - 下级2层子节点
///
[Fact]
public async Task TestUpdatePathAsync_6() {
//设置
string path = $"{_id2},{_id},";
var old = new Role( _id, path, 2 ) { ParentId = _id2 };
var child1 = new Role( _id4, $"{path},{_id4}", 3 ) { ParentId = _id };
var child2 = new Role( _id5, $"{path},{_id4},{_id5}", 4 ) { ParentId = _id4 };
_mockRepository.Setup( t => t.FindByIdAsync( _id, It.IsAny() ) ).ReturnsAsync( old );
_mockRepository.Setup( t => t.FindByIdAsync( _id3, It.IsAny() ) ).ReturnsAsync( new Role( _id3, $"{_id3},", 1 ) );
var list = new List { child1, child2 };
_mockRepository.Setup( t => t.GetAllChildrenAsync( old ) ).ReturnsAsync( list );
//执行
Role role = new Role( _id, path, 2 ) { ParentId = _id3 };
await _manager.UpdatePathAsync( role );
//验证
Assert.Equal( $"{_id3},{_id},", role.Path );
Assert.Equal( $"{_id3},{_id},{_id4},", list[0].Path );
Assert.Equal( $"{_id3},{_id},{_id4},{_id5},", list[1].Path );
}
///
/// 修改父节点 - 将父节点移动到子节点下
///
[Fact]
public async Task TestUpdatePathAsync_7() {
//设置
string path = $"{_id},";
var old = new Role( _id, path, 1 );
var child = new Role( _id2, $"{_id},{_id2},", 2 ) { ParentId = _id };
_mockRepository.Setup( t => t.FindByIdAsync( _id, It.IsAny() ) ).ReturnsAsync( old );
var list = new List { child };
_mockRepository.Setup( t => t.GetAllChildrenAsync( old ) ).ReturnsAsync( list );
//执行验证
await AssertHelper.ThrowsAsync( async () => {
Role result = new Role( _id, path, 1 ) { ParentId = _id2 };
await _manager.UpdatePathAsync( result );
}, DomainResource.NotSupportMoveToChildren );
}
///
/// 修改父节点 - 将父节点设置为自己
///
[Fact]
public async Task TestUpdatePathAsync_8() {
//设置
string path = $"{_id},";
var old = new Role( _id, path, 1 );
var child = new Role( _id2, $"{_id},{_id2},", 2 ) { ParentId = _id };
_mockRepository.Setup( t => t.FindByIdAsync( _id, It.IsAny() ) ).ReturnsAsync( old );
var list = new List { child };
_mockRepository.Setup( t => t.GetAllChildrenAsync( old ) ).ReturnsAsync( list );
//执行验证
await AssertHelper.ThrowsAsync( async () => {
Role result = new Role( _id, path, 1 ) { ParentId = _id };
await _manager.UpdatePathAsync( result );
}, DomainResource.NotSupportMoveToChildren );
}
}