# -*- coding: utf-8 -*- """ (c) 2015-2016 - Copyright Red Hat Inc Authors: Pierre-Yves Chibon """ __requires__ = ['SQLAlchemy >= 0.8'] import pkg_resources import unittest import shutil import sys import os import six import json from mock import patch sys.path.insert(0, os.path.join(os.path.dirname( os.path.abspath(__file__)), '..')) import pagure.lib import tests class PagureFlaskApptests(tests.Modeltests): """ Tests for flask app controller of pagure """ def setUp(self): """ Set up the environnment, ran before every tests. """ super(PagureFlaskApptests, self).setUp() pagure.APP.config['TESTING'] = True pagure.SESSION = self.session pagure.ui.SESSION = self.session pagure.ui.app.SESSION = self.session pagure.ui.filters.SESSION = self.session pagure.ui.repo.SESSION = self.session pagure.APP.config['GIT_FOLDER'] = tests.HERE pagure.APP.config['FORK_FOLDER'] = os.path.join( tests.HERE, 'forks') pagure.APP.config['TICKETS_FOLDER'] = os.path.join( tests.HERE, 'tickets') pagure.APP.config['DOCS_FOLDER'] = os.path.join( tests.HERE, 'docs') pagure.APP.config['REQUESTS_FOLDER'] = os.path.join( tests.HERE, 'requests') self.app = pagure.APP.test_client() def test_index(self): """ Test the index endpoint. """ output = self.app.get('/') self.assertEqual(output.status_code, 200) self.assertIn( '

All Projects ' '0

', output.data) tests.create_projects(self.session) output = self.app.get('/?page=abc') self.assertEqual(output.status_code, 200) self.assertIn( '

All Projects ' '2

', output.data) # Add a 3rd project with a long description item = pagure.lib.model.Project( user_id=2, # foo name='test3', description='test project #3 with a very long description', hook_token='aaabbbeee', ) self.session.add(item) self.session.commit() user = tests.FakeUser(username='foo') with tests.user_set(pagure.APP, user): output = self.app.get('/?repopage=abc&forkpage=def') self.assertIn( 'Projects 1', output.data) self.assertIn( 'Forks 0', output.data) self.assertEqual( output.data.count('

No group found

'), 1) self.assertEqual( output.data.count('
'), 3) def test_view_users(self): """ Test the view_users endpoint. """ output = self.app.get('/users/?page=abc') self.assertEqual(output.status_code, 200) self.assertIn( '

\n Users ' '2

', output.data) self.assertIn( '', output.data) self.assertIn( '', output.data) def test_view_user(self): """ Test the view_user endpoint. """ output = self.app.get('/user/pingou?repopage=abc&forkpage=def') self.assertEqual(output.status_code, 200) self.assertIn( 'Projects 0', output.data) self.assertIn( 'Forks 0', output.data) tests.create_projects(self.session) self.gitrepos = tests.create_projects_git( pagure.APP.config['GIT_FOLDER']) output = self.app.get('/user/pingou?repopage=abc&forkpage=def') self.assertEqual(output.status_code, 200) self.assertIn( 'Projects 2', output.data) self.assertIn( 'Forks 0', output.data) def test_new_project_when_turned_off(self): """ Test the new_project endpoint when new project creation is not allowed in the pagure instance. """ #turn the project creation off pagure.APP.config['ENABLE_NEW_PROJECTS'] = False # Before projects = pagure.lib.search_projects(self.session) self.assertEqual(len(projects), 0) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'project-1.git'))) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'tickets', 'project-1.git'))) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'docs', 'project-1.git'))) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'requests', 'project-1.git'))) user = tests.FakeUser() with tests.user_set(pagure.APP, user): output = self.app.get('/new/') self.assertEqual(output.status_code, 404) #just get the csrf token pagure.APP.config['ENABLE_NEW_PROJECTS'] = True output = self.app.get('/new/') pagure.APP.config['ENABLE_NEW_PROJECTS'] = False csrf_token = output.data.split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { 'description': 'Project #1', 'name': 'project-1', } user.username = 'foo' with tests.user_set(pagure.APP, user): data['csrf_token'] = csrf_token output = self.app.post('/new/', data=data, follow_redirects=True) self.assertEqual(output.status_code, 404) #After projects = pagure.lib.search_projects(self.session) self.assertEqual(len(projects), 0) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'project-1.git'))) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'tickets', 'project-1.git'))) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'docs', 'project-1.git'))) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'requests', 'project-1.git'))) pagure.APP.config['ENABLE_NEW_PROJECTS'] = True def test_new_project(self): """ Test the new_project endpoint. """ # Before projects = pagure.lib.search_projects(self.session) self.assertEqual(len(projects), 0) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'project#1.git'))) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'tickets', 'project#1.git'))) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'docs', 'project#1.git'))) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'requests', 'project#1.git'))) user = tests.FakeUser() with tests.user_set(pagure.APP, user): output = self.app.get('/new/') self.assertEqual(output.status_code, 200) self.assertIn( u'Create new Project', output.data) csrf_token = output.data.split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { 'description': 'Project #1', } output = self.app.post('/new/', data=data) self.assertEqual(output.status_code, 200) self.assertIn( u'Create new Project', output.data) self.assertIn( u'\n This field is required. \n' ' ', output.data) data['name'] = 'project-1' output = self.app.post('/new/', data=data) self.assertEqual(output.status_code, 200) self.assertIn('Create new Project', output.data) self.assertNotIn( u'\n This field is required. \n' ' ', output.data) data['csrf_token'] = csrf_token output = self.app.post('/new/', data=data) self.assertEqual(output.status_code, 200) self.assertIn('Create new Project', output.data) self.assertIn( u'\n No user ' '"username" found\n
', output.data) user.username = 'foo' with tests.user_set(pagure.APP, user): data['csrf_token'] = csrf_token output = self.app.post('/new/', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( u'
\nProject #1
', output.data) self.assertIn(u'

This repo is brand new!

', output.data) self.assertIn( u'Overview - project-1 - Pagure', output.data) # After projects = pagure.lib.search_projects(self.session) self.assertEqual(len(projects), 1) self.assertTrue(os.path.exists( os.path.join(tests.HERE, 'project-1.git'))) self.assertTrue(os.path.exists( os.path.join(tests.HERE, 'tickets', 'project-1.git'))) self.assertTrue(os.path.exists( os.path.join(tests.HERE, 'docs', 'project-1.git'))) self.assertTrue(os.path.exists( os.path.join(tests.HERE, 'requests', 'project-1.git'))) def test_non_ascii_new_project(self): """ Test the new_project endpoint with a non-ascii project. """ # Before projects = pagure.lib.search_projects(self.session) self.assertEqual(len(projects), 0) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'project-1.git'))) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'tickets', 'project-1.git'))) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'docs', 'project-1.git'))) self.assertFalse(os.path.exists( os.path.join(tests.HERE, 'requests', 'project-1.git'))) user = tests.FakeUser() user.username = 'foo' with tests.user_set(pagure.APP, user): output = self.app.get('/new/') self.assertEqual(output.status_code, 200) self.assertIn( b'Create new Project', output.data) csrf_token = output.data.decode('utf-8').split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { 'description': 'Prõjéctö #1', 'name': 'project-1', 'csrf_token': csrf_token, 'create_readme': True, } output = self.app.post('/new/', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\nPrõjéctö #1
', output.data if six.PY2 else output.data.decode('utf-8')) self.assertIn( '''

project-1

Prõjéctö #1

''', output.data if six.PY2 else output.data.decode('utf-8')) data = { 'description': 'Мой первый суперский репозиторий', 'name': 'project-2', 'csrf_token': csrf_token, 'create_readme': True, } output = self.app.post('/new/', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\nМой первый суперский репозиторий
', output.data if six.PY2 else output.data.decode('utf-8')) self.assertIn( '''

project-2

Мой первый суперский репозиторий

''', output.data if six.PY2 else output.data.decode('utf-8')) # After projects = pagure.lib.search_projects(self.session) self.assertEqual(len(projects), 2) for project in ['project-1', 'project-2']: self.assertTrue(os.path.exists( os.path.join(tests.HERE, '%s.git' % project))) self.assertTrue(os.path.exists( os.path.join(tests.HERE, 'tickets', '%s.git' % project))) self.assertTrue(os.path.exists( os.path.join(tests.HERE, 'docs', '%s.git' % project))) self.assertTrue(os.path.exists( os.path.join(tests.HERE, 'requests', '%s.git' % project))) @patch('pagure.ui.app.admin_session_timedout') def test_user_settings(self, ast): """ Test the user_settings endpoint. """ ast.return_value = False self.test_new_project() user = tests.FakeUser() with tests.user_set(pagure.APP, user): output = self.app.get('/settings/') self.assertEqual(output.status_code, 404) self.assertTrue('

Page not found (404)

' in output.data) user.username = 'foo' with tests.user_set(pagure.APP, user): output = self.app.get('/settings/') self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertIn( '', output.data) csrf_token = output.data.split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { 'ssh_key': 'this is my ssh key', } output = self.app.post('/settings/', data=data) self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertIn( '', output.data) data['csrf_token'] = csrf_token output = self.app.post( '/settings/', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue( '\n Public ssh key updated' in output.data) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertIn( '', output.data) ast.return_value = True output = self.app.get('/settings/') self.assertEqual(output.status_code, 302) def test_markdown_preview(self): """ Test the markdown_preview endpoint. """ data = { 'content': 'test\n----\n\n * 1\n * item 2' } # CSRF missing output = self.app.post('/markdown/', data=data) self.assertEqual(output.status_code, 400) user = tests.FakeUser() user.username = 'foo' with tests.user_set(pagure.APP, user): output = self.app.get('/settings/') self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertIn( '', output.data) csrf_token = output.data.split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] # With CSRF data['csrf_token'] = csrf_token output = self.app.post('/markdown/', data=data) self.assertEqual(output.status_code, 200) exp = """

test

""" self.assertEqual(output.data, exp) @patch('pagure.ui.app.admin_session_timedout') def test_remove_user_email(self, ast): """ Test the remove_user_email endpoint. """ ast.return_value = False self.test_new_project() user = tests.FakeUser() with tests.user_set(pagure.APP, user): output = self.app.post('/settings/email/drop') self.assertEqual(output.status_code, 404) self.assertTrue('

Page not found (404)

' in output.data) user.username = 'foo' with tests.user_set(pagure.APP, user): output = self.app.post('/settings/') self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertIn( '', output.data) csrf_token = output.data.split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { 'email': 'foo@pingou.com', } output = self.app.post( '/settings/email/drop', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertIn( '', output.data) self.assertIn( '\n You must always have at least one email', output.data) user.username = 'pingou' with tests.user_set(pagure.APP, user): output = self.app.post('/settings/') self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertIn( '', output.data) csrf_token = output.data.split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { 'email': 'foo@pingou.com', } output = self.app.post( '/settings/email/drop', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertEqual(output.data.count('foo@pingou.com'), 4) data = { 'csrf_token': csrf_token, 'email': 'foobar@pingou.com', } output = self.app.post( '/settings/email/drop', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertIn( '\n You do not have the ' 'email: foobar@pingou.com, nothing to remove', output.data) data = { 'csrf_token': csrf_token, 'email': 'foo@pingou.com', } output = self.app.post( '/settings/email/drop', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertEqual(output.data.count('foo@pingou.com'), 0) self.assertEqual(output.data.count('bar@pingou.com'), 3) output = self.app.post( '/settings/email/drop', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertEqual(output.data.count('foo@pingou.com'), 0) self.assertEqual(output.data.count('bar@pingou.com'), 3) ast.return_value = True output = self.app.post('/settings/email/drop', data=data) self.assertEqual(output.status_code, 302) @patch('pagure.lib.notify.send_email') @patch('pagure.ui.app.admin_session_timedout') def test_add_user_email(self, ast, send_email): """ Test the add_user_email endpoint. """ send_email.return_value = True ast.return_value = False self.test_new_project() user = tests.FakeUser() with tests.user_set(pagure.APP, user): output = self.app.post('/settings/email/add') self.assertEqual(output.status_code, 404) self.assertTrue('

Page not found (404)

' in output.data) user.username = 'foo' with tests.user_set(pagure.APP, user): output = self.app.post('/settings/email/add') self.assertEqual(output.status_code, 200) self.assertTrue("Add new email" in output.data) self.assertIn( '', output.data) user.username = 'pingou' with tests.user_set(pagure.APP, user): output = self.app.post('/settings/email/add') self.assertEqual(output.status_code, 200) self.assertTrue("Add new email" in output.data) self.assertIn( '', output.data) csrf_token = output.data.split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { 'email': 'foo2@pingou.com', } output = self.app.post( '/settings/email/add', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue("Add new email" in output.data) self.assertEqual(output.data.count('foo2@pingou.com'), 1) # New email data = { 'csrf_token': csrf_token, 'email': 'foobar@pingou.com', } output = self.app.post( '/settings/email/add', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertIn( '\n Email pending validation', output.data) self.assertEqual(output.data.count('foo@pingou.com'), 4) self.assertEqual(output.data.count('bar@pingou.com'), 5) self.assertEqual(output.data.count('foobar@pingou.com'), 2) # Email already pending output = self.app.post( '/settings/email/add', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\n ' 'Add new email', output.data) self.assertIn( '\n This email is already ' 'pending confirmation', output.data) # User already has this email data = { 'csrf_token': csrf_token, 'email': 'foo@pingou.com', } output = self.app.post( '/settings/email/add', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue("Add new email" in output.data) self.assertIn( 'Invalid value, can't be any of: bar@pingou.com, ' 'foo@pingou.com. ', output.data) self.assertEqual(output.data.count('foo@pingou.com'), 6) self.assertEqual(output.data.count('bar@pingou.com'), 5) self.assertEqual(output.data.count('foobar@pingou.com'), 0) # Email registered by someone else data = { 'csrf_token': csrf_token, 'email': 'foo@bar.com', } output = self.app.post( '/settings/email/add', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertTrue("Add new email" in output.data) self.assertIn( 'Invalid value, can't be any of: foo@bar.com. ', output.data) ast.return_value = True output = self.app.post('/settings/email/add', data=data) self.assertEqual(output.status_code, 302) @patch('pagure.lib.notify.send_email') @patch('pagure.ui.app.admin_session_timedout') def test_set_default_email(self, ast, send_email): """ Test the set_default_email endpoint. """ send_email.return_value = True ast.return_value = False self.test_new_project() user = tests.FakeUser() with tests.user_set(pagure.APP, user): output = self.app.post('/settings/email/default') self.assertEqual(output.status_code, 404) self.assertTrue('

Page not found (404)

' in output.data) user.username = 'pingou' with tests.user_set(pagure.APP, user): output = self.app.get('/settings/') self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertIn( '', output.data) csrf_token = output.data.split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { 'email': 'foo@pingou.com', } output = self.app.post( '/settings/email/default', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertEqual(output.data.count('foo@pingou.com'), 4) # Set invalid default email data = { 'csrf_token': csrf_token, 'email': 'foobar@pingou.com', } output = self.app.post( '/settings/email/default', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertEqual(output.data.count('foo@pingou.com'), 4) self.assertIn( '\n You do not have the ' 'email: foobar@pingou.com, nothing to set', output.data) # Set default email data = { 'csrf_token': csrf_token, 'email': 'foo@pingou.com', } output = self.app.post( '/settings/email/default', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertEqual(output.data.count('foo@pingou.com'), 4) self.assertIn( '\n Default email set to: ' 'foo@pingou.com', output.data) ast.return_value = True output = self.app.post('/settings/email/default', data=data) self.assertEqual(output.status_code, 302) @patch('pagure.lib.notify.send_email') @patch('pagure.ui.app.admin_session_timedout') def test_reconfirm_email(self, ast, send_email): """ Test the reconfirm_email endpoint. """ send_email.return_value = True ast.return_value = False self.test_new_project() # Add a pending email to pingou userobj = pagure.lib.search_user(self.session, username='pingou') self.assertEqual(len(userobj.emails), 2) email_pend = pagure.lib.model.UserEmailPending( user_id=userobj.id, email='foo@fp.o', token='abcdef', ) self.session.add(email_pend) self.session.commit() user = tests.FakeUser() with tests.user_set(pagure.APP, user): output = self.app.post('/settings/email/resend') self.assertEqual(output.status_code, 404) self.assertTrue('

Page not found (404)

' in output.data) user.username = 'pingou' with tests.user_set(pagure.APP, user): output = self.app.get('/settings/') self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertIn( '', output.data) csrf_token = output.data.split( 'name="csrf_token" type="hidden" value="')[1].split('">')[0] data = { 'email': 'foo@pingou.com', } output = self.app.post( '/settings/email/resend', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertEqual(output.data.count('foo@pingou.com'), 4) # Set invalid default email data = { 'csrf_token': csrf_token, 'email': 'foobar@pingou.com', } output = self.app.post( '/settings/email/resend', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertEqual(output.data.count('foo@pingou.com'), 4) self.assertIn( '\n This email address has ' 'already been confirmed', output.data) # Validate a non-validated email data = { 'csrf_token': csrf_token, 'email': 'foo@fp.o', } output = self.app.post( '/settings/email/resend', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertEqual(output.data.count('foo@pingou.com'), 4) self.assertIn( '\n Confirmation email re-sent', output.data) ast.return_value = True output = self.app.post('/settings/email/resend', data=data) self.assertEqual(output.status_code, 302) @patch('pagure.ui.app.admin_session_timedout') def test_confirm_email(self, ast): """ Test the confirm_email endpoint. """ output = self.app.get('/settings/email/confirm/foobar') self.assertEqual(output.status_code, 302) ast.return_value = False # Add a pending email to pingou userobj = pagure.lib.search_user(self.session, username='pingou') self.assertEqual(len(userobj.emails), 2) email_pend = pagure.lib.model.UserEmailPending( user_id=userobj.id, email='foo@fp.o', token='abcdef', ) self.session.add(email_pend) self.session.commit() user = tests.FakeUser() user.username = 'pingou' with tests.user_set(pagure.APP, user): # Wrong token output = self.app.get( '/settings/email/confirm/foobar', follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertIn( '\n No email associated with this token.', output.data) # Confirm email output = self.app.get( '/settings/email/confirm/abcdef', follow_redirects=True) self.assertEqual(output.status_code, 200) self.assertIn( '
\n Basic Information\n' '
', output.data) self.assertIn( '\n Email validated', output.data) userobj = pagure.lib.search_user(self.session, username='pingou') self.assertEqual(len(userobj.emails), 3) ast.return_value = True output = self.app.get('/settings/email/confirm/foobar') self.assertEqual(output.status_code, 302) if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskApptests) unittest.TextTestRunner(verbosity=2).run(SUITE)