public async Task AddPermissionType_PermissionTypeDoesNotExist_Should_SavePermissionType()
    {
        // Arrange
        var unitOfWorkMock = new Mock <IUnitOfWork>();
        var permissionTypeRepositoryMock = new Mock <IPermissionTypeRepository>();
        var mapperMock = new Mock <IMapper>();

        var service = new PermissionTypeService(unitOfWorkMock.Object, mapperMock.Object);

        var permissionType = new PermissionTypeDto {
        };

        permissionTypeRepositoryMock.Setup(x => x.ExistAsync(It.IsAny <Expression <Func <PermissionType, bool> > >()))
        .ReturnsAsync(false);

        unitOfWorkMock.Setup(x => x.PermissionTypeRepository)
        .Returns(permissionTypeRepositoryMock.Object);

        // Act
        await service.AddPermissionType(permissionType);

        // Assert
        permissionTypeRepositoryMock.Verify(x => x.AddAsync(It.IsAny <PermissionType>()));
        unitOfWorkMock.Verify(x => x.SaveAsync());
    }
    public async Task DeletePermissionType_PermissionTypeFound_Should_DeletePermissionType()
    {
        // Arrange
        var       unitOfWorkMock = new Mock <IUnitOfWork>();
        var       permissionTypeRepositoryMock = new Mock <IPermissionTypeRepository>();
        var       mapperMock       = new Mock <IMapper>();
        const int permissionTypeId = 1;

        var permissionType = new PermissionType();

        var service = new PermissionTypeService(unitOfWorkMock.Object, mapperMock.Object);

        permissionTypeRepositoryMock.Setup(v => v.ExistAsync(It.IsAny <Expression <Func <PermissionType, bool> > >()))
        .ReturnsAsync(true);

        permissionTypeRepositoryMock.Setup(x => x.GetByIdAsync(permissionTypeId, It.IsAny <IEnumerable <string> >()))
        .ReturnsAsync(permissionType);

        unitOfWorkMock.Setup(v => v.PermissionTypeRepository)
        .Returns(permissionTypeRepositoryMock.Object);

        // Act
        await service.DeletePermissionType(permissionTypeId);

        // Assert
        permissionTypeRepositoryMock.Verify(x => x.DeleteAsync(permissionType));
        unitOfWorkMock.Verify(x => x.SaveAsync());
    }
    public void GetPermissionType_PermissionTypeNotFound_Should_ThrowsNotFoundException()
    {
        // Arrange
        var unitOfWorkMock = new Mock <IUnitOfWork>();
        var permissionTypeRepositoryMock = new Mock <IPermissionTypeRepository>();

        var service = new PermissionTypeService(unitOfWorkMock.Object, null);

        permissionTypeRepositoryMock.Setup(v => v.ExistAsync(It.IsAny <Expression <Func <PermissionType, bool> > >()))
        .ReturnsAsync(false);

        unitOfWorkMock.Setup(v => v.PermissionTypeRepository)
        .Returns(permissionTypeRepositoryMock.Object);

        // Act => Assert
        Assert.ThrowsAsync <NotFoundException>(() => service.GetPermissionType(1), "The permission type doesn't exist.");
    }
    public void AddPermissionType_PermissionTypeAlreadyExist_Should_ThrowsConflictException()
    {
        // Arrange
        var unitOfWorkMock = new Mock <IUnitOfWork>();
        var permissionTypeRepositoryMock = new Mock <IPermissionTypeRepository>();

        var service = new PermissionTypeService(unitOfWorkMock.Object, null);

        var permissionType = new PermissionTypeDto {
        };

        permissionTypeRepositoryMock.Setup(x => x.ExistAsync(It.IsAny <Expression <Func <PermissionType, bool> > >()))
        .ReturnsAsync(true);

        unitOfWorkMock.Setup(x => x.PermissionTypeRepository)
        .Returns(permissionTypeRepositoryMock.Object);

        // Act => Assert
        Assert.ThrowsAsync <ConflictException>(() => service.AddPermissionType(permissionType), "The permission type already exist.");
    }
    public async Task UpdatePermissionType_PermissionTypeFound_Should_UpdateAndSaveChanges()
    {
        // Arrange
        var unitOfWorkMock = new Mock <IUnitOfWork>();
        var permissionTypeRepositoryMock = new Mock <IPermissionTypeRepository>();
        var mapperMock = new Mock <IMapper>();

        var service = new PermissionTypeService(unitOfWorkMock.Object, mapperMock.Object);

        permissionTypeRepositoryMock.Setup(v => v.ExistAsync(It.IsAny <Expression <Func <PermissionType, bool> > >()))
        .ReturnsAsync(true);

        unitOfWorkMock.Setup(v => v.PermissionTypeRepository)
        .Returns(permissionTypeRepositoryMock.Object);

        var permissionType = new PermissionTypeDto();

        // Act
        await service.UpdatePermissionType(permissionType);

        // Assert
        permissionTypeRepositoryMock.Verify(x => x.UpdateAsync(It.IsAny <PermissionType>()));
        unitOfWorkMock.Verify(x => x.SaveAsync());
    }
    public async Task GetPermissionType_PermissionTypeFound_Should_ReturnsPermissionType()
    {
        // Arrange
        var       unitOfWorkMock           = new Mock <IUnitOfWork>();
        var       permissionRepositoryMock = new Mock <IPermissionTypeRepository>();
        var       mapperMock       = new Mock <IMapper>();
        const int permissionTypeId = 1;

        var permission = new PermissionType
        {
            Id          = permissionTypeId,
            Description = "PermissionType1"
        };

        var permissionTypeDto = new PermissionTypeDto();

        var service = new PermissionTypeService(unitOfWorkMock.Object, mapperMock.Object);

        permissionRepositoryMock.Setup(v => v.ExistAsync(It.IsAny <Expression <Func <PermissionType, bool> > >()))
        .ReturnsAsync(true);

        permissionRepositoryMock.Setup(x => x.GetByIdAsync(permissionTypeId, It.IsAny <IEnumerable <string> >()))
        .ReturnsAsync(permission);

        mapperMock.Setup(x => x.Map <PermissionTypeDto>(permission))
        .Returns(permissionTypeDto);

        unitOfWorkMock.Setup(v => v.PermissionTypeRepository)
        .Returns(permissionRepositoryMock.Object);

        // Act
        var result = await service.GetPermissionType(permissionTypeId);

        // Assert
        Assert.AreEqual(permissionTypeDto, result);
    }