public void Must_create_user_upon_register()
        {
            // Arrange

            var request = CreateRegistrationRequest();
            Db.SaveChanges();

            // Act

            var cmd = new FulfillRegistrationRequestCommand(Db);
            var result = cmd.Execute(request.Id, PASSWORD);
            Db.SaveChanges();

            // Assert

            AssertSuccess(result);
            Assert.AreEqual(1, Db.Users.Count(u => u.Email == request.Email), "Новый пользователь не создался, либо создалось несколько пользователей");
        }
        public void Must_store_password_hash_with_user()
        {
            // Arrange

            var request = CreateRegistrationRequest();
            Db.SaveChanges();

            // Act

            var cmd = new FulfillRegistrationRequestCommand(Db);
            var result = cmd.Execute(request.Id, PASSWORD);
            Db.SaveChanges();

            // Assert

            AssertSuccess(result);
            var user = Db.Users.First(u => u.Email == request.Email);
            Assert.IsNotNull(user.PasswordHash, "Хэш пароля не сохранился");
            Assert.AreNotEqual(PASSWORD, user.PasswordHash, "Сохранился сам пароль, а не его хэш");
        }
        public void Must_validate_password()
        {
            // Arrange

            var requestId = Guid.NewGuid();

            // Act

            var cmd = new FulfillRegistrationRequestCommand(Db);
            var result = cmd.Execute(requestId, "1");

            // Assert

            AssertError(result, (FulfillRegistrationRequestCommand c)=>c.IncorrectPasswordFormat);
            // TODO: задачка для самостоятельного решения: проверка нужна при регистрации и смене пароля, как организовать проверку пароля и тестирование?
        }
        public void When_registration_request_has_cart_Must_put_items_to_user_cart_upon_register()
        {
            // Arrange

            var cart = CreateCart(items: CreateCartItem());
            var request = CreateRegistrationRequest(cart);
            Db.SaveChanges();

            // Act

            var cmd = new FulfillRegistrationRequestCommand(Db);
            var result = cmd.Execute(request.Id, PASSWORD);
            Db.SaveChanges();

            // Assert

            AssertSuccess(result);
            Assert.IsTrue(Db.ShoppingCarts.Any(c=>c.User.Email == request.Email && c.Items.Any()), "Покупки не перенеслись в корзину пользователя");
        }
        public void When_email_is_already_taken_Must_return_error()
        {
            // Arrange

            var request = CreateRegistrationRequest();
            var user = CreateUser();
            user.Email = request.Email; // занимаем email
            Db.SaveChanges();

            // Act

            var cmd = new FulfillRegistrationRequestCommand(Db);
            var result = cmd.Execute(request.Id, PASSWORD);

            // Assert

            AssertError(result, (FulfillRegistrationRequestCommand c)=>c.EmailAlreadyRegistered);
        }