using AutoMapper; using Diligent.WebAPI.Business.MappingProfiles; using Diligent.WebAPI.Business.Services; using Diligent.WebAPI.Business.Settings; using Diligent.WebAPI.Contracts.DTOs; using Diligent.WebAPI.Contracts.DTOs.User; using Diligent.WebAPI.Contracts.Exceptions; using Diligent.WebAPI.Data; using Diligent.WebAPI.Data.Entities; using Microsoft.AspNetCore.Identity; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Microsoft.Extensions.Options; using NSubstitute; namespace Diligent.WebAPI.Tests.Services { public class UserServiceTests { private readonly List _users; private readonly User _user; private readonly IMapper _mapper; private readonly IUserStore _mockStore; private readonly UserManager _mockUserManager; private readonly ILogger _logger; public UserServiceTests() { _mockStore = Substitute.For>(); _mockUserManager = Substitute.For>(_mockStore, null, null, null, null, null, null, null, null); _logger = Substitute.For>(); _user = new User { Id = 1, PasswordHash = "AQAAAAEAACcQAAAAEJnWVhD/qftzqJq5XOUD0BxEBEwhd7vS46HeDD+9cwEsqO9ev9xEORJVjmFMASUGJg==", FirstName = "Dzenis", LastName = "Dzenis", UserName = "dzenis", NormalizedUserName = "DZENIS", Email = "dzenis@dilig.net", NormalizedEmail = "DZENIS@DILIG.NET", EmailConfirmed = false, IsEnabled = true, AccessFailedCount = 0, SecurityStamp = "2D3XPK2P5MAKO377AWFU3T4ZFFYTSOJX", ConcurrencyStamp = "2D3XPK2P5MAKO377AWFU3T4ZFFYTSOJX", }; _users = new List { _user }; // configure mapper var configuration = new MapperConfiguration(cfg => cfg.AddProfiles( new List { new UserMappingProfile() })); _mapper = new Mapper(configuration); } [Fact] public async Task GetById_ShouldReturnUser() { _mockUserManager.FindByIdAsync(Arg.Any()).Returns(_user); var databaseContext = await Helpers.GetDatabaseContext(_users); var frontSettings = Substitute.For>(); var mailer = Substitute.For(); var service = new UserService(frontSettings, _mockUserManager, _mapper, databaseContext, mailer, _logger); var result = await service.GetById(1); result.Should().Be(_user); } [Fact] public async Task GetByEmail_ShouldReturnUser() { _mockUserManager.FindByEmailAsync(Arg.Any()).Returns(_user); var databaseContext = await Helpers.GetDatabaseContext(_users); var frontSettings = Substitute.For>(); var mailer = Substitute.For(); var service = new UserService(frontSettings, _mockUserManager, _mapper, databaseContext, mailer, _logger); var result = await service.GetByEmail("mail"); result.Should().Be(_user); } [Fact] public async Task RemoveUser_ShouldReturnError() { var databaseContext = await Helpers.GetDatabaseContext(_users); var frontSettings = Substitute.For>(); var mailer = Substitute.For(); var service = new UserService(frontSettings, _mockUserManager, _mapper, databaseContext, mailer, _logger); await service.RemoveUser(_user); await Assert.ThrowsAsync(async () => await service.GetById(2)); } [Fact] public async Task ToggleEnable_ShouldDisableUser() { var databaseContext = await Helpers.GetDatabaseContext(_users); var frontSettings = Substitute.For>(); var mailer = Substitute.For(); var service = new UserService(frontSettings, _mockUserManager, _mapper, databaseContext, mailer, _logger); var result = await service.ToggleEnable(_user); Assert.Equal(false, result); } [Fact] public async Task Invite_ShouldFailIfUserExists() { _mockUserManager.FindByEmailAsync(Arg.Any()).Returns(_user); var databaseContext = await Helpers.GetDatabaseContext(_users); var frontSettings = Substitute.For>(); var mailer = Substitute.For(); var service = new UserService(frontSettings, _mockUserManager, _mapper, databaseContext, mailer, _logger); var result = await service.SendRegistrationLink(new Contracts.DTOs.User.InviteDTO { Email = "string", FirstName = "string", LastName = "string", }); Assert.Equal(true, result.IsError); } } }