From 204f76e0c02a12aeccb3ab708fe41f7e95435a29 Mon Sep 17 00:00:00 2001 From: KotlinIsland <65446343+KotlinIsland@users.noreply.github.com> Date: Tue, 4 May 2021 18:47:22 +1000 Subject: [PATCH] add test configurations that don't contain python2 optional install (#2190) add test for negative scenario: formatting python2 code tag python2 only tests Co-authored-by: KotlinIsland --- pyproject.toml | 3 +++ tests/test_black.py | 30 ++++++++++++++++++++++++++++++ tests/test_format.py | 16 +++++++++++++--- tox.ini | 6 ++++-- 4 files changed, 50 insertions(+), 5 deletions(-) diff --git a/pyproject.toml b/pyproject.toml index 7f632f2..ca75f8f 100644 --- a/pyproject.toml +++ b/pyproject.toml @@ -25,3 +25,6 @@ extend-exclude = ''' [build-system] requires = ["setuptools>=41.0", "setuptools-scm", "wheel"] build-backend = "setuptools.build_meta" + +[tool.pytest.ini_options] +markers = ['python2', "without_python2"] \ No newline at end of file diff --git a/tests/test_black.py b/tests/test_black.py index 43368d4..7d855ca 100644 --- a/tests/test_black.py +++ b/tests/test_black.py @@ -24,6 +24,7 @@ from typing import ( Iterator, TypeVar, ) +import pytest import unittest from unittest.mock import patch, MagicMock @@ -459,6 +460,34 @@ class BlackTestCase(BlackBaseTestCase): ) self.assertEqual(expected, actual, msg) + @pytest.mark.without_python2 + def test_python2_should_fail_without_optional_install(self) -> None: + # python 3.7 and below will install typed-ast and will be able to parse Python 2 + if sys.version_info < (3, 8): + return + source = "x = 1234l" + tmp_file = Path(black.dump_to_file(source)) + try: + runner = BlackRunner() + result = runner.invoke(black.main, [str(tmp_file)]) + self.assertEqual(result.exit_code, 123) + finally: + os.unlink(tmp_file) + actual = ( + runner.stderr_bytes.decode() + .replace("\n", "") + .replace("\\n", "") + .replace("\\r", "") + .replace("\r", "") + ) + msg = ( + "The requested source code has invalid Python 3 syntax." + "If you are trying to format Python 2 files please reinstall Black" + " with the 'python2' extra: `python3 -m pip install black[python2]`." + ) + self.assertIn(msg, actual) + + @pytest.mark.python2 @patch("black.dump_to_file", dump_to_stderr) def test_python2_print_function(self) -> None: source, expected = read_data("python2_print_function") @@ -1971,6 +2000,7 @@ class BlackTestCase(BlackBaseTestCase): actual = diff_header.sub(DETERMINISTIC_HEADER, actual) self.assertEqual(actual, expected) + @pytest.mark.python2 def test_docstring_reformat_for_py27(self) -> None: """ Check that stripping trailing whitespace from Python 2 docstrings diff --git a/tests/test_format.py b/tests/test_format.py index e1335ae..78f2b55 100644 --- a/tests/test_format.py +++ b/tests/test_format.py @@ -1,6 +1,7 @@ from unittest.mock import patch import black +import pytest from parameterized import parameterized from tests.util import ( @@ -46,9 +47,6 @@ SIMPLE_CASES = [ "function2", "function_trailing_comma", "import_spacing", - "numeric_literals_py2", - "python2", - "python2_unicode_literals", "remove_parens", "slices", "string_prefixes", @@ -56,6 +54,12 @@ SIMPLE_CASES = [ "tupleassign", ] +SIMPLE_CASES_PY2 = [ + "numeric_literals_py2", + "python2", + "python2_unicode_literals", +] + EXPERIMENTAL_STRING_PROCESSING_CASES = [ "cantfit", "comments7", @@ -86,6 +90,12 @@ SOURCES = [ class TestSimpleFormat(BlackBaseTestCase): + @parameterized.expand(SIMPLE_CASES_PY2) + @pytest.mark.python2 + @patch("black.dump_to_file", dump_to_stderr) + def test_simple_format_py2(self, filename: str) -> None: + self.check_file(filename, DEFAULT_MODE) + @parameterized.expand(SIMPLE_CASES) @patch("black.dump_to_file", dump_to_stderr) def test_simple_format(self, filename: str) -> None: diff --git a/tox.ini b/tox.ini index affc3c9..cbb0f75 100644 --- a/tox.ini +++ b/tox.ini @@ -7,9 +7,11 @@ skip_install = True deps = -r{toxinidir}/test_requirements.txt commands = - pip install -e .[d,python2] + pip install -e .[d] coverage erase - coverage run -m pytest tests {posargs} + coverage run -m pytest tests -m "not python2" {posargs} + pip install -e .[d,python2] + coverage run -m pytest tests -m "not without_python2" {posargs} coverage report [testenv:fuzz] -- 2.39.5