Advertisement
Guest User

Untitled

a guest
May 16th, 2019
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 18.09 KB | None | 0 0
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Security.Claims;
  5. using System.Threading.Tasks;
  6. using Confetti.Account.Application.Models;
  7. using Confetti.Account.Infrastructure.Identity.Models;
  8. using Confetti.Common;
  9. using Microsoft.AspNetCore.Identity;
  10. using Moq;
  11. using NUnit.Framework;
  12.  
  13. namespace Confetti.Account.Infrastructure.Tests
  14. {
  15.     [TestFixture]
  16.     public class AccountServiceTests
  17.     {
  18.         #region Utilities
  19.  
  20.         private Task<ActionResult> TryRegisterAsync(
  21.             string email,
  22.             string firstName,
  23.             string lastName,
  24.             string password,
  25.             string confirmPassword,
  26.             Action<Mock<UserManager<ApplicationUser>>> configureMockUserManager = null,
  27.             Action<Mock<RoleManager<IdentityRole>>> configureMockRoleManager = null
  28.         )
  29.         {
  30.             var user = new ApplicationUser()
  31.             {
  32.                 Id = Guid.NewGuid().ToString(),
  33.                 Email = email,
  34.                 FirstName = firstName,
  35.                 LastName = lastName,
  36.                 UserName = email
  37.             };
  38.  
  39.             var mockUserManager = MockHelpers.MockUserManager<ApplicationUser>();
  40.            
  41.             if (configureMockUserManager == null)
  42.             {
  43.                 SetUpMockUserManager(mockUserManager, user, password);
  44.             }
  45.             else
  46.             {
  47.                 configureMockUserManager?.Invoke(mockUserManager);
  48.             }
  49.  
  50.             var mockRoleManager = MockHelpers.MockRoleManager<IdentityRole>();
  51.             configureMockRoleManager?.Invoke(mockRoleManager);
  52.            
  53.             var accountService = MockHelpers.TestAccountService(
  54.                 mockUserManager.Object, mockRoleManager.Object);
  55.  
  56.             var model = new RegisterInputModel()
  57.             {
  58.                 Email = email,
  59.                 FirstName = firstName,
  60.                 LastName = lastName,
  61.                 Password = password,
  62.                 ConfirmPassword = confirmPassword
  63.             };
  64.  
  65.             return accountService.RegisterAsync(model);
  66.         }
  67.  
  68.         private Task<ActionResult> TryValidateCredentialsAsync(
  69.             string email,
  70.             string password,
  71.             Action<Mock<UserManager<ApplicationUser>>> configureMockUserManager = null,
  72.             Action<Mock<RoleManager<IdentityRole>>> configureMockRoleManager = null
  73.         )
  74.         {
  75.             var user = new ApplicationUser()
  76.             {
  77.                 Id = Guid.NewGuid().ToString(),
  78.                 Email = email
  79.             };
  80.  
  81.             var mockUserManager = MockHelpers.MockUserManager<ApplicationUser>();
  82.            
  83.             if (configureMockUserManager == null)
  84.             {
  85.                 SetUpMockUserManager(mockUserManager, user, password);
  86.                 mockUserManager.Setup(um => um.CheckPasswordAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>()))
  87.                     .ReturnsAsync(true);
  88.             }
  89.             else
  90.             {
  91.                 configureMockUserManager?.Invoke(mockUserManager);
  92.             }
  93.  
  94.             var mockRoleManager = MockHelpers.MockRoleManager<IdentityRole>();
  95.             configureMockRoleManager?.Invoke(mockRoleManager);
  96.            
  97.             var accountService = MockHelpers.TestAccountService(
  98.                 mockUserManager.Object, mockRoleManager.Object);
  99.  
  100.             return accountService.ValidateCredentialsAsync(email, password);
  101.         }
  102.  
  103.         private void SetUpMockUserManager(
  104.             Mock<UserManager<ApplicationUser>> mockUserManager,
  105.             ApplicationUser user,
  106.             string password)
  107.         {
  108.             mockUserManager.Setup(um => um.GetUserId(It.IsAny<ClaimsPrincipal>()))
  109.                 .Returns(user.Id);
  110.             mockUserManager.Setup(um => um.GetUserIdAsync(It.IsAny<ApplicationUser>()))
  111.                 .Returns(Task.FromResult(user.Id));
  112.             mockUserManager.Setup(um => um.GetUserName(It.IsAny<ClaimsPrincipal>()))
  113.                 .Returns(user.UserName);
  114.             mockUserManager.Setup(um => um.FindByNameAsync(It.IsAny<string>()))
  115.                 .ReturnsAsync(user);
  116.             mockUserManager.Setup(um => um.GetUserNameAsync(It.IsAny<ApplicationUser>()))
  117.                 .ReturnsAsync(user.UserName);
  118.             mockUserManager.Setup(um => um.GetEmailAsync(It.IsAny<ApplicationUser>()))
  119.                 .ReturnsAsync(user.Email);
  120.             mockUserManager.Setup(um => um.FindByEmailAsync(It.IsAny<string>()))
  121.                 .ReturnsAsync(user);
  122.             mockUserManager.Setup(um => um.CreateAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>()))
  123.                 .ReturnsAsync(ValidateUser(user, mockUserManager.Object, password));
  124.         }
  125.  
  126.         private IdentityResult ValidateUser(
  127.             ApplicationUser user,
  128.             UserManager<ApplicationUser> userManager,
  129.             string password)
  130.         {
  131.             var errors = new List<IdentityError>();
  132.             foreach (var validator in userManager.UserValidators)
  133.             {
  134.                 var result = validator.ValidateAsync(userManager, user)
  135.                     .GetAwaiter()
  136.                     .GetResult();
  137.                 if (!result.Succeeded)
  138.                 {
  139.                     errors.AddRange(result.Errors);
  140.                 }
  141.             }
  142.             foreach (var validator in userManager.PasswordValidators)
  143.             {
  144.                 var result = validator.ValidateAsync(userManager, user, password)
  145.                     .GetAwaiter()
  146.                     .GetResult();
  147.                 if (!result.Succeeded)
  148.                 {
  149.                     errors.AddRange(result.Errors);
  150.                 }
  151.             }
  152.    
  153.             return (errors.Count > 0)
  154.                 ? IdentityResult.Failed(errors.ToArray())
  155.                 : IdentityResult.Success;
  156.         }
  157.            
  158.         #endregion
  159.  
  160.         #region Methods
  161.  
  162.         #region Register Tests
  163.  
  164.         [Test]
  165.         public async Task RegisterTest_Normal()
  166.         {
  167.             var result = await TryRegisterAsync(
  168.                 email: "test@test.ru",
  169.                 firstName: "test",
  170.                 lastName: "test",
  171.                 password: "goodPassword",
  172.                 confirmPassword: "goodPassword"
  173.             );
  174.  
  175.             Assert.IsTrue(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  176.         }
  177.  
  178.         #region Email Tests
  179.            
  180.         [Test]
  181.         public async Task RegisterTest_NullEmail()
  182.         {
  183.             var result = await TryRegisterAsync(
  184.                 email: null,
  185.                 firstName: "test",
  186.                 lastName: "test",
  187.                 password: "goodPassword",
  188.                 confirmPassword: "goodPassword"
  189.             );
  190.  
  191.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  192.         }
  193.  
  194.         [Test]
  195.         public async Task RegisterTest_InvalidEmail()
  196.         {
  197.             var result = await TryRegisterAsync(
  198.                 email: "InvalidEmail",
  199.                 firstName: "test",
  200.                 lastName: "test",
  201.                 password: "goodPassword",
  202.                 confirmPassword: "goodPassword"
  203.             );
  204.  
  205.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  206.         }
  207.        
  208.         [Test]
  209.         public async Task RegisterTest_DuplicateEmail()
  210.         {
  211.             var result = await TryRegisterAsync(
  212.                 email: "test@test.ru",
  213.                 firstName: "test",
  214.                 lastName: "test",
  215.                 password: "goodPassword",
  216.                 confirmPassword: "goodPassword",
  217.                 configureMockUserManager: mockUserManager =>
  218.                 {
  219.                     var userPassword = "goodPassword";
  220.                     var user = new ApplicationUser()
  221.                     {
  222.                         Id = "userId",
  223.                         Email = "test@test.ru",
  224.                         FirstName = "test",
  225.                         LastName = "test"
  226.                     };
  227.                     var anotherUser = new ApplicationUser()
  228.                     {
  229.                         Id = "anotherUserId",
  230.                         Email = "test@test.ru",
  231.                         FirstName = "test",
  232.                         LastName = "test"
  233.                     };
  234.                     mockUserManager.Setup(um => um.GetUserId(It.IsAny<ClaimsPrincipal>()))
  235.                         .Returns(anotherUser.Id);
  236.                     mockUserManager.Setup(um => um.GetUserIdAsync(It.IsAny<ApplicationUser>()))
  237.                         .Returns(Task.FromResult(anotherUser.Id));
  238.                     mockUserManager.Setup(um => um.GetUserName(It.IsAny<ClaimsPrincipal>()))
  239.                         .Returns(user.UserName);
  240.                     mockUserManager.Setup(um => um.FindByNameAsync(It.IsAny<string>()))
  241.                         .ReturnsAsync(user);
  242.                     mockUserManager.Setup(um => um.GetUserNameAsync(It.IsAny<ApplicationUser>()))
  243.                         .ReturnsAsync(user.UserName);
  244.                     mockUserManager.Setup(um => um.GetEmailAsync(It.IsAny<ApplicationUser>()))
  245.                         .ReturnsAsync(anotherUser.Email);
  246.                     mockUserManager.Setup(um => um.FindByEmailAsync(It.IsAny<string>()))
  247.                         .ReturnsAsync(anotherUser);
  248.                     mockUserManager.Setup(um => um.CreateAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>()))
  249.                         .ReturnsAsync(ValidateUser(user, mockUserManager.Object, userPassword));
  250.                 }
  251.             );
  252.  
  253.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  254.         }
  255.  
  256.         #endregion
  257.            
  258.         #region FirstName Tests
  259.            
  260.         [Test]
  261.         public async Task RegisterTest_NullFirstName()
  262.         {
  263.             var result = await TryRegisterAsync(
  264.                 email: "test@test.ru",
  265.                 firstName: null,
  266.                 lastName: "test",
  267.                 password: "goodPassword",
  268.                 confirmPassword: "goodPassword"
  269.             );
  270.  
  271.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  272.         }
  273.  
  274.         [Test]
  275.         public async Task RegisterTest_TooLongFirstName()
  276.         {
  277.             var firstName = string.Empty;
  278.             for (int i = 0; i < 26; i++)
  279.             {
  280.                 firstName += "p";
  281.             }
  282.  
  283.             var result = await TryRegisterAsync(
  284.                 email: "test@test.ru",
  285.                 firstName: firstName,
  286.                 lastName: "test",
  287.                 password: "goodPassword",
  288.                 confirmPassword: "goodPassword"
  289.             );
  290.  
  291.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  292.         }
  293.  
  294.         [Test]
  295.         public async Task RegisterTest_FirstNameInvalidSymbols()
  296.         {
  297.             var result = await TryRegisterAsync(
  298.                 email: "test@test.ru",
  299.                 firstName: "test.>",
  300.                 lastName: "test",
  301.                 password: "goodPassword",
  302.                 confirmPassword: "goodPassword"
  303.             );
  304.  
  305.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  306.         }
  307.        
  308.         #endregion
  309.  
  310.         #region LastName Tests
  311.            
  312.         [Test]
  313.         public async Task RegisterTest_NullLastName()
  314.         {
  315.             var result = await TryRegisterAsync(
  316.                 email: "test@test.ru",
  317.                 firstName: "test",
  318.                 lastName: null,
  319.                 password: "goodPassword",
  320.                 confirmPassword: "goodPassword"
  321.             );
  322.  
  323.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  324.         }
  325.  
  326.         [Test]
  327.         public async Task RegisterTest_TooLongLastName()
  328.         {
  329.             var lastName = string.Empty;
  330.             for (int i = 0; i < 26; i++)
  331.             {
  332.                 lastName += "p";
  333.             }
  334.  
  335.             var result = await TryRegisterAsync(
  336.                 email: "test@test.ru",
  337.                 firstName: "test",
  338.                 lastName: lastName,
  339.                 password: "goodPassword",
  340.                 confirmPassword: "goodPassword"
  341.             );
  342.  
  343.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  344.         }
  345.  
  346.         [Test]
  347.         public async Task RegisterTest_LastNameInvalidSymbols()
  348.         {
  349.             var result = await TryRegisterAsync(
  350.                 email: "test@test.ru",
  351.                 firstName: "test",
  352.                 lastName: "test\"<&",
  353.                 password: "goodPassword",
  354.                 confirmPassword: "goodPassword"
  355.             );
  356.  
  357.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  358.         }
  359.  
  360.         #endregion
  361.  
  362.         #region Password Tests
  363.    
  364.         [Test]
  365.         public async Task RegisterTest_NullPassword()
  366.         {
  367.             var result = await TryRegisterAsync(
  368.                 email: "test@test.ru",
  369.                 firstName: "test",
  370.                 lastName: "test",
  371.                 password: null,
  372.                 confirmPassword: "goodPassword",
  373.                 configureMockUserManager: mockUserManager =>
  374.                 {
  375.                     mockUserManager.Setup(um => um.CreateAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>()))
  376.                         .ReturnsAsync(IdentityResult.Success);
  377.                 }
  378.             );
  379.  
  380.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  381.         }
  382.  
  383.         [Test]
  384.         public async Task RegisterTest_NullConfirmPassword()
  385.         {
  386.             var result = await TryRegisterAsync(
  387.                 email: "test@test.ru",
  388.                 firstName: "test",
  389.                 lastName: "test",
  390.                 password: "goodPassword",
  391.                 confirmPassword: null
  392.             );
  393.  
  394.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  395.         }
  396.  
  397.         [Test]
  398.         public async Task RegisterTest_PasswordNotEqualsConfirmPassword()
  399.         {
  400.             var result = await TryRegisterAsync(
  401.                 email: "test@test.ru",
  402.                 firstName: "test",
  403.                 lastName: "test",
  404.                 password: "goodPassword",
  405.                 confirmPassword: "anotherPassword"
  406.             );
  407.  
  408.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  409.         }
  410.  
  411.         [Test]
  412.         public async Task RegisterTest_SmallPassword()
  413.         {
  414.             var result = await TryRegisterAsync(
  415.                 email: "test@test.ru",
  416.                 firstName: "test",
  417.                 lastName: "test",
  418.                 password: "small",
  419.                 confirmPassword: "small"
  420.             );
  421.  
  422.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  423.         }
  424.  
  425.         [Test]
  426.         public async Task RegisterTest_TooLongPassword()
  427.         {
  428.             var password = string.Empty;
  429.             for (int i = 0; i < 101; i++)
  430.             {
  431.                 password += "p";
  432.             }
  433.  
  434.             var result = await TryRegisterAsync(
  435.                 email: "test@test.ru",
  436.                 firstName: "test",
  437.                 lastName: "test",
  438.                 password: password,
  439.                 confirmPassword: password
  440.             );
  441.  
  442.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  443.         }
  444.            
  445.         #endregion
  446.  
  447.         #endregion
  448.  
  449.         #region Validate credentials Tests
  450.        
  451.         [Test]
  452.         public async Task ValidateCredentialsTest_Normal()
  453.         {
  454.             var result = await TryValidateCredentialsAsync(
  455.                 "test@test.ru",
  456.                 "goodPassword"
  457.             );
  458.  
  459.             Assert.IsTrue(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  460.         }
  461.  
  462.         [Test]
  463.         public async Task ValidateCredentialsTest_NullEmail()
  464.         {
  465.             var result = await TryValidateCredentialsAsync(
  466.                 null,
  467.                 "goodPassword"
  468.             );
  469.  
  470.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  471.         }
  472.  
  473.         [Test]
  474.         public async Task ValidateCredentialsTest_NullPassword()
  475.         {
  476.             var result = await TryValidateCredentialsAsync(
  477.                 "test@test.ru",
  478.                 null,
  479.                 configureMockUserManager: mockUserManager =>
  480.                 {
  481.                     mockUserManager.Setup(um => um.CreateAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>()))
  482.                         .ReturnsAsync(IdentityResult.Success);
  483.                 }
  484.             );
  485.  
  486.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  487.         }
  488.  
  489.         [Test]
  490.         public async Task ValidateCredentialsTest_UserNotFound()
  491.         {
  492.             var result = await TryValidateCredentialsAsync(
  493.                 "test@test.ru",
  494.                 "goodPassword",
  495.                 configureMockUserManager: mockUserManager =>
  496.                 {
  497.                     mockUserManager.Setup(um => um.FindByEmailAsync(It.IsAny<string>()))
  498.                         .ReturnsAsync(It.IsAny<ApplicationUser>());
  499.                     mockUserManager.Setup(um => um.GetEmailAsync(It.IsAny<ApplicationUser>()))
  500.                         .ReturnsAsync(It.IsAny<string>());
  501.                     mockUserManager.Setup(um => um.CheckPasswordAsync(It.IsAny<ApplicationUser>(), It.IsAny<string>()))
  502.                         .ReturnsAsync(false);
  503.                 }
  504.             );
  505.  
  506.             Assert.IsFalse(result.Succeeded, string.Join(',', result.Errors.Select(e => e.Message)));
  507.         }
  508.  
  509.         #endregion
  510.  
  511.         #endregion
  512.     }
  513. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement