def test_user_add_insert_one_week_password(self): """Test para registro de un usuario con contraseña debil""" user_data = { 'email': '*****@*****.**', 'password': '******', } new_user_data = { 'username': '******', 'email': '*****@*****.**', 'password': '******', 'confirm': 'qwerty' } create_user(user_data['email'], user_data['password'], True) login_url = url_for('main.login') user_add_url = (url_for('main.user_add')) expected_error_msg = 'La contraseña es muy corta, la longitud mínima ' \ 'es de 8 caracteres' with current_app.app_context(): with self.client as c: # login de usuario c.post(login_url, data=user_data, follow_redirects=True) # registro de usuario response = c.post(user_add_url, data=new_user_data, follow_redirects=True) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assert_template_used("forms/register.html") self.assertIn(expected_error_msg, response.data.decode('utf-8'))
def test_user_add_insert_email_duplicated(self): """Test para registro de un usuario""" user_data = { 'email': '*****@*****.**', 'password': '******', } new_user_data = { 'username': '******', 'email': '*****@*****.**', 'password': '******', 'confirm': 'F00barbaz$' } create_user(user_data['email'], user_data['password'], True) login_url = url_for('main.login') user_add_url = (url_for('main.user_add')) expected_error_msg = 'El correo electrónico ya esta registrado' with current_app.app_context(): with self.client as c: # login de usuario c.post(login_url, data=user_data, follow_redirects=True) # registro de usuario response = c.post(user_add_url, data=new_user_data, follow_redirects=True) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assert_template_used("forms/register.html") self.assertIn(expected_error_msg, response.data.decode('utf-8'))
def test_user_add(self): """Test para la vista user_add""" user_data = { 'email': '*****@*****.**', 'password': '******', } create_user(user_data['email'], user_data['password'], True) login_url = url_for('main.login') user_add_url = (url_for('main.user_add')) with current_app.app_context(): with self.client as c: # login de usuario login_response = c.post(login_url, data=user_data, follow_redirects=True) self.assertStatus(login_response, 200) # vista user_add response = c.get(user_add_url) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assertEqual([i.url for i in current_breadcrumbs], ['/', '/usuarios', user_add_url]) self.assert_template_used("forms/register.html") context_form = self.get_context_variable('form') self.assertIsInstance(context_form, forms.RegistrationForm)
def test_user_add_insert_one(self): """Test para registro de un usuario""" user_data = { 'email': '*****@*****.**', 'password': '******', } new_user_data = { 'username': '******', 'email': '*****@*****.**', 'password': '******', 'confirm': 'F00barbaz$' } create_user(user_data['email'], user_data['password'], True) login_url = url_for('main.login') user_add_url = (url_for('main.user_add')) expected_msg = 'Se envío un correo de confirmación a: %s' % new_user_data[ 'email'] with current_app.app_context(): with self.client as c: # login de usuario c.post(login_url, data=user_data, follow_redirects=True) # registro de usuario response = c.post(user_add_url, data=new_user_data, follow_redirects=True) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assert_template_used("forms/register.html") self.assertIn(expected_msg, response.data.decode('utf-8')) user = User.get_by_email(new_user_data['email']) self.assertIsInstance(user, User)
def test_reset_with_valid_token_update_ok(self): """Test de recuperación de contraseña""" user_data = { 'email': '*****@*****.**', 'password': '******', } create_user(user_data['email'], user_data['password'], True) reset_url = url_for('main.reset') with current_app.app_context(): with self.client as c: with mail.record_messages() as outbox: c.post(reset_url, data=user_data, follow_redirects=True) # Obtenemos url del correo email_msg = outbox[0] links_found = url_pattern.findall(email_msg.html) self.assertGreaterEqual(1, len(links_found)) reset_url_with_token = [ url for url in links_found if reset_url in url ] self.assertEqual(1, len(reset_url_with_token)) reset_url_with_token = reset_url_with_token[0] # Llamamos a la vista reset_with_token con la contraseña new_password = '******' response = c.post(reset_url_with_token, data={ 'password': new_password, 'confirm': new_password }, follow_redirects=True) self.assertStatus(response, 200) self.assertTemplateUsed('auth/login.html') user = User.get_by_email(user_data['email']) self.assertTrue(user.check_password_hash(new_password))
def test_user_detail(self): """Test para la vista user_detail""" user_data = { 'email': '*****@*****.**', 'password': '******', } create_user(user_data['email'], user_data['password'], True) login_url = url_for('main.login') with current_app.app_context(): with self.client as c: # login de usuario login_response = c.post(login_url, data=user_data, follow_redirects=True) self.assertStatus(login_response, 200) # vista user_detail user = User.get_by_email(user_data['email']) user_detail_url = url_for('main.user_detail', user_id=user.id) response = c.get(user_detail_url) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assertEqual([i.url for i in current_breadcrumbs], ['/', '/usuarios', user_detail_url]) self.assert_template_used("main/user.html")
def test_reset_with_valid_token(self): """Test de las vista reset_with_token""" user_data = { 'email': '*****@*****.**', 'password': '******', } create_user(user_data['email'], user_data['password'], True) reset_url = url_for('main.reset') with current_app.app_context(): with self.client as c: with mail.record_messages() as outbox: c.post(reset_url, data=user_data, follow_redirects=True) # Obtenemos url del correo email_msg = outbox[0] links_found = url_pattern.findall(email_msg.html) self.assertGreaterEqual(1, len(links_found)) reset_url_with_token = [ url for url in links_found if reset_url in url ] self.assertEqual(1, len(reset_url_with_token)) reset_url_with_token = reset_url_with_token[0] # Llamamos a la vista reset_with_token response = c.get(reset_url_with_token) self.assertStatus(response, 200) self.assertTemplateUsed('auth/reset_with_token.html') context_form = self.get_context_variable('form') self.assertIsInstance(context_form, forms.PasswordForm)
def test_reset_registered_user_send_email_error(self): """Test de error en envío de coreo de recuperación de contraseña""" user_data = { 'email': '*****@*****.**', 'password': '******', } create_user(user_data['email'], user_data['password'], True) reset_url = url_for('main.reset') expected_error_msg = 'Ocurrió un problema al enviar el correo con ' \ 'las instrucciones de recuperación de ' \ 'contraseña a la dirección: %s' % user_data['email'] with current_app.app_context(): with self.client as c: with patch('biblat_manager.webapp.utils' '.get_timed_serializer') as mock: mock.return_value = URLSafeTimedSerializer(None) response = c.post(reset_url, data=user_data, follow_redirects=True) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assert_template_used("auth/login.html") self.assertIn(expected_error_msg, response.data.decode('utf-8'))
def test_reset_registered_user(self): """Test de recuperación con email no registrado""" user_data = { 'email': '*****@*****.**', 'password': '******', } create_user(user_data['email'], user_data['password'], True) reset_url = url_for('main.reset') expected_msg = 'Se enviaron instrucciones para recuperar su ' \ 'contraseña al correo: %s' % user_data['email'] expected_email = { 'subject': 'Instrucciones para recuperar su contraseña', 'recipients': [user_data['email']], 'reset_link': url_for('main.reset') } with current_app.app_context(): with self.client as c: with mail.record_messages() as outbox: response = c.post(reset_url, data=user_data, follow_redirects=True) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assert_template_used("auth/login.html") self.assertIn(expected_msg, response.data.decode('utf-8')) # Verificar envío de correo email_msg = outbox[0] self.assertEqual(1, len(outbox)) self.assertEqual(expected_email['subject'], email_msg.subject) self.assertEqual(expected_email['recipients'], email_msg.recipients) self.assertIn(expected_email['reset_link'], email_msg.html)
def test_user_add_insert_one_with_confirmation_email(self): """Test para registro de un usuario con confirmación de correo""" user_data = { 'email': '*****@*****.**', 'password': '******', } new_user_data = { 'username': '******', 'email': '*****@*****.**', 'password': '******', 'confirm': 'F00barbaz$' } create_user(user_data['email'], user_data['password'], True) login_url = url_for('main.login') logout_url = url_for('main.logout') user_add_url = (url_for('main.user_add')) expected_email = { 'subject': 'Confirmación de correo electrónico', 'recipients': [new_user_data['email']], } with current_app.app_context(): with self.client as c: with mail.record_messages() as outbox: # login de usuario c.post(login_url, data=user_data, follow_redirects=True) # registro de usuario c.post(user_add_url, data=new_user_data, follow_redirects=True) # logout de usuario c.get(logout_url) # confirmación de correo electrónico email_msg = outbox[0] self.assertEqual(1, len(outbox)) self.assertEqual(expected_email['subject'], email_msg.subject) self.assertEqual(expected_email['recipients'], email_msg.recipients) links_found = url_pattern.findall(email_msg.html) self.assertGreaterEqual(1, len(links_found)) confirm_url_with_token = [ url for url in links_found if '/user/confirm/' in url ] self.assertEqual(1, len(confirm_url_with_token)) confirm_url_with_token = confirm_url_with_token[0] # activamos correo electrónico response = c.get(confirm_url_with_token, follow_redirects=True) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assert_template_used("auth/login.html") user = User.get_by_email(new_user_data['email']) self.assertTrue(user.email_confirmed)
def test_reset_unverified_email(self): """Test de recuperación con email no registrado""" user_data = { 'email': '*****@*****.**', 'password': '******', } create_user(user_data['email'], user_data['password'], False) reset_url = url_for('main.reset') with current_app.app_context(): with self.client as c: response = c.post(reset_url, data=user_data, follow_redirects=True) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assert_template_used("auth/unconfirmed_email.html")
def test_user_edit_update_raise_value_error(self): """Test para actualizar un usuario""" user_data = { 'email': '*****@*****.**', 'password': '******', } create_user(user_data['email'], user_data['password'], True) user = User.get_by_email(user_data['email']) login_url = url_for('main.login') with current_app.app_context(): with self.client as c: with patch('biblat_manager.webapp.models.User' '.send_confirmation_email') as mock: mock.side_effect = ValueError( 'recipient_email es inválido!') # login de usuario c.post(login_url, data=user_data, follow_redirects=True) # edición de usuario user_data_update = {} user_data_update.update(user_data) user_data_update.update({ 'email': '*****@*****.**', 'username': '******', 'password': '******', 'confirm': 'Quxquuxc0rge$' }) user_edit_url = url_for('main.user_edit', user_id=user.id) response = c.post(user_edit_url, data=user_data_update, follow_redirects=True) self.assertRaises(ValueError) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assert_template_used("forms/register.html") expected_error_msg = 'Ocurrió un error en el envío del ' \ 'correo de confirmación a: %s' % \ user_data_update['email'] self.assertIn(expected_error_msg, response.data.decode('utf-8')) updated_user = User.get_by_id(user.id) self.assertEqual(user_data_update['email'], updated_user.email)
def test_login_registered_user(self): """Test de login de usuario registrado""" user_data = { 'email': '*****@*****.**', 'password': '******', } create_user(user_data['email'], user_data['password'], True) login_url = url_for('main.login') with current_app.app_context(): with self.client as c: # login de usuario response = c.post(login_url, data=user_data, follow_redirects=True) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assert_template_used("main/index.html")
def test_home_page(self): """Test de la página principal""" admin_user = { 'email': '*****@*****.**', 'password': '******', } create_user(admin_user['email'], admin_user['password'], True) login_url = url_for('main.login') with current_app.app_context(): with self.client as c: # login de usuario admin login_response = c.post(login_url, data=admin_user, follow_redirects=True) self.assertStatus(login_response, 200) response = c.get(url_for('main.index')) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assertEqual([i.url for i in current_breadcrumbs], ['/']) self.assert_template_used("main/index.html")
def test_user_add_insert_one_raise_value_error(self): """Test para registro de un usuario""" user_data = { 'email': '*****@*****.**', 'password': '******', } new_user_data = { 'username': '******', 'email': '*****@*****.**', 'password': '******', 'confirm': 'F00barbaz$' } create_user(user_data['email'], user_data['password'], True) login_url = url_for('main.login') user_add_url = (url_for('main.user_add')) expected_error_msg = 'Ocurrió un error en el envío del correo de ' \ 'confirmación a: %s' % new_user_data['email'] with current_app.app_context(): with self.client as c: with patch('biblat_manager.webapp.models.User' '.send_confirmation_email') as mock: mock.side_effect = ValueError( 'recipient_email es inválido!') # login de usuario c.post(login_url, data=user_data, follow_redirects=True) # registro de usuario response = c.post(user_add_url, data=new_user_data, follow_redirects=True) self.assertRaises(ValueError) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assert_template_used("forms/register.html") self.assertIn(expected_error_msg, response.data.decode('utf-8')) user = User.get_by_email(new_user_data['email']) self.assertIsInstance(user, User)
def test_user_edit_duplicated_email(self): """Test para registro de un usuario""" user_data = { 'email': '*****@*****.**', 'password': '******', } create_user(user_data['email'], user_data['password'], True) create_user('*****@*****.**', 'F00barbaz$', True) user = User.get_by_email(user_data['email']) login_url = url_for('main.login') expected_error_msg = 'El correo electrónico ya esta registrado' with current_app.app_context(): with self.client as c: # login de usuario c.post(login_url, data=user_data, follow_redirects=True) # edición de usuario user_data_update = {} user_data_update.update(user_data) user_data_update.update({ 'email': '*****@*****.**', 'username': '******', 'password': '******', 'confirm': 'Quxquuxc0rge$' }) user_edit_url = url_for('main.user_edit', user_id=user.id) response = c.post(user_edit_url, data=user_data_update, follow_redirects=True) self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assert_template_used("forms/register.html") self.assertIn(expected_error_msg, response.data.decode('utf-8')) updated_user = User.get_by_id(user.id) self.assertEqual(user_data['email'], updated_user.email)
def test_login_unverified_email(self): """Test de login de usuario con correo no verificado""" user_data = { 'email': '*****@*****.**', 'password': '******', } create_user(user_data['email'], user_data['password'], False) login_url = url_for('main.login') with current_app.app_context(): with self.client as c: # login de usuario response = c.post(login_url, data=user_data, follow_redirects=True) expected_errors_msg = 'Correo electrónico no verificado' self.assertStatus(response, 200) self.assertEqual('text/html; charset=utf-8', response.content_type) self.assertIn(expected_errors_msg, response.data.decode('utf-8')) self.assert_template_used("auth/login.html")
def create_superuser(): """ Crea un nuevo usuario a partir de los datos insertados en la terminal Para crear un nuevo usuario se necesita: - email (debe ser válido y único); - contraseña - si el usuario no es confirmado debe verificar su cuenta por correo """ user_email = None user_password = None while user_email is None: user_email = input('Correo electrónico: ').strip() if user_email == '': user_email = None print('El correo electrónico no puede ser nulo') else: if not utils.check_valid_email(user_email): user_email = None print('Debe introducir un correo electrónico válido!') elif models.User.get_by_email(user_email): user_email = None print('El correo electrónico ya esta registrado!') while user_password is None: user_password = getpass.getpass('Contraseña: ').strip() if user_password == '': user_password = None print('La contraseña no puede ser nula') email_confirmed = input('\nCorreo electrónico confirmado? [y/n]: ').strip() if email_confirmed.upper() in ('Y', 'YES'): email_confirmed = True else: print('Debe enviar el correo de confirmación desde la interfaz web') email_confirmed = False user = controllers.create_user(user_email, user_password, email_confirmed) if user.id: print('Nuevo usuario creado con éxito!')