Guest User

Untitled

a guest
Jul 15th, 2018
204
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 8.10 KB | None | 0 0
  1. var service = Mock.Create<IServiceBus>();
  2.  
  3. // Model
  4. var model = new Web.Models.Membership.Login
  5. {
  6. Email = "acceptible@email.com",
  7. Password = "acceptiblePassword",
  8. RememberMe = true
  9. };
  10.  
  11. // Arrange
  12. Mock.Arrange(() => service.Query<Membership.Messages.ValidateMember>().With(model))
  13. .Returns(true);
  14.  
  15. public interface IServiceBus
  16. {
  17. T Query<T>() where T : IRequest;
  18. T Dispatch<T>() where T : IDispatch;
  19. }
  20.  
  21. public interface IRequest
  22. {
  23. }
  24.  
  25. public interface IDispatch
  26. {
  27.  
  28. }
  29.  
  30. public interface IRequestFor<TResult> : IRequest
  31. {
  32. TResult Reply();
  33. }
  34.  
  35. public interface IRequestFor<TParameters, TResult> : IRequest
  36. {
  37. TResult With(TParameters parameters);
  38. }
  39.  
  40. public interface IDispatchFor<TParameters> : IDispatch
  41. {
  42. void Using(TParameters parameters);
  43. }
  44.  
  45. public class ServiceBus : IServiceBus
  46. {
  47. private readonly IKernel kernel;
  48.  
  49. public ServiceBus(IKernel kernel) {
  50. this.kernel = kernel;
  51. }
  52.  
  53. /// <summary>
  54. /// Request a query behavior that may be given parameters to yield a result.
  55. /// </summary>
  56. /// <typeparam name="T">The type of query to request.</typeparam>
  57. /// <returns></returns>
  58. public T Query<T>() where T : IRequest
  59. {
  60. // return a simple injected instance of the query.
  61. return kernel.Get<T>();
  62. }
  63.  
  64. /// <summary>
  65. /// Request a dispatch handler for a given query that may be given parameters to send.
  66. /// </summary>
  67. /// <typeparam name="T">The type of handler to dispatch.</typeparam>
  68. /// <returns></returns>
  69. public T Dispatch<T>() where T : IDispatch
  70. {
  71. // return a simple injected instance of the dispatcher.
  72. return kernel.Get<T>();
  73. }
  74. }
  75.  
  76. Bind<IServiceBus>()
  77. .To<ServiceBus>()
  78. .InSingletonScope();
  79.  
  80. [TestMethod]
  81. public void Login_Post_ReturnsRedirectOnSuccess()
  82. {
  83. // Inject
  84. var service = Mock.Create<IServiceBus>();
  85. var authenticationService = Mock.Create<System.Web.Security.IFormsAuthenticationService>();
  86.  
  87. // Arrange
  88. var controller = new Web.Controllers.MembershipController(
  89. service, authenticationService
  90. );
  91.  
  92. var httpContext = Mock.Create<HttpContextBase>();
  93.  
  94. // Arrange
  95. var requestContext = new RequestContext(
  96. new MockHttpContext(),
  97. new RouteData());
  98.  
  99. controller.Url = new UrlHelper(
  100. requestContext
  101. );
  102.  
  103. // Model
  104. var model = new Web.Models.Membership.Login
  105. {
  106. Email = "acceptible@email.com",
  107. Password = "acceptiblePassword",
  108. RememberMe = true
  109. };
  110.  
  111. // Arrange
  112. Mock.Arrange(() => service.Query<Membership.Messages.ValidateMember>().With(model))
  113. .Returns(true);
  114.  
  115. // Act
  116. var result = controller.Login(model, "/Home/");
  117.  
  118. // Assert
  119. Assert.IsInstanceOfType(result, typeof(RedirectResult));
  120. }
  121.  
  122. public class ValidateMember : IRequestFor<IValidateMemberParameters, bool>
  123. {
  124. private readonly ISession session;
  125.  
  126. public ValidateMember(ISession session) {
  127. this.session = session;
  128. }
  129.  
  130. public bool With(IValidateMemberParameters model)
  131. {
  132. if (String.IsNullOrEmpty(model.Email)) throw new ArgumentException("Value cannot be null or empty.", "email");
  133. if (String.IsNullOrEmpty(model.Password)) throw new ArgumentException("Value cannot be null or empty.", "password");
  134.  
  135. // determine if the credentials entered can be matched in the database.
  136. var member = session.Query<Member>()
  137. .Where(context => context.Email == model.Email)
  138. .Take(1).SingleOrDefault();
  139.  
  140. // if a member was discovered, verify their password credentials
  141. if( member != null )
  142. return System.Security.Cryptography.Hashing.VerifyHash(model.Password, "SHA512", member.Password);
  143.  
  144. // if we reached this point, the password could not be properly matched and there was an error.
  145. return false;
  146. }
  147. }
  148.  
  149. [ValidateAntiForgeryToken]
  150. [HttpPost]
  151. public ActionResult Login(Web.Models.Membership.Login model, string returnUrl)
  152. {
  153. if (ModelState.IsValid)
  154. {
  155. // attempt to validate the user, and if successful, pass their credentials to the
  156. // forms authentication provider.
  157. if (Bus.Query<ValidateMember>().With(model))
  158. {
  159. // retrieve the authenticated member so that it can be passed on
  160. // to the authentication service, and logging can occur with the
  161. // login.
  162. Authentication.SignIn(model.Email, model.RememberMe);
  163.  
  164. if (Url.IsLocalUrl(returnUrl))
  165. return Redirect(returnUrl);
  166. else
  167. return RedirectToAction("Index", "Home");
  168. }
  169. else
  170. {
  171. ModelState.AddModelError("", "The user name or password provided is incorrect.");
  172. }
  173. }
  174.  
  175. // If we got this far, something failed, redisplay form
  176. return View(model);
  177. }
  178.  
  179. public class Login : Membership.Messages.IValidateMemberParameters
  180. {
  181. [Required]
  182. [DataType(DataType.EmailAddress)]
  183. [RegularExpression(@"^[a-z0-9_+-]+(.[a-z0-9_+-]+)*@(?:[a-z0-9-]+){1}(.[a-z0-9-]+)*.([a-z]{2,})$", ErrorMessage = "Invalid Email Address")]
  184. [Display(Name = "Email Address")]
  185. public string Email { get; set; }
  186.  
  187. [Required]
  188. [StringLength(32, MinimumLength = 6)]
  189. [DataType(DataType.Password)]
  190. [RegularExpression(@"^([a-zA-Z0-9@#$%]){6,32}$", ErrorMessage = "Invalid Password. Passwords must be between 6 and 32 characters, may contain any alphanumeric character and the symbols @#$% only.")]
  191. [Display(Name = "Password")]
  192. public string Password { get; set; }
  193.  
  194. [Display(Name = "Remember me?")]
  195. public bool RememberMe { get; set; }
  196. }
  197.  
  198. Mock.Arrange(() => service.Query<Membership.Messages.ValidateMember>().With(model))
  199. .Returns(true);
  200.  
  201. var validateMemberMock = Mock.Create<Membership.Messages.ValidateMember>();
  202. Mock.Arrange(() => service.Query<Membership.Messages.ValidateMember>())
  203. .Returns(validateMemberMock);
  204. Mock.Arrange(() => validateMemberMock.With(model))
  205. .Returns(true);
  206.  
  207. [TestClass]
  208. public class JustMockTest
  209. {
  210. public interface IServiceBus
  211. {
  212. T Query<T>() where T : IRequest;
  213. }
  214.  
  215. public interface IRequest
  216. {
  217. }
  218.  
  219. public interface IRequestFor<TParameters, TResult> : IRequest
  220. {
  221. TResult With(TParameters parameters);
  222. }
  223.  
  224. public class ValidateMember : IRequestFor<IValidateMemberParameters, bool>
  225. {
  226. public bool With(IValidateMemberParameters model)
  227. {
  228. return false;
  229. }
  230. }
  231.  
  232. public class MembershipController
  233. {
  234. private IServiceBus _service;
  235.  
  236. public MembershipController(IServiceBus service)
  237. {
  238. _service = service;
  239. }
  240.  
  241. public bool Login(Login model)
  242. {
  243. return _service.Query<ValidateMember>().With(model);
  244. }
  245. }
  246.  
  247. public interface IValidateMemberParameters
  248. {
  249.  
  250. }
  251.  
  252. public class Login : IValidateMemberParameters
  253. {
  254. public string Email;
  255. public string Password;
  256. public bool RememberMe;
  257. }
  258.  
  259. [TestMethod]
  260. public void Login_Post_ReturnsRedirectOnSuccess()
  261. {
  262. // Inject
  263. var service = Mock.Create<IServiceBus>();
  264.  
  265. // Arrange
  266. var controller = new MembershipController(service);
  267.  
  268. // Model
  269. var model = new Login
  270. {
  271. Email = "acceptible@email.com",
  272. Password = "acceptiblePassword",
  273. RememberMe = true
  274. };
  275.  
  276. var validateMemberMock = Mock.Create<ValidateMember>();
  277. Mock.Arrange(() => service.Query<ValidateMember>())
  278. .Returns(validateMemberMock);
  279. Mock.Arrange(() => validateMemberMock.With(model)).IgnoreArguments()
  280. .Returns(true);
  281.  
  282. // Act
  283. var result = controller.Login(model);
  284.  
  285. // Assert
  286. Assert.IsTrue(result);
  287. }
  288. }
Add Comment
Please, Sign In to add comment