mirror of
				https://github.com/django/django.git
				synced 2025-10-31 09:41:08 +00:00 
			
		
		
		
	Co-authored-by: David Smith <smithdc@gmail.com> Co-authored-by: Natalia <124304+nessita@users.noreply.github.com>
		
			
				
	
	
		
			212 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			212 lines
		
	
	
		
			7.0 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| import pathlib
 | |
| import sys
 | |
| 
 | |
| from django.test import SimpleTestCase
 | |
| 
 | |
| 
 | |
| def last_n_parts(path, n):
 | |
|     return "/".join(path.parts[-n:])
 | |
| 
 | |
| 
 | |
| # The import must happen at the end of setUpClass, so it can't be imported at
 | |
| # the top of the file.
 | |
| github_links = None
 | |
| 
 | |
| 
 | |
| class GitHubLinkTests(SimpleTestCase):
 | |
|     @classmethod
 | |
|     def setUpClass(cls):
 | |
|         # The file implementing the code under test is in the docs folder and
 | |
|         # is not part of the Django package. This means it cannot be imported
 | |
|         # through standard means. Include its parent in the pythonpath for the
 | |
|         # duration of the tests to allow the code to be imported.
 | |
|         cls.ext_path = str((pathlib.Path(__file__).parents[2] / "docs/_ext").resolve())
 | |
|         sys.path.insert(0, cls.ext_path)
 | |
|         cls.addClassCleanup(sys.path.remove, cls.ext_path)
 | |
|         cls.addClassCleanup(sys.modules.pop, "github_links", None)
 | |
|         # Linters/IDEs may not be able to detect this as a valid import.
 | |
|         import github_links as _github_links
 | |
| 
 | |
|         global github_links
 | |
|         github_links = _github_links
 | |
| 
 | |
|     def test_code_locator(self):
 | |
|         locator = github_links.CodeLocator.from_code(
 | |
|             """
 | |
| from a import b, c
 | |
| from .d import e, f as g
 | |
| 
 | |
| def h():
 | |
|     pass
 | |
| 
 | |
| class I:
 | |
|     def j(self):
 | |
|         pass"""
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(locator.node_line_numbers, {"h": 5, "I": 8, "I.j": 9})
 | |
|         self.assertEqual(locator.import_locations, {"b": "a", "c": "a", "e": ".d"})
 | |
| 
 | |
|     def test_module_name_to_file_path_package(self):
 | |
|         path = github_links.module_name_to_file_path("django")
 | |
| 
 | |
|         self.assertEqual(last_n_parts(path, 2), "django/__init__.py")
 | |
| 
 | |
|     def test_module_name_to_file_path_module(self):
 | |
|         path = github_links.module_name_to_file_path("django.shortcuts")
 | |
| 
 | |
|         self.assertEqual(last_n_parts(path, 2), "django/shortcuts.py")
 | |
| 
 | |
|     def test_get_path_and_line_class(self):
 | |
|         path, line = github_links.get_path_and_line(
 | |
|             module="tests.sphinx.testdata.package.module", fullname="MyClass"
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(
 | |
|             last_n_parts(path, 5), "tests/sphinx/testdata/package/module.py"
 | |
|         )
 | |
|         self.assertEqual(line, 12)
 | |
| 
 | |
|     def test_get_path_and_line_func(self):
 | |
|         path, line = github_links.get_path_and_line(
 | |
|             module="tests.sphinx.testdata.package.module", fullname="my_function"
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(
 | |
|             last_n_parts(path, 5), "tests/sphinx/testdata/package/module.py"
 | |
|         )
 | |
|         self.assertEqual(line, 24)
 | |
| 
 | |
|     def test_get_path_and_line_method(self):
 | |
|         path, line = github_links.get_path_and_line(
 | |
|             module="tests.sphinx.testdata.package.module", fullname="MyClass.my_method"
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(
 | |
|             last_n_parts(path, 5), "tests/sphinx/testdata/package/module.py"
 | |
|         )
 | |
|         self.assertEqual(line, 16)
 | |
| 
 | |
|     def test_get_path_and_line_cached_property(self):
 | |
|         path, line = github_links.get_path_and_line(
 | |
|             module="tests.sphinx.testdata.package.module",
 | |
|             fullname="MyClass.my_cached_property",
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(
 | |
|             last_n_parts(path, 5), "tests/sphinx/testdata/package/module.py"
 | |
|         )
 | |
|         self.assertEqual(line, 20)
 | |
| 
 | |
|     def test_get_path_and_line_forwarded_import(self):
 | |
|         path, line = github_links.get_path_and_line(
 | |
|             module="tests.sphinx.testdata.package.module", fullname="MyOtherClass"
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(
 | |
|             last_n_parts(path, 5), "tests/sphinx/testdata/package/other_module.py"
 | |
|         )
 | |
|         self.assertEqual(line, 1)
 | |
| 
 | |
|     def test_get_path_and_line_wildcard_import(self):
 | |
|         path, line = github_links.get_path_and_line(
 | |
|             module="tests.sphinx.testdata.package.module", fullname="WildcardClass"
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(
 | |
|             last_n_parts(path, 5),
 | |
|             "tests/sphinx/testdata/package/wildcard_module.py",
 | |
|         )
 | |
|         self.assertEqual(line, 4)
 | |
| 
 | |
|         path, line = github_links.get_path_and_line(
 | |
|             module="tests.sphinx.testdata.package.module",
 | |
|             fullname="WildcardMixin",
 | |
|         )
 | |
|         self.assertEqual(
 | |
|             last_n_parts(path, 5),
 | |
|             "tests/sphinx/testdata/package/wildcard_base.py",
 | |
|         )
 | |
|         self.assertEqual(line, 1)
 | |
| 
 | |
|     def test_get_path_and_line_forwarded_import_module(self):
 | |
|         path, line = github_links.get_path_and_line(
 | |
|             module="tests.sphinx.testdata.package.module",
 | |
|             fullname="other_module.MyOtherClass",
 | |
|         )
 | |
| 
 | |
|         self.assertEqual(
 | |
|             last_n_parts(path, 5), "tests/sphinx/testdata/package/other_module.py"
 | |
|         )
 | |
|         self.assertEqual(line, 1)
 | |
| 
 | |
|     def test_get_branch_stable(self):
 | |
|         branch = github_links.get_branch(version="2.2", next_version="3.2")
 | |
|         self.assertEqual(branch, "stable/2.2.x")
 | |
| 
 | |
|     def test_get_branch_latest(self):
 | |
|         branch = github_links.get_branch(version="3.2", next_version="3.2")
 | |
|         self.assertEqual(branch, "main")
 | |
| 
 | |
|     def test_github_linkcode_resolve_unspecified_domain(self):
 | |
|         domain = "unspecified"
 | |
|         info = {}
 | |
|         self.assertIsNone(
 | |
|             github_links.github_linkcode_resolve(
 | |
|                 domain, info, version="3.2", next_version="3.2"
 | |
|             )
 | |
|         )
 | |
| 
 | |
|     def test_github_linkcode_resolve_unspecified_info(self):
 | |
|         domain = "py"
 | |
|         info = {"module": None, "fullname": None}
 | |
|         self.assertIsNone(
 | |
|             github_links.github_linkcode_resolve(
 | |
|                 domain, info, version="3.2", next_version="3.2"
 | |
|             )
 | |
|         )
 | |
| 
 | |
|     def test_github_linkcode_resolve_not_found(self):
 | |
|         info = {
 | |
|             "module": "foo.bar.baz.hopefully_non_existant_module",
 | |
|             "fullname": "MyClass",
 | |
|         }
 | |
|         self.assertIsNone(
 | |
|             github_links.github_linkcode_resolve(
 | |
|                 "py", info, version="3.2", next_version="3.2"
 | |
|             )
 | |
|         )
 | |
| 
 | |
|     def test_github_linkcode_resolve_link_to_object(self):
 | |
|         info = {
 | |
|             "module": "tests.sphinx.testdata.package.module",
 | |
|             "fullname": "MyClass",
 | |
|         }
 | |
|         self.assertEqual(
 | |
|             github_links.github_linkcode_resolve(
 | |
|                 "py", info, version="3.2", next_version="3.2"
 | |
|             ),
 | |
|             "https://github.com/django/django/blob/main/tests/sphinx/"
 | |
|             "testdata/package/module.py#L12",
 | |
|         )
 | |
| 
 | |
|     def test_github_linkcode_resolve_link_to_class_older_version(self):
 | |
|         info = {
 | |
|             "module": "tests.sphinx.testdata.package.module",
 | |
|             "fullname": "MyClass",
 | |
|         }
 | |
|         self.assertEqual(
 | |
|             github_links.github_linkcode_resolve(
 | |
|                 "py", info, version="2.2", next_version="3.2"
 | |
|             ),
 | |
|             "https://github.com/django/django/blob/stable/2.2.x/tests/sphinx/"
 | |
|             "testdata/package/module.py#L12",
 | |
|         )
 | |
| 
 | |
|     def test_import_error(self):
 | |
|         msg = "Could not import '.....test' in 'tests.sphinx.testdata.package'."
 | |
|         with self.assertRaisesMessage(ImportError, msg):
 | |
|             github_links.get_path_and_line(
 | |
|                 module="tests.sphinx.testdata.package.import_error", fullname="Test"
 | |
|             )
 |