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;
using System.Threading.Tasks;
using Volo.Abp.Application.Dtos; using Volo.Abp.Application.Dtos;
using Volo.Abp.Application.Services; using Volo.Abp.Application.Services;
@ -6,6 +7,6 @@ namespace Volo.Abp.Identity
{ {
public interface IIdentityUserAppService : IAsyncCrudAppService<IdentityUserDto, Guid, PagedAndSortedResultRequestDto, IdentityUserCreateDto, IdentityUserUpdateDto> 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 public abstract class IdentityUserCreateOrUpdateDtoBase
{ {
@ -11,5 +13,8 @@
public bool TwoFactorEnabled { get; set; } //TODO: Optional? public bool TwoFactorEnabled { get; set; } //TODO: Optional?
public bool LockoutEnabled { 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) public async Task<PagedResultDto<IdentityUserDto>> GetListAsync(PagedAndSortedResultRequestDto input)
{ {
var userCount = (int) await _userRepository.GetCountAsync(); var userCount = (int)await _userRepository.GetCountAsync();
var userDtos = ObjectMapper.Map<List<IdentityUser>, List<IdentityUserDto>>( var users = await _userRepository.GetListAsync(input.Sorting, input.MaxResultCount, input.SkipCount);
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) public async Task<IdentityUserDto> CreateAsync(IdentityUserCreateDto input)
{ {
var user = new IdentityUser(GuidGenerator.Create(), input.UserName); var user = new IdentityUser(GuidGenerator.Create(), input.UserName);
await UpdateUserProperties(input, user); await UpdateUserByInput(user, input);
await _userManager.AddPasswordAsync(user, input.Password); await _userManager.AddPasswordAsync(user, input.Password);
await _userManager.CreateAsync(user); await _userManager.CreateAsync(user);
await CurrentUnitOfWork.SaveChangesAsync(); await CurrentUnitOfWork.SaveChangesAsync();
@ -53,7 +54,7 @@ namespace Volo.Abp.Identity
var user = await _userManager.GetByIdAsync(id); var user = await _userManager.GetByIdAsync(id);
await _userManager.SetUserNameAsync(user, input.UserName); await _userManager.SetUserNameAsync(user, input.UserName);
await UpdateUserProperties(input, user); await UpdateUserByInput(user, input);
await _userManager.UpdateAsync(user); await _userManager.UpdateAsync(user);
await CurrentUnitOfWork.SaveChangesAsync(); await CurrentUnitOfWork.SaveChangesAsync();
@ -66,12 +67,17 @@ namespace Volo.Abp.Identity
await _userManager.DeleteAsync(user); 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.SetEmailAsync(user, input.Email);
await _userManager.SetPhoneNumberAsync(user, input.PhoneNumber); await _userManager.SetPhoneNumberAsync(user, input.PhoneNumber);
await _userManager.SetTwoFactorEnabledAsync(user, input.TwoFactorEnabled); await _userManager.SetTwoFactorEnabledAsync(user, input.TwoFactorEnabled);
await _userManager.SetLockoutEnabledAsync(user, input.LockoutEnabled); 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 class EfCoreIdentityUserRepository : EfCoreRepository<IdentityDbContext, IdentityUser>, IIdentityUserRepository
{ {
public EfCoreIdentityUserRepository(IDbContextProvider<IdentityDbContext> dbContextProvider) public EfCoreIdentityUserRepository(IDbContextProvider<IdentityDbContext> dbContextProvider)
: base(dbContextProvider) : base(dbContextProvider)
{ {
} }
@ -71,16 +71,16 @@ namespace Volo.Abp.Identity
} }
var query = from userrole in DbContext.UserRoles var query = from userrole in DbContext.UserRoles
join user in DbContext.Users on userrole.UserId equals user.Id join user in DbContext.Users on userrole.UserId equals user.Id
where userrole.RoleId.Equals(role.Id) where userrole.RoleId.Equals(role.Id)
select user; select user;
return await query.ToListAsync(cancellationToken); return await query.ToListAsync(cancellationToken);
} }
public async Task<List<IdentityUser>> GetListAsync(string sorting, int maxResultCount, int skipCount) 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; Id = id;
Name = name; Name = name;
NormalizedName = name.ToUpperInvariant();
ConcurrencyStamp = Guid.NewGuid().ToString(); ConcurrencyStamp = Guid.NewGuid().ToString();
Claims = new Collection<IdentityRoleClaim>(); Claims = new Collection<IdentityRoleClaim>();

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

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

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

@ -1,6 +1,8 @@
using System; using System;
using System.Collections.Generic; using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks; using System.Threading.Tasks;
using JetBrains.Annotations;
using Microsoft.AspNetCore.Identity; using Microsoft.AspNetCore.Identity;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
using Microsoft.Extensions.Options; using Microsoft.Extensions.Options;
@ -21,14 +23,14 @@ namespace Volo.Abp.Identity
IServiceProvider services, IServiceProvider services,
ILogger<IdentityUserManager> logger) ILogger<IdentityUserManager> logger)
: base( : base(
store, store,
optionsAccessor, optionsAccessor,
passwordHasher, passwordHasher,
userValidators, userValidators,
passwordValidators, passwordValidators,
keyNormalizer, keyNormalizer,
errors, errors,
services, services,
logger) logger)
{ {
@ -44,5 +46,16 @@ namespace Volo.Abp.Identity
return user; 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 IGuidGenerator _guidGenerator;
private readonly IIdentityUserRepository _userRepository; private readonly IIdentityUserRepository _userRepository;
private readonly IIdentityRoleRepository _roleRepository;
public AbpIdentityTestDataBuilder( public AbpIdentityTestDataBuilder(
IGuidGenerator guidGenerator, IGuidGenerator guidGenerator,
IIdentityUserRepository userRepository) IIdentityUserRepository userRepository,
IIdentityRoleRepository roleRepository)
{ {
_guidGenerator = guidGenerator; _guidGenerator = guidGenerator;
_userRepository = userRepository; _userRepository = userRepository;
_roleRepository = roleRepository;
} }
public void Build() 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")); _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>>(); _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] [Fact]
public async Task GetListAsync() public async Task GetListAsync()
{ {
//Act
var result = await _identityUserAppService.GetListAsync(new PagedAndSortedResultRequestDto()); var result = await _identityUserAppService.GetListAsync(new PagedAndSortedResultRequestDto());
//Assert
result.TotalCount.ShouldBeGreaterThan(0); result.TotalCount.ShouldBeGreaterThan(0);
result.Items.Count.ShouldBeGreaterThan(0); result.Items.Count.ShouldBeGreaterThan(0);
} }
@ -39,7 +64,8 @@ namespace Volo.Abp.Identity
Email = CreateRandomEmail(), Email = CreateRandomEmail(),
LockoutEnabled = true, LockoutEnabled = true,
PhoneNumber = CreateRandomPhoneNumber(), PhoneNumber = CreateRandomPhoneNumber(),
Password = "123qwe" Password = "123qwe",
Roles = new[] {"moderator"}
}; };
//Act //Act
@ -78,7 +104,6 @@ namespace Volo.Abp.Identity
Email = CreateRandomEmail() Email = CreateRandomEmail()
}; };
//Act //Act
var result = await _identityUserAppService.UpdateAsync(johnNash.Id, input); var result = await _identityUserAppService.UpdateAsync(johnNash.Id, input);
@ -99,11 +124,32 @@ namespace Volo.Abp.Identity
user.PhoneNumber.ShouldBe(input.PhoneNumber); 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) private async Task<IdentityUser> GetUserAsync(string userName)
{ {
return (await _userRepository.GetListAsync()).First(u => u.UserName == 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() private static string CreateRandomEmail()
{ {
return Guid.NewGuid().ToString("N").Left(16) + "@abp.io"; return Guid.NewGuid().ToString("N").Left(16) + "@abp.io";

Loading…
Cancel
Save