def test_send_reset_password_email(self): """ Com: - Um email válido para: recipient_email = '*****@*****.**' Quando: - Enviamos a notificação de resetar a senha. Verificamos: - Que ``app.utils.send_email`` seja invocado como os parámetros: - recipient = '*****@*****.**' - subject = "Instruções para recuperar sua senha" - html = render_template('email/recover.html', recover_url=recover_url) - Que o valor de retorno da função: send_confirmation_email seja: (True, '') """ recipient_email = '*****@*****.**' ts = utils.get_timed_serializer() token = ts.dumps(recipient_email, salt='recover-key') recover_url = url_for('admin.reset_with_token', token=token, _external=True) with patch('webapp.utils.send_email') as mock: result = send_reset_password_email(recipient_email) expected = (True, '') mock.assert_called_with( recipient_email, "Instruções para recuperar sua senha", render_template('email/recover.html', recover_url=recover_url) ) self.assertEqual(expected, result)
def test_send_confirmation_email(self): """ Com: - Um email válido para: recipient_email = '*****@*****.**' Quando: - Enviamos a notificação de confirmação de email. Verificamos: - Que ``app.utils.send_email`` seja invocado como os parámetros: - recipient = '*****@*****.**' - subject = "Confirmação de email" - html = render_template('email/activate.html', confirm_url=confirm_url) - Que o valor de retorno da função: send_confirmation_email seja: (True, '') """ recipient_email = '*****@*****.**' ts = utils.get_timed_serializer() token = ts.dumps(recipient_email, salt='email-confirm-key') confirm_url = url_for('admin.confirm_email', token=token, _external=True) with patch('webapp.utils.send_email') as mock: result = send_confirmation_email(recipient_email) expected = (True, '') mock.assert_called_with( recipient_email, "Confirmação de email", render_template('email/activate.html', confirm_url=confirm_url) ) self.assertEqual(expected, result)
def confirm_email(self, token): try: ts = get_timed_serializer() email = ts.loads(token, salt="email-confirm-key", max_age=current_app.config['TOKEN_MAX_AGE']) except Exception as e: # possiveis exceções: https://pythonhosted.org/itsdangerous/#exceptions # qualquer exeção invalida a operação de confirmação abort(404) # melhorar mensagem de erro para o usuário user = controllers.get_user_by_email(email=email) if not user: abort(404, _('Usuário não encontrado')) controllers.set_user_email_confirmed(user) flash(_('Email: %(email)s confirmado com sucesso!', email=user.email)) return redirect(url_for('.index'))
def reset_with_token(self, token): try: ts = get_timed_serializer() email = ts.loads(token, salt="recover-key", max_age=current_app.config['TOKEN_MAX_AGE']) except Exception as e: abort(404) form = forms.PasswordForm(request.form) if admin.helpers.validate_form_on_submit(form): user = controllers.get_user_by_email(email=email) if not user.email_confirmed: return self.render('admin/auth/unconfirm_email.html') controllers.set_user_password(user, form.password.data) flash(_('Nova senha salva com sucesso!!')) return redirect(url_for('.index')) self._template_args['form'] = form self._template_args['token'] = token return self.render('admin/auth/reset_with_token.html')
def reset_with_token(self, token): try: ts = get_timed_serializer() email = ts.loads(token, salt="recover-key", max_age=current_app.config['TOKEN_MAX_AGE']) except Exception: abort(404) form = forms.PasswordForm(request.form) if admin.helpers.validate_form_on_submit(form): user = controllers.get_user_by_email(email=email) if not user.email_confirmed: return self.render('admin/auth/unconfirm_email.html') controllers.set_user_password(user, form.password.data) flash(_('Nova senha salva com sucesso!!')) return redirect(url_for('.index')) self._template_args['form'] = form self._template_args['token'] = token return self.render('admin/auth/reset_with_token.html')
def test_invalid_token_reset_password(self): """ Quando: - current_app.config["SECRET_KEY"] não tem valor Verifcamos: - Que ocorra uma exeção qunado é criado um token com get_timed_serializer ao enviar a notificação de resetar a senha. """ recipient_email = '*****@*****.**' with patch('webapp.utils.get_timed_serializer') as mock: mock.return_value = URLSafeTimedSerializer(None) expected = None try: ts = utils.get_timed_serializer() ts.dumps(recipient_email) except Exception, e: expected = (False, 'Invalid Token: %s' % str(e)) result = send_reset_password_email(recipient_email) self.assertEqual(expected, result)