From 51e0f097781c411ff96c85389118a8bf5bf5f7e7 Mon Sep 17 00:00:00 2001 From: Julen Landa Alustiza Date: Sep 23 2019 12:49:51 +0000 Subject: Move to own test file and refactor view_blame_file tests Blame view tests had identical content on all their branch|tags so our tests were not valid since we could not determinate from wich ref the content was coming. The 404 errors could be due to different reasons and that was not properly tested neither. This commits moves the blame tests to their own test file, dissect them on many small tests, uses different content for each branch|tag and properly tests the different 404 cases --- diff --git a/tests/test_pagure_flask_ui_repo.py b/tests/test_pagure_flask_ui_repo.py index 4492ede..59b4ebe 100644 --- a/tests/test_pagure_flask_ui_repo.py +++ b/tests/test_pagure_flask_ui_repo.py @@ -2832,232 +2832,6 @@ class PagureFlaskRepotests(tests.Modeltests): ) self.assertIn("foo\n bar", output_text) - def test_view_blame_file(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) - - tests.create_projects(self.session) - - output = self.app.get("/test/blame/sources") - # No git repo associated - self.assertEqual(output.status_code, 404) - - tests.create_projects_git(os.path.join(self.path, "repos"), bare=True) - - output = self.app.get("/test/blame/sources") - self.assertEqual(output.status_code, 404) - - # Add some content to the git repo - tests.add_content_git_repo( - os.path.join(self.path, "repos", "test.git") - ) - tests.add_content_git_repo( - os.path.join(self.path, "repos", "test.git"), branch="feature" - ) - tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git")) - tests.add_binary_git_repo( - os.path.join(self.path, "repos", "test.git"), "test.jpg" - ) - tests.add_binary_git_repo( - os.path.join(self.path, "repos", "test.git"), "test_binary" - ) - - output = self.app.get("/test/blame/foofile") - self.assertEqual(output.status_code, 404) - regex = re.compile(r'>(\w+)\n') - - # View in master branch - output = self.app.get("/test/blame/sources") - self.assertEqual(output.status_code, 200) - output_text = output.get_data(as_text=True) - self.assertIn('', output_text) - self.assertTrue( - '' in output_text - or '' in output_text - ) - self.assertIn( - '', output_text - ) - data = regex.findall(output_text) - self.assertEqual(len(data), 2) - - # View for a 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 - - output = self.app.get("/test/blame/sources?identifier=%s" % parent) - self.assertEqual(output.status_code, 200) - output_text = output.get_data(as_text=True) - self.assertIn('
 bar
', output_text) - self.assertTrue( - '' in output_text - or '' in output_text - ) - self.assertIn( - '', output_text - ) - data1 = regex.findall(output_text) - self.assertEqual(len(data1), 2) - self.assertEqual(data, data1) - - # View in feature branch - 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('
 bar
', output_text) - self.assertTrue( - '' in output_text - or '' in output_text - ) - self.assertIn( - '', output_text - ) - data2 = regex.findall(output_text) - self.assertEqual(len(data2), 3) - self.assertEqual(data[0], data2[0]) - self.assertNotEqual(data2[0], data2[1]) - self.assertEqual(data2[1], data2[2]) - - # View what's supposed to be an image - output = self.app.get("/test/blame/test.jpg") - self.assertEqual(output.status_code, 400) - output_text = output.get_data(as_text=True) - self.assertIn("400 Bad Request", output_text) - self.assertIn("

Binary files cannot be blamed

", output_text) - - # View folder - output = self.app.get("/test/blame/folder1") - self.assertEqual(output.status_code, 404) - output_text = output.get_data(as_text=True) - self.assertIn( - "Page not found :'( - Pagure", output_text - ) - self.assertIn("

Page not found (404)

", output_text) - - # View by image name -- with a non-existant file - output = self.app.get("/test/blame/testfoo.jpg") - self.assertEqual(output.status_code, 404) - output = self.app.get("/test/blame/folder1/testfoo.jpg") - self.assertEqual(output.status_code, 404) - - # View file with a non-ascii name - 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("  Šource", output_text) - self.assertIn('
 bar
', output_text) - self.assertTrue( - '' in output_text - or '' in output_text - ) - self.assertIn( - '', output_text - ) - - # Add a fork of a fork - 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('
Row 0
', output_text) - self.assertTrue( - '' in output_text - or '' in output_text - ) - self.assertIn( - '', - output_text, - ) - - def test_view_blame_file_on_tag(self): - """ Test the view_blame_file endpoint. """ - - regex = re.compile(r'>(\w+)\n
 barRow 0
') - 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_git_repo( - os.path.join(self.path, "repos", "test.git") - ) - tests.add_readme_git_repo(os.path.join(self.path, "repos", "test.git")) - - # add a tag to the git repo - repo = pygit2.Repository(os.path.join(self.path, "repos", "test.git")) - commit = repo[repo.head.target] - tagger = pygit2.Signature("Alice Doe", "adoe@example.com", 12347, 0) - repo.create_tag( - "v1.0", - commit.oid.hex, - pygit2.GIT_OBJ_COMMIT, - tagger, - "Release v1.0", - ) - - # View for tag 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('', output_text) - self.assertTrue( - '' in output_text - or '' in output_text - ) - self.assertIn( - '', output_text - ) - data = regex.findall(output_text) - self.assertEqual(len(data), 2) - def test_view_commit(self): """ Test the view_commit endpoint. """ output = self.app.get("/foo/c/bar") diff --git a/tests/test_pagure_flask_ui_repo_view_blame.py b/tests/test_pagure_flask_ui_repo_view_blame.py new file mode 100644 index 0000000..72ea505 --- /dev/null +++ b/tests/test_pagure_flask_ui_repo_view_blame.py @@ -0,0 +1,329 @@ +# -*- coding: utf-8 -*- + +""" +Authors: + Julen Landa Alustiza + Pierre-Yves Chibon + +""" + +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( + "Page not found :'( - Pagure", output_text + ) + self.assertIn("

Page not found (404)

", output_text) + self.assertIn("

Project not found

", 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( + "Page not found :'( - Pagure", output_text + ) + self.assertIn("

Page not found (404)

", output_text) + self.assertIn("

Empty repo cannot have a file

", 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+)\n
 bar
') + 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('', output_text) + self.assertTrue( + '' in output_text + or '' in output_text + ) + self.assertIn( + '', output_text + ) + self.assertIn('', 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('
foo
Alice Author
', output_text) + self.assertTrue( + '' in output_text + or '' in output_text + ) + self.assertIn( + '', output_text + ) + self.assertIn('', 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('
bar
Aritz Author
', output_text) + self.assertTrue( + '' in output_text + or '' in output_text + ) + self.assertIn( + '', output_text + ) + self.assertIn('', 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('
foo
Alice Author
', output_text) + self.assertTrue( + '' in output_text + or '' in output_text + ) + self.assertIn( + '', output_text + ) + self.assertIn('', 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('
bar
Aritz Author
', output_text) + self.assertTrue( + '' in output_text + or '' in output_text + ) + self.assertIn( + '', output_text + ) + self.assertIn('', 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("400 Bad Request", output_text) + self.assertIn("

Binary files cannot be blamed

", 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("  Šource", output_text) + self.assertIn('
foo
Alice Author
', output_text) + self.assertTrue( + '' in output_text + or '' in output_text + ) + self.assertIn( + '', 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('
Row 0
', output_text) + self.assertTrue( + '' in output_text + or '' in output_text + ) + self.assertIn( + '', + 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( + "Page not found :'( - Pagure", output_text + ) + self.assertIn("

Page not found (404)

", output_text) + self.assertIn("

File not found

", 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( + "Page not found :'( - Pagure", output_text + ) + self.assertIn("

Page not found (404)

", output_text) + self.assertIn("

File not found

", 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( + "Page not found :'( - Pagure", output_text + ) + self.assertIn("

Page not found (404)

", output_text) + self.assertIn( + "

Identifier is mandatory on unborn HEAD repos

", output_text + )
 barRow 0