From 43756ff9f27eb37a85a69212bf16fb0eb8238c8e Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Jul 28 2016 15:31:16 +0000 Subject: [PATCH 1/7] Add functionality to Fork and edit a file The function added forks the project and then redirect the url to edit the file specified. A form is added to the file UI which has a button saying Fork and Edit. --- diff --git a/pagure/templates/file.html b/pagure/templates/file.html index 9478de5..5f2edca 100644 --- a/pagure/templates/file.html +++ b/pagure/templates/file.html @@ -98,6 +98,15 @@ filename=filename | unicode) }}" title="Edit file">Edit {% endif %} {% if output_type == 'markup' %} +
+ + {{ forkbuttonform.csrf_token }} +
Date: Jul 28 2016 15:31:16 +0000 Subject: [PATCH 2/7] Fix POST in the url --- diff --git a/pagure/ui/fork.py b/pagure/ui/fork.py index 6a6f108..fa4b67b 100644 --- a/pagure/ui/fork.py +++ b/pagure/ui/fork.py @@ -1165,10 +1165,10 @@ def new_remote_request_pull(repo, username=None): @APP.route( '/fork_edit//edit//f/', - methods=('GET', 'POST')) + methods=['POST']) @APP.route( '/fork_edit/fork///edit//f/', - methods=('GET', 'POST')) + methods=['POST']) @login_required def fork_edit_file(repo, branchname, filename, username=None): """ Fork the project specified and open the specific file to edit From 8556fbbaec9fc0f8db7f8622801235eb8ecb309f Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Jul 28 2016 15:31:16 +0000 Subject: [PATCH 3/7] Add check for file and fix indentation --- diff --git a/pagure/templates/file.html b/pagure/templates/file.html index 5f2edca..acd1a82 100644 --- a/pagure/templates/file.html +++ b/pagure/templates/file.html @@ -97,16 +97,18 @@ repo=repo.name, branchname=branchname, filename=filename | unicode) }}" title="Edit file">Edit {% endif %} - {% if output_type == 'markup' %} -
- - {{ forkbuttonform.csrf_token }} + {% if output_type in ('file','markup') %} + + + {{ forkbuttonform.csrf_token }}
+ {% endif %} + {% if output_type == 'markup' %} Create new Project', output.data) + + csrf_token = output.data.split( + 'name="csrf_token" type="hidden" value="')[1].split('">')[0] + + data = { + 'csrf_token': csrf_token, + } + + output = self.app.post('fork_edit/test/edit/master/f/sources', + data=data, follow_redirects=True) + self.assertEqual(output.status_code, 404) + + user = tests.FakeUser() + user.username = 'foo' + with tests.user_set(pagure.APP, user): + + data = { + 'csrf_token': csrf_token, + } + + output = self.app.post('fork_edit/test/edit/master/f/sources', + follow_redirects=True) + self.assertEqual(output.status_code, 400) + + tests.add_content_git_repo(os.path.join( + pagure.APP.config['GIT_FOLDER'], 'test.git')) + + tests.add_readme_git_repo(os.path.join( + pagure.APP.config['GIT_FOLDER'], 'test.git')) + + tests.add_binary_git_repo( + os.path.join( + pagure.APP.config['GIT_FOLDER'], 'test.git'), 'test.jpg') + + tests.add_binary_git_repo( + os.path.join( + pagure.APP.config['GIT_FOLDER'], 'test.git'), 'test_binary') + + output = self.app.post('fork_edit/test/edit/master/f/sources', + data=data, follow_redirects=True) + self.assertEqual(output.status_code, 200) + self.assertIn( + '
  • ' + '  master' + '
  • ' + '  sources
  • ', + output.data) + self.assertIn( + '', + output.data) + self.assertIn( + '\n Repo "test" ' + 'cloned to "foo/test"', output.data) + + # View what's supposed to be an image + output = self.app.post('fork_edit/test/edit/master/f/test.jpg', + data=data, follow_redirects=True) + self.assertEqual(output.status_code, 400) + self.assertIn('

    Cannot edit binary files

    ', output.data) if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskForktests) From 69bc309860a25f5f816e1fca82fd5d7a86de9c73 Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Jul 28 2016 15:31:16 +0000 Subject: [PATCH 5/7] Add checking fork and edit button in UI --- diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index dab5c13..fd48bbb 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -1902,6 +1902,11 @@ index 0000000..2a552bb os.path.join( pagure.APP.config['GIT_FOLDER'], 'test.git'), 'test_binary') + output = self.app.get('/test/blob/master/f/sources') + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Fork and Edit\n \n', + output.data) output = self.app.post('fork_edit/test/edit/master/f/sources', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) From 63c088eaa1939ba8619430e2977f3727a72b4b0e Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Jul 28 2016 16:02:17 +0000 Subject: [PATCH 6/7] Add tests and comments to explain --- diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index fd48bbb..62795d2 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -1858,6 +1858,7 @@ index 0000000..2a552bb user = tests.FakeUser() user.username = 'pingou' with tests.user_set(pagure.APP, user): + # No csrf_token output = self.app.post('fork_edit/test/edit/master/f/source') self.assertEqual(output.status_code, 400) @@ -1872,6 +1873,7 @@ index 0000000..2a552bb 'csrf_token': csrf_token, } + # No files added output = self.app.post('fork_edit/test/edit/master/f/sources', data=data, follow_redirects=True) self.assertEqual(output.status_code, 404) @@ -1884,10 +1886,12 @@ index 0000000..2a552bb 'csrf_token': csrf_token, } + # No csrf_token output = self.app.post('fork_edit/test/edit/master/f/sources', follow_redirects=True) self.assertEqual(output.status_code, 400) + # Add content to the repo tests.add_content_git_repo(os.path.join( pagure.APP.config['GIT_FOLDER'], 'test.git')) @@ -1898,15 +1902,21 @@ index 0000000..2a552bb os.path.join( pagure.APP.config['GIT_FOLDER'], 'test.git'), 'test.jpg') - tests.add_binary_git_repo( - os.path.join( - pagure.APP.config['GIT_FOLDER'], 'test.git'), 'test_binary') - + # Check if button exists output = self.app.get('/test/blob/master/f/sources') self.assertEqual(output.status_code, 200) self.assertIn( 'Fork and Edit\n \n', output.data) + + # Check fork-edit doesn't come + output = self.app.get('/test/blob/master/f/test.jpg') + self.assertEqual(output.status_code, 200) + self.assertNotIn( + 'Fork and Edit\n \n', + output.data) + + # Check for edit panel output = self.app.post('fork_edit/test/edit/master/f/sources', data=data, follow_redirects=True) self.assertEqual(output.status_code, 200) From d90b91990ea708eb35f5299df399418060835bae Mon Sep 17 00:00:00 2001 From: Farhaan Bukhsh Date: Jul 28 2016 18:20:58 +0000 Subject: [PATCH 7/7] Add test for different user --- diff --git a/tests/test_pagure_flask_ui_fork.py b/tests/test_pagure_flask_ui_fork.py index 62795d2..88b7d23 100644 --- a/tests/test_pagure_flask_ui_fork.py +++ b/tests/test_pagure_flask_ui_fork.py @@ -1847,6 +1847,7 @@ index 0000000..2a552bb send_email.return_value = True + # User not logged in output = self.app.post('fork_edit/test/edit/master/f/sources') self.assertEqual(output.status_code, 302) @@ -1858,7 +1859,7 @@ index 0000000..2a552bb user = tests.FakeUser() user.username = 'pingou' with tests.user_set(pagure.APP, user): - # No csrf_token + # Invalid request output = self.app.post('fork_edit/test/edit/master/f/source') self.assertEqual(output.status_code, 400) @@ -1873,7 +1874,7 @@ index 0000000..2a552bb 'csrf_token': csrf_token, } - # No files added + # No files can be found since they are not added output = self.app.post('fork_edit/test/edit/master/f/sources', data=data, follow_redirects=True) self.assertEqual(output.status_code, 404) @@ -1886,7 +1887,7 @@ index 0000000..2a552bb 'csrf_token': csrf_token, } - # No csrf_token + # Invalid request output = self.app.post('fork_edit/test/edit/master/f/sources', follow_redirects=True) self.assertEqual(output.status_code, 400) @@ -1909,7 +1910,7 @@ index 0000000..2a552bb 'Fork and Edit\n \n', output.data) - # Check fork-edit doesn't come + # Check fork-edit doesn't show for binary files output = self.app.get('/test/blob/master/f/test.jpg') self.assertEqual(output.status_code, 200) self.assertNotIn( @@ -1939,6 +1940,32 @@ index 0000000..2a552bb self.assertEqual(output.status_code, 400) self.assertIn('

    Cannot edit binary files

    ', output.data) + # Check fork-edit shows when user is not logged in + output = self.app.get('/test/blob/master/f/sources') + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Fork and Edit\n \n', + output.data) + + # Check if fork-edit shows for different user + user.username = 'pingou' + with tests.user_set(pagure.APP, user): + + # Check if button exists + output = self.app.get('/test/blob/master/f/sources') + self.assertEqual(output.status_code, 200) + self.assertIn( + 'Fork and Edit\n \n', + output.data) + + # Check fork-edit doesn't show for binary + output = self.app.get('/test/blob/master/f/test.jpg') + self.assertEqual(output.status_code, 200) + self.assertNotIn( + 'Fork and Edit\n \n', + output.data) + + if __name__ == '__main__': SUITE = unittest.TestLoader().loadTestsFromTestCase(PagureFlaskForktests) unittest.TextTestRunner(verbosity=2).run(SUITE)