| |
@@ -0,0 +1,329 @@
|
| |
+ # -*- coding: utf-8 -*-
|
| |
+
|
| |
+ """
|
| |
+ Authors:
|
| |
+ Julen Landa Alustiza <julen@landa.eus>
|
| |
+ Pierre-Yves Chibon <pingou@pingoured.fr>
|
| |
+
|
| |
+ """
|
| |
+
|
| |
+ from __future__ import unicode_literals, absolute_import
|
| |
+
|
| |
+ import re
|
| |
+ import sys
|
| |
+ import os
|
| |
+ import pygit2
|
| |
+
|
| |
+ sys.path.insert(
|
| |
+ 0, os.path.join(os.path.dirname(os.path.abspath(__file__)), "..")
|
| |
+ )
|
| |
+
|
| |
+ import tests
|
| |
+ import pagure.lib.model
|
| |
+
|
| |
+
|
| |
+ class PagureFlaskRepoViewBlameFileSimpletests(tests.Modeltests):
|
| |
+ """ Tests for view_blame_file endpoint of the flask pagure app """
|
| |
+
|
| |
+ def test_view_blame_file_no_project(self):
|
| |
+ """ Test the view_blame_file endpoint """
|
| |
+ output = self.app.get("/foo/blame/sources")
|
| |
+ # No project registered in the DB
|
| |
+ self.assertEqual(output.status_code, 404)
|
| |
+ output_text = output.get_data(as_text=True)
|
| |
+ self.assertIn(
|
| |
+ "<title>Page not found :'( - Pagure</title>", output_text
|
| |
+ )
|
| |
+ self.assertIn("<h2>Page not found (404)</h2>", output_text)
|
| |
+ self.assertIn("<p>Project not found</p>", output_text)
|
| |
+
|
| |
+ def test_view_blame_file_no_git_repo(self):
|
| |
+ """ Test the view_blame_file endpoint """
|
| |
+ tests.create_projects(self.session)
|
| |
+
|
| |
+ output = self.app.get("/test/blame/sources")
|
| |
+ # No git repo associated
|
| |
+ self.assertEqual(output.status_code, 404)
|
| |
+
|
| |
+ def test_view_blame_file_no_git_content(self):
|
| |
+ """ Test the view_blame_file endpoint """
|
| |
+ tests.create_projects(self.session)
|
| |
+ tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
|
| |
+
|
| |
+ output = self.app.get("/test/blame/sources")
|
| |
+ # project and associated repo, but no file
|
| |
+ self.assertEqual(output.status_code, 404)
|
| |
+ output_text = output.get_data(as_text=True)
|
| |
+ self.assertIn(
|
| |
+ "<title>Page not found :'( - Pagure</title>", output_text
|
| |
+ )
|
| |
+ self.assertIn("<h2>Page not found (404)</h2>", output_text)
|
| |
+ self.assertIn("<p>Empty repo cannot have a file</p>", output_text)
|
| |
+
|
| |
+
|
| |
+ class PagureFlaskRepoViewBlameFiletests(tests.Modeltests):
|
| |
+ """ Tests for view_blame_file endpoint of the flask pagure app """
|
| |
+
|
| |
+ def setUp(self):
|
| |
+ """ Set up the environment, ran before every tests. """
|
| |
+ super(PagureFlaskRepoViewBlameFiletests, self).setUp()
|
| |
+ self.regex = re.compile(r'>(\w+)</a></td>\n<td class="cell2">')
|
| |
+ tests.create_projects(self.session)
|
| |
+ tests.create_projects_git(os.path.join(self.path, "repos"), bare=True)
|
| |
+
|
| |
+ # Add some content to the git repo
|
| |
+ tests.add_content_to_git(
|
| |
+ os.path.join(self.path, "repos", "test.git"),
|
| |
+ message="initial commit",
|
| |
+ )
|
| |
+ tests.add_content_to_git(
|
| |
+ os.path.join(self.path, "repos", "test.git"), message="foo"
|
| |
+ )
|
| |
+ tests.add_content_to_git(
|
| |
+ os.path.join(self.path, "repos", "test.git"),
|
| |
+ branch="feature",
|
| |
+ content="bar",
|
| |
+ message="bar",
|
| |
+ author=("Aritz Author", "aritz@authors.tld"),
|
| |
+ )
|
| |
+
|
| |
+ def test_view_blame_file_default_branch_master(self):
|
| |
+ """ Test the view_blame_file endpoint """
|
| |
+ output = self.app.get("/test/blame/sources")
|
| |
+ self.assertEqual(output.status_code, 200)
|
| |
+ output_text = output.get_data(as_text=True)
|
| |
+ self.assertIn('<table class="code_table">', output_text)
|
| |
+ self.assertTrue(
|
| |
+ '<tr><td class="cell1"><a id="1" href="#1" '
|
| |
+ 'data-line-number="1"></a></td>' in output_text
|
| |
+ or '<tr><td class="cell1"><a data-line-number="1" '
|
| |
+ 'href="#1" id="1"></a></td>' in output_text
|
| |
+ )
|
| |
+ self.assertIn(
|
| |
+ '<td class="cell2"><pre><code>foo</code></pre></td>', output_text
|
| |
+ )
|
| |
+ self.assertIn('<td class="cell_user">Alice Author</td>', output_text)
|
| |
+ data = self.regex.findall(output_text)
|
| |
+ self.assertEqual(len(data), 2)
|
| |
+
|
| |
+ def test_view_blame_file_default_branch_non_master(self):
|
| |
+ """ Test the view_blame_file endpoint """
|
| |
+ repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git"))
|
| |
+ reference = repo.lookup_reference("refs/heads/feature").resolve()
|
| |
+ repo.set_head(reference.name)
|
| |
+ output = self.app.get("/test/blame/sources")
|
| |
+ self.assertEqual(output.status_code, 200)
|
| |
+ output_text = output.get_data(as_text=True)
|
| |
+ self.assertIn('<table class="code_table">', output_text)
|
| |
+ self.assertTrue(
|
| |
+ '<tr><td class="cell1"><a id="1" href="#1" '
|
| |
+ 'data-line-number="1"></a></td>' in output_text
|
| |
+ or '<tr><td class="cell1"><a data-line-number="1" '
|
| |
+ 'href="#1" id="1"></a></td>' in output_text
|
| |
+ )
|
| |
+ self.assertIn(
|
| |
+ '<td class="cell2"><pre><code>bar</code></pre></td>', output_text
|
| |
+ )
|
| |
+ self.assertIn('<td class="cell_user">Aritz Author</td>', output_text)
|
| |
+ data = self.regex.findall(output_text)
|
| |
+ self.assertEqual(len(data), 3)
|
| |
+
|
| |
+ def test_view_blame_file_on_commit(self):
|
| |
+ """ Test the view_blame_file endpoint """
|
| |
+ repo_obj = pygit2.Repository(
|
| |
+ os.path.join(self.path, "repos", "test.git")
|
| |
+ )
|
| |
+ commit = repo_obj[repo_obj.head.target]
|
| |
+ parent = commit.parents[0].oid.hex
|
| |
+
|
| |
+ output = self.app.get(
|
| |
+ "/test/blame/sources?identifier={}".format(parent)
|
| |
+ )
|
| |
+ self.assertEqual(output.status_code, 200)
|
| |
+ output_text = output.get_data(as_text=True)
|
| |
+ self.assertIn('<table class="code_table">', output_text)
|
| |
+ self.assertTrue(
|
| |
+ '<tr><td class="cell1"><a id="1" href="#1" '
|
| |
+ 'data-line-number="1"></a></td>' in output_text
|
| |
+ or '<tr><td class="cell1"><a data-line-number="1" '
|
| |
+ 'href="#1" id="1"></a></td>' in output_text
|
| |
+ )
|
| |
+ self.assertIn(
|
| |
+ '<td class="cell2"><pre><code>foo</code></pre></td>', output_text
|
| |
+ )
|
| |
+ self.assertIn('<td class="cell_user">Alice Author</td>', output_text)
|
| |
+ data = self.regex.findall(output_text)
|
| |
+ self.assertEqual(len(data), 1)
|
| |
+
|
| |
+ def test_view_blame_file_on_branch(self):
|
| |
+ """ Test the view_blame_file endpoint """
|
| |
+ output = self.app.get("/test/blame/sources?identifier=feature")
|
| |
+ self.assertEqual(output.status_code, 200)
|
| |
+ output_text = output.get_data(as_text=True)
|
| |
+ self.assertIn('<table class="code_table">', output_text)
|
| |
+ self.assertTrue(
|
| |
+ '<tr><td class="cell1"><a id="1" href="#1" '
|
| |
+ 'data-line-number="1"></a></td>' in output_text
|
| |
+ or '<tr><td class="cell1"><a data-line-number="1" '
|
| |
+ 'href="#1" id="1"></a></td>' in output_text
|
| |
+ )
|
| |
+ self.assertIn(
|
| |
+ '<td class="cell2"><pre><code>bar</code></pre></td>', output_text
|
| |
+ )
|
| |
+ self.assertIn('<td class="cell_user">Aritz Author</td>', output_text)
|
| |
+ data = self.regex.findall(output_text)
|
| |
+ self.assertEqual(len(data), 3)
|
| |
+
|
| |
+ def test_view_blame_file_on_tag(self):
|
| |
+ """ Test the view_blame_file endpoint """
|
| |
+ # set a tag on the head's parent commit
|
| |
+ repo_obj = pygit2.Repository(
|
| |
+ os.path.join(self.path, "repos", "test.git")
|
| |
+ )
|
| |
+ commit = repo_obj[repo_obj.head.target]
|
| |
+ parent = commit.parents[0].oid.hex
|
| |
+ tagger = pygit2.Signature("Alice Doe", "adoe@example.com", 12347, 0)
|
| |
+ repo_obj.create_tag(
|
| |
+ "v1.0", parent, pygit2.GIT_OBJ_COMMIT, tagger, "Release v1.0"
|
| |
+ )
|
| |
+
|
| |
+ output = self.app.get("/test/blame/sources?identifier=v1.0")
|
| |
+ self.assertEqual(output.status_code, 200)
|
| |
+ output_text = output.get_data(as_text=True)
|
| |
+ self.assertIn('<table class="code_table">', output_text)
|
| |
+ self.assertTrue(
|
| |
+ '<tr><td class="cell1"><a id="1" href="#1" '
|
| |
+ 'data-line-number="1"></a></td>' in output_text
|
| |
+ or '<tr><td class="cell1"><a data-line-number="1" '
|
| |
+ 'href="#1" id="1"></a></td>' in output_text
|
| |
+ )
|
| |
+ self.assertIn(
|
| |
+ '<td class="cell2"><pre><code>foo</code></pre></td>', output_text
|
| |
+ )
|
| |
+ self.assertIn('<td class="cell_user">Alice Author</td>', output_text)
|
| |
+ data = self.regex.findall(output_text)
|
| |
+ self.assertEqual(len(data), 1)
|
| |
+
|
| |
+ def test_view_blame_file_binary(self):
|
| |
+ """ Test the view_blame_file endpoint """
|
| |
+ # Add binary content
|
| |
+ tests.add_binary_git_repo(
|
| |
+ os.path.join(self.path, "repos", "test.git"), "test.jpg"
|
| |
+ )
|
| |
+ output = self.app.get("/test/blame/test.jpg")
|
| |
+ self.assertEqual(output.status_code, 400)
|
| |
+ output_text = output.get_data(as_text=True)
|
| |
+ self.assertIn("<title>400 Bad Request</title>", output_text)
|
| |
+ self.assertIn("<p>Binary files cannot be blamed</p>", output_text)
|
| |
+
|
| |
+ def test_view_blame_file_non_ascii_name(self):
|
| |
+ """ Test the view_blame_file endpoint """
|
| |
+ tests.add_commit_git_repo(
|
| |
+ os.path.join(self.path, "repos", "test.git"),
|
| |
+ ncommits=1,
|
| |
+ filename="Šource",
|
| |
+ )
|
| |
+ output = self.app.get("/test/blame/Šource")
|
| |
+ self.assertEqual(output.status_code, 200)
|
| |
+ output_text = output.get_data(as_text=True)
|
| |
+ self.assertEqual(
|
| |
+ output.headers["Content-Type"].lower(), "text/html; charset=utf-8"
|
| |
+ )
|
| |
+ self.assertIn("</span> Šource", output_text)
|
| |
+ self.assertIn('<table class="code_table">', output_text)
|
| |
+ self.assertTrue(
|
| |
+ '<tr><td class="cell1"><a id="1" href="#1" '
|
| |
+ 'data-line-number="1"></a></td>' in output_text
|
| |
+ or '<tr><td class="cell1"><a data-line-number="1" '
|
| |
+ 'href="#1" id="1"></a></td>' in output_text
|
| |
+ )
|
| |
+ self.assertIn(
|
| |
+ '<td class="cell2"><pre><code>Row 0</code></pre></td>', output_text
|
| |
+ )
|
| |
+
|
| |
+ def test_view_blame_file_fork_of_a_fork(self):
|
| |
+ """ Test the view_blame_file endpoint """
|
| |
+ item = pagure.lib.model.Project(
|
| |
+ user_id=1, # pingou
|
| |
+ name="test3",
|
| |
+ description="test project #3",
|
| |
+ is_fork=True,
|
| |
+ parent_id=1,
|
| |
+ hook_token="aaabbbppp",
|
| |
+ )
|
| |
+ self.session.add(item)
|
| |
+ self.session.commit()
|
| |
+
|
| |
+ tests.add_content_git_repo(
|
| |
+ os.path.join(self.path, "repos", "forks", "pingou", "test3.git")
|
| |
+ )
|
| |
+ tests.add_readme_git_repo(
|
| |
+ os.path.join(self.path, "repos", "forks", "pingou", "test3.git")
|
| |
+ )
|
| |
+ tests.add_commit_git_repo(
|
| |
+ os.path.join(self.path, "repos", "forks", "pingou", "test3.git"),
|
| |
+ ncommits=10,
|
| |
+ )
|
| |
+ tests.add_content_to_git(
|
| |
+ os.path.join(self.path, "repos", "forks", "pingou", "test3.git"),
|
| |
+ content="✨☃🍰☃✨",
|
| |
+ )
|
| |
+
|
| |
+ output = self.app.get("/fork/pingou/test3/blame/sources")
|
| |
+ self.assertEqual(output.status_code, 200)
|
| |
+ output_text = output.get_data(as_text=True)
|
| |
+ self.assertIn('<table class="code_table">', output_text)
|
| |
+ self.assertTrue(
|
| |
+ '<tr><td class="cell1"><a id="1" href="#1" '
|
| |
+ 'data-line-number="1"></a></td>' in output_text
|
| |
+ or '<tr><td class="cell1"><a data-line-number="1" '
|
| |
+ 'href="#1" id="1"></a></td>' in output_text
|
| |
+ )
|
| |
+ self.assertIn(
|
| |
+ '<td class="cell2"><pre><code> barRow 0</code></pre></td>',
|
| |
+ output_text,
|
| |
+ )
|
| |
+
|
| |
+ def test_view_blame_file_no_file(self):
|
| |
+ """ Test the view_blame_file endpoint """
|
| |
+ output = self.app.get("/test/blame/foofile")
|
| |
+ self.assertEqual(output.status_code, 404)
|
| |
+ output_text = output.get_data(as_text=True)
|
| |
+ self.assertIn(
|
| |
+ "<title>Page not found :'( - Pagure</title>", output_text
|
| |
+ )
|
| |
+ self.assertIn("<h2>Page not found (404)</h2>", output_text)
|
| |
+ self.assertIn("<p>File not found</p>", output_text)
|
| |
+
|
| |
+ def test_view_blame_file_folder(self):
|
| |
+ """ Test the view_blame_file endpoint """
|
| |
+ tests.add_commit_git_repo(
|
| |
+ os.path.join(self.path, "repos", "test.git/folder1"),
|
| |
+ ncommits=1,
|
| |
+ filename="sources",
|
| |
+ )
|
| |
+ output = self.app.get("/test/blame/folder1")
|
| |
+ self.assertEqual(output.status_code, 404)
|
| |
+ output_text = output.get_data(as_text=True)
|
| |
+ self.assertIn(
|
| |
+ "<title>Page not found :'( - Pagure</title>", output_text
|
| |
+ )
|
| |
+ self.assertIn("<h2>Page not found (404)</h2>", output_text)
|
| |
+ self.assertIn("<p>File not found</p>", output_text)
|
| |
+
|
| |
+ def test_view_blame_file_unborn_head_no_identifier(self):
|
| |
+ repo_obj = pygit2.Repository(
|
| |
+ os.path.join(self.path, "repos", "test.git")
|
| |
+ )
|
| |
+ repo_obj.set_head("refs/heads/unexistent")
|
| |
+
|
| |
+ output = self.app.get("/test/blame/sources")
|
| |
+ self.assertEqual(output.status_code, 404)
|
| |
+ output_text = output.get_data(as_text=True)
|
| |
+ self.assertIn(
|
| |
+ "<title>Page not found :'( - Pagure</title>", output_text
|
| |
+ )
|
| |
+ self.assertIn("<h2>Page not found (404)</h2>", output_text)
|
| |
+ self.assertIn(
|
| |
+ "<p>Identifier is mandatory on unborn HEAD repos</p>", output_text
|
| |
+ )
|
| |
Fixes #4571
This allows using blame with unborn head repositories while an
identifier
argument is passed and uses the actual default branch when master branch exists but is not the default one.