Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

AuthenticationTests.cs 8.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177
  1. using AutoMapper;
  2. using Diligent.WebAPI.Business.Interfaces;
  3. using Diligent.WebAPI.Business.Services;
  4. using Diligent.WebAPI.Data.Entities;
  5. using Diligent.WebAPI.Host.DTOs.Customer;
  6. using Diligent.WebAPI.Host.Mapper;
  7. using Diligent.WebAPI.Host.Mediator.Authentication.Commands;
  8. using Diligent.WebAPI.Host.Mediator.Authentication.Handlers;
  9. using Diligent.WebAPI.Host.Mediator.Authentication.Queries;
  10. using Microsoft.AspNetCore.Http;
  11. using Microsoft.AspNetCore.Identity;
  12. using Microsoft.Extensions.Configuration;
  13. using Moq;
  14. namespace Tests
  15. {
  16. [TestFixture]
  17. public class AuthenticationTests
  18. {
  19. private Mock<IAuthenticationService> _authenticationServiceMock;
  20. private IAuthenticationService _authenticationService;
  21. private IMapper _mapper;
  22. private IConfiguration _configuration;
  23. private Mock<ICustomerRepository> _customerServiceMock;
  24. private Mock<UserManager<Customer>> _userManagerMock;
  25. private readonly Customer _customer = new()
  26. {
  27. Id = Guid.NewGuid(),
  28. Email = "user@gmail.com",
  29. FirstName = "User",
  30. LastName = "User",
  31. Notifications = new List<Notification>(),
  32. Roles = new List<Guid> { Guid.NewGuid() },
  33. UserName = "user12"
  34. };
  35. private readonly CustomerCreateDTO _customerCreateDTO = new()
  36. {
  37. Email = "user@gmail.com",
  38. FirstName = "User",
  39. LastName = "User",
  40. Username = "user12"
  41. };
  42. [SetUp]
  43. public void Setup()
  44. {
  45. var inMemorySettings = new Dictionary<string, string> {
  46. {"JwtSettings:jwtSecret", "Ovo je neka sifra koja treba biti tajna"},
  47. {"JwtSettings:validIssuer", "http://localhost:5116"},
  48. {"JwtSettings:validAudience", "http://localhost:3000"},
  49. };
  50. _configuration = new ConfigurationBuilder()
  51. .AddInMemoryCollection(inMemorySettings)
  52. .Build();
  53. _authenticationServiceMock = new Mock<IAuthenticationService>();
  54. _customerServiceMock = new Mock<ICustomerRepository>();
  55. _userManagerMock = new Mock<UserManager<Customer>>(Mock.Of<IUserStore<Customer>>(), null, null, null, null, null, null, null, null);
  56. _authenticationService = new AuthenticationService(_userManagerMock.Object, _configuration);
  57. var configuration = new MapperConfiguration(cfg => cfg.AddProfile(new CustomerMappingProfile()));
  58. _mapper = new Mapper(configuration);
  59. }
  60. //Tests for authentication handler
  61. [Test]
  62. public void LoginUser_UserIsNotAuthenticated_ThrowBadHttpRequestException()
  63. {
  64. _authenticationServiceMock.Setup(a => a.ValidateCustomer(It.IsAny<string>(), It.IsAny<string>())).Returns(Task.FromResult(false));
  65. var query = new LoginUserQuery(new CustomerLoginDTO { Username = "user1", Password = "somePassword" });
  66. var handler = new LoginUserHandler(_userManagerMock.Object, _authenticationServiceMock.Object, _mapper, _customerServiceMock.Object);
  67. Assert.That(async () => await handler.Handle(query, new CancellationToken()), Throws.Exception.TypeOf<BadHttpRequestException>());
  68. }
  69. [Test]
  70. public async Task LoginUser_UserIsAuthenticated_ReturnUserObject()
  71. {
  72. var list = new List<string> { "Customer" };
  73. _authenticationServiceMock.Setup(a => a.ValidateCustomer(It.IsAny<string>(), It.IsAny<string>())).Returns(Task.FromResult(true));
  74. _authenticationServiceMock.Setup(a => a.GenerateToken()).Returns(Task.FromResult("someToken"));
  75. _customerServiceMock.Setup(c => c.GetCustomer(It.IsAny<string>())).Returns(Task.FromResult(_customer));
  76. _userManagerMock.Setup(u => u.GetRolesAsync(It.IsAny<Customer>())).Returns(Task.FromResult((IList<string>)list));
  77. var query = new LoginUserQuery(new CustomerLoginDTO { Username = "user1", Password = "somePassword" });
  78. var handler = new LoginUserHandler(_userManagerMock.Object, _authenticationServiceMock.Object, _mapper, _customerServiceMock.Object);
  79. var result = await handler.Handle(query, new CancellationToken());
  80. Assert.That(result.Id, Is.EqualTo(_customer.Id.ToString()));
  81. }
  82. [Test]
  83. public void RegisterUser_ErrorWhenCreatingUser_ThrowBadHttpRequestException()
  84. {
  85. _userManagerMock.Setup(u => u.CreateAsync(It.IsAny<Customer>(), It.IsAny<string>())).ReturnsAsync(() => IdentityResult.Failed());
  86. var command = new RegisterUserCommand(_customerCreateDTO);
  87. var handler = new RegisterUserHandler(_userManagerMock.Object, _authenticationServiceMock.Object, _mapper);
  88. Assert.That(() => handler.Handle(command, new CancellationToken()), Throws.Exception.TypeOf<BadHttpRequestException>());
  89. }
  90. [Test]
  91. public async Task RegisterUser_ThereIsNoError_ReturnObject()
  92. {
  93. _userManagerMock.Setup(u => u.CreateAsync(It.IsAny<Customer>(), It.IsAny<string>())).ReturnsAsync(() => IdentityResult.Success);
  94. _userManagerMock.Setup(u => u.AddToRoleAsync(It.IsAny<Customer>(), It.IsAny<string>())).ReturnsAsync(() => IdentityResult.Success);
  95. _authenticationServiceMock.Setup(u => u.ValidateCustomer(It.IsAny<string>(), It.IsAny<string>())).Returns(Task.FromResult(true));
  96. _authenticationServiceMock.Setup(u => u.GenerateToken()).Returns(Task.FromResult("dasdada"));
  97. _userManagerMock.Setup(u => u.GetRolesAsync(It.IsAny<Customer>())).Returns(Task.FromResult((IList<string>)new List<string> { "role" }));
  98. var command = new RegisterUserCommand(_customerCreateDTO);
  99. var handler = new RegisterUserHandler(_userManagerMock.Object, _authenticationServiceMock.Object, _mapper);
  100. var result = await handler.Handle(command, new CancellationToken());
  101. Assert.That(result, Is.Not.Null);
  102. }
  103. //Tests for authentication service
  104. [Test]
  105. public async Task ValidateCustomer_CustomerIsNull_CustomerIsNotValid()
  106. {
  107. _userManagerMock.Setup(u => u.FindByNameAsync(It.IsAny<string>())).Returns(Task.FromResult<Customer>(null));
  108. await _authenticationServiceMock.Object.ValidateCustomer("dasdas", "dasdasd");
  109. var result = await _authenticationService.ValidateCustomer(It.IsAny<string>(), It.IsAny<string>());
  110. Assert.That(result, Is.False);
  111. }
  112. [Test]
  113. public async Task ValidateCustomer_CustomerIsNotNullAndUserCredentialsAreNotValid_CustomerIsNotValid()
  114. {
  115. _userManagerMock.Setup(u => u.FindByNameAsync(It.IsAny<string>())).Returns(Task.FromResult(_customer));
  116. _userManagerMock.Setup(u => u.CheckPasswordAsync(It.IsAny<Customer>(), It.IsAny<string>())).Returns(Task.FromResult(false));
  117. await _authenticationServiceMock.Object.ValidateCustomer("dasdas", "dasdasd");
  118. var result = await _authenticationService.ValidateCustomer(It.IsAny<string>(), It.IsAny<string>());
  119. Assert.That(result, Is.False);
  120. }
  121. [Test]
  122. public async Task ValidateCustomer_CustomerIsNotNullAndUserCredentialsAreValid_CustomerIsValid()
  123. {
  124. _userManagerMock.Setup(u => u.FindByNameAsync(It.IsAny<string>())).Returns(Task.FromResult(_customer));
  125. _userManagerMock.Setup(u => u.CheckPasswordAsync(It.IsAny<Customer>(), It.IsAny<string>())).Returns(Task.FromResult(true));
  126. var result = await _authenticationService.ValidateCustomer("dasdasd", "dasdasd");
  127. Assert.That(result, Is.True);
  128. }
  129. [Test]
  130. public async Task GenerateToken_UserIsNotValid_ReturnNull()
  131. {
  132. _userManagerMock.Setup(u => u.GetRolesAsync(It.IsAny<Customer>())).ReturnsAsync((IList<string>)new List<string> { "roles" });
  133. var result = await _authenticationService.GenerateToken();
  134. Assert.That(result, Is.Null);
  135. }
  136. [Test]
  137. public async Task GenerateToken_UserIsValid_ReturnToken()
  138. {
  139. _userManagerMock.Setup(u => u.GetRolesAsync(It.IsAny<Customer>())).ReturnsAsync((IList<string>)new List<string> { "roles" });
  140. _userManagerMock.Setup(u => u.FindByNameAsync(It.IsAny<string>())).Returns(Task.FromResult(_customer));
  141. _userManagerMock.Setup(u => u.CheckPasswordAsync(It.IsAny<Customer>(), It.IsAny<string>())).Returns(Task.FromResult(true));
  142. await _authenticationService.ValidateCustomer("dasdas", "dasd"); //user must be first valid and then we generate token for him
  143. var result = await _authenticationService.GenerateToken();
  144. Assert.That(result, Is.Not.Null);
  145. }
  146. }
  147. }