Browse Source

Added unit tests.

pull/113/head
Halil İbrahim Kalkan 9 years ago
parent
commit
0d88992089
  1. 3
      src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IIdentityUserAppService.cs
  2. 7
      src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserCreateOrUpdateDto.cs
  3. 9
      src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserRoleInfoDto.cs
  4. 22
      src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs
  5. 10
      src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EfCoreIdentityUserRepository.cs
  6. 1
      src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityRole.cs
  7. 10
      src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUser.cs
  8. 29
      src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserManager.cs
  9. 18
      test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs
  10. 50
      test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs

3
src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IIdentityUserAppService.cs

@ -1,4 +1,5 @@
using System;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services;
@ -6,6 +7,6 @@ namespace Volo.Abp.Identity
{
public interface IIdentityUserAppService : IAsyncCrudAppService<IdentityUserDto, Guid, PagedAndSortedResultRequestDto, IdentityUserCreateDto, IdentityUserUpdateDto>
{
}
}

7
src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserCreateOrUpdateDto.cs

@ -1,4 +1,6 @@
namespace Volo.Abp.Identity
using JetBrains.Annotations;
namespace Volo.Abp.Identity
{
public abstract class IdentityUserCreateOrUpdateDtoBase
{
@ -11,5 +13,8 @@
public bool TwoFactorEnabled { get; set; } //TODO: Optional?
public bool LockoutEnabled { get; set; } //TODO: Optional?
[CanBeNull]
public string[] Roles { get; set; }
}
}

9
src/Volo.Abp.Identity.Application.Contracts/Volo/Abp/Identity/IdentityUserRoleInfoDto.cs

@ -0,0 +1,9 @@
using Volo.Abp.Application.Dtos;
namespace Volo.Abp.Identity
{
public class IdentityUserRoleInfoDto : EntityDto
{
public string Name { get; set; }
}
}

22
src/Volo.Abp.Identity.Application/Volo/Abp/Identity/IdentityUserAppService.cs

@ -28,19 +28,20 @@ namespace Volo.Abp.Identity
public async Task<PagedResultDto<IdentityUserDto>> GetListAsync(PagedAndSortedResultRequestDto input)
{
var userCount = (int) await _userRepository.GetCountAsync();
var userDtos = ObjectMapper.Map<List<IdentityUser>, List<IdentityUserDto>>(
await _userRepository.GetListAsync(input.Sorting, input.MaxResultCount, input.SkipCount)
);
var userCount = (int)await _userRepository.GetCountAsync();
var users = await _userRepository.GetListAsync(input.Sorting, input.MaxResultCount, input.SkipCount);
return new PagedResultDto<IdentityUserDto>(userCount, userDtos);
return new PagedResultDto<IdentityUserDto>(
userCount,
ObjectMapper.Map<List<IdentityUser>, List<IdentityUserDto>>(users)
);
}
public async Task<IdentityUserDto> CreateAsync(IdentityUserCreateDto input)
{
var user = new IdentityUser(GuidGenerator.Create(), input.UserName);
await UpdateUserProperties(input, user);
await UpdateUserByInput(user, input);
await _userManager.AddPasswordAsync(user, input.Password);
await _userManager.CreateAsync(user);
await CurrentUnitOfWork.SaveChangesAsync();
@ -53,7 +54,7 @@ namespace Volo.Abp.Identity
var user = await _userManager.GetByIdAsync(id);
await _userManager.SetUserNameAsync(user, input.UserName);
await UpdateUserProperties(input, user);
await UpdateUserByInput(user, input);
await _userManager.UpdateAsync(user);
await CurrentUnitOfWork.SaveChangesAsync();
@ -66,12 +67,17 @@ namespace Volo.Abp.Identity
await _userManager.DeleteAsync(user);
}
private async Task UpdateUserProperties(IdentityUserCreateOrUpdateDtoBase input, IdentityUser user)
private async Task UpdateUserByInput(IdentityUser user, IdentityUserCreateOrUpdateDtoBase input)
{
await _userManager.SetEmailAsync(user, input.Email);
await _userManager.SetPhoneNumberAsync(user, input.PhoneNumber);
await _userManager.SetTwoFactorEnabledAsync(user, input.TwoFactorEnabled);
await _userManager.SetLockoutEnabledAsync(user, input.LockoutEnabled);
if (input.Roles != null)
{
await _userManager.SetRolesAsync(user, input.Roles);
}
}
}
}

10
src/Volo.Abp.Identity.EntityFrameworkCore/Volo/Abp/Identity/EfCoreIdentityUserRepository.cs

@ -14,7 +14,7 @@ namespace Volo.Abp.Identity
{
public class EfCoreIdentityUserRepository : EfCoreRepository<IdentityDbContext, IdentityUser>, IIdentityUserRepository
{
public EfCoreIdentityUserRepository(IDbContextProvider<IdentityDbContext> dbContextProvider)
public EfCoreIdentityUserRepository(IDbContextProvider<IdentityDbContext> dbContextProvider)
: base(dbContextProvider)
{
}
@ -71,16 +71,16 @@ namespace Volo.Abp.Identity
}
var query = from userrole in DbContext.UserRoles
join user in DbContext.Users on userrole.UserId equals user.Id
where userrole.RoleId.Equals(role.Id)
select user;
join user in DbContext.Users on userrole.UserId equals user.Id
where userrole.RoleId.Equals(role.Id)
select user;
return await query.ToListAsync(cancellationToken);
}
public async Task<List<IdentityUser>> GetListAsync(string sorting, int maxResultCount, int skipCount)
{
return await this.OrderBy(sorting ?? "UserName").PageBy(skipCount, maxResultCount).ToListAsync();
return await this.OrderBy(sorting ?? nameof(IdentityUser.UserName)).PageBy(skipCount, maxResultCount).ToListAsync();
}
}
}

1
src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityRole.cs

@ -52,6 +52,7 @@ namespace Volo.Abp.Identity
Id = id;
Name = name;
NormalizedName = name.ToUpperInvariant();
ConcurrencyStamp = Guid.NewGuid().ToString();
Claims = new Collection<IdentityRoleClaim>();

10
src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUser.cs

@ -101,8 +101,7 @@ namespace Volo.Abp.Identity
/// <summary>
/// Navigation property for the roles this user belongs to.
/// </summary>
public virtual IReadOnlyList<IdentityUserRole> Roles => RolesCollection;
protected virtual List<IdentityUserRole> RolesCollection { get; set; }
public virtual ICollection<IdentityUserRole> Roles { get; protected set; }
/// <summary>
/// Navigation property for the claims this user possesses.
@ -130,9 +129,10 @@ namespace Volo.Abp.Identity
Id = id;
UserName = userName;
NormalizedUserName = userName.ToUpperInvariant();
ConcurrencyStamp = Guid.NewGuid().ToString();
RolesCollection = new List<IdentityUserRole>();
Roles = new Collection<IdentityUserRole>();
Claims = new Collection<IdentityUserClaim>();
Logins = new Collection<IdentityUserLogin>();
Tokens = new Collection<IdentityUserToken>();
@ -147,7 +147,7 @@ namespace Volo.Abp.Identity
return;
}
RolesCollection.Add(new IdentityUserRole(guidGenerator.Create(), Id, roleId));
Roles.Add(new IdentityUserRole(guidGenerator.Create(), Id, roleId));
}
public void RemoveRole(Guid roleId)
@ -159,7 +159,7 @@ namespace Volo.Abp.Identity
return;
}
RolesCollection.RemoveAll(r => r.RoleId == roleId);
Roles.RemoveAll(r => r.RoleId == roleId);
}
public bool IsInRole(Guid roleId)

29
src/Volo.Abp.Identity/Volo/Abp/Identity/IdentityUserManager.cs

@ -1,6 +1,8 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options;
@ -21,14 +23,14 @@ namespace Volo.Abp.Identity
IServiceProvider services,
ILogger<IdentityUserManager> logger)
: base(
store,
optionsAccessor,
passwordHasher,
userValidators,
passwordValidators,
keyNormalizer,
errors,
services,
store,
optionsAccessor,
passwordHasher,
userValidators,
passwordValidators,
keyNormalizer,
errors,
services,
logger)
{
@ -44,5 +46,16 @@ namespace Volo.Abp.Identity
return user;
}
public async Task SetRolesAsync([NotNull] IdentityUser user, [NotNull] string[] roleNames)
{
Check.NotNull(user, nameof(user));
Check.NotNull(roleNames, nameof(roleNames));
var currentRoleNames = await GetRolesAsync(user);
await RemoveFromRolesAsync(user, currentRoleNames.Except(roleNames));
await AddToRolesAsync(user, roleNames.Except(currentRoleNames));
}
}
}

18
test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/AbpIdentityTestDataBuilder.cs

@ -7,16 +7,32 @@ namespace Volo.Abp.Identity
{
private readonly IGuidGenerator _guidGenerator;
private readonly IIdentityUserRepository _userRepository;
private readonly IIdentityRoleRepository _roleRepository;
public AbpIdentityTestDataBuilder(
IGuidGenerator guidGenerator,
IIdentityUserRepository userRepository)
IIdentityUserRepository userRepository,
IIdentityRoleRepository roleRepository)
{
_guidGenerator = guidGenerator;
_userRepository = userRepository;
_roleRepository = roleRepository;
}
public void Build()
{
AddRoles();
AddUsers();
}
private void AddRoles()
{
_roleRepository.Insert(new IdentityRole(_guidGenerator.Create(), "admin"));
_roleRepository.Insert(new IdentityRole(_guidGenerator.Create(), "moderator"));
_roleRepository.Insert(new IdentityRole(_guidGenerator.Create(), "supporter"));
}
private void AddUsers()
{
_userRepository.Insert(new IdentityUser(_guidGenerator.Create(), "john.nash"));
}

50
test/Volo.Abp.Identity.Application.Tests/Volo/Abp/Identity/IdentityUserAppService_Tests.cs

@ -20,10 +20,35 @@ namespace Volo.Abp.Identity
_userRepository = ServiceProvider.GetRequiredService<IRepository<IdentityUser>>();
}
[Fact]
public async Task GetAsync()
{
//Arrange
var johnNash = await GetUserAsync("john.nash");
//Act
var result = await _identityUserAppService.GetAsync(johnNash.Id);
//Assert
result.Id.ShouldBe(johnNash.Id);
result.UserName.ShouldBe(johnNash.UserName);
result.Email.ShouldBe(johnNash.Email);
result.LockoutEnabled.ShouldBe(johnNash.LockoutEnabled);
result.PhoneNumber.ShouldBe(johnNash.PhoneNumber);
}
[Fact]
public async Task GetListAsync()
{
//Act
var result = await _identityUserAppService.GetListAsync(new PagedAndSortedResultRequestDto());
//Assert
result.TotalCount.ShouldBeGreaterThan(0);
result.Items.Count.ShouldBeGreaterThan(0);
}
@ -39,7 +64,8 @@ namespace Volo.Abp.Identity
Email = CreateRandomEmail(),
LockoutEnabled = true,
PhoneNumber = CreateRandomPhoneNumber(),
Password = "123qwe"
Password = "123qwe",
Roles = new[] {"moderator"}
};
//Act
@ -78,7 +104,6 @@ namespace Volo.Abp.Identity
Email = CreateRandomEmail()
};
//Act
var result = await _identityUserAppService.UpdateAsync(johnNash.Id, input);
@ -99,11 +124,32 @@ namespace Volo.Abp.Identity
user.PhoneNumber.ShouldBe(input.PhoneNumber);
}
[Fact]
public async Task DeleteAsync()
{
//Arrange
var johnNash = await GetUserAsync("john.nash");
//Act
await _identityUserAppService.DeleteAsync(johnNash.Id);
//Assert
(await FindUserAsync("john.nash")).ShouldBeNull();
}
private async Task<IdentityUser> GetUserAsync(string userName)
{
return (await _userRepository.GetListAsync()).First(u => u.UserName == userName);
}
private async Task<IdentityUser> FindUserAsync(string userName)
{
return (await _userRepository.GetListAsync()).FirstOrDefault(u => u.UserName == userName);
}
private static string CreateRandomEmail()
{
return Guid.NewGuid().ToString("N").Left(16) + "@abp.io";

Loading…
Cancel
Save