summaryrefslogtreecommitdiff
path: root/tests/test_config.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_config.py')
-rw-r--r--tests/test_config.py123
1 files changed, 123 insertions, 0 deletions
diff --git a/tests/test_config.py b/tests/test_config.py
index fcbac816..49574241 100644
--- a/tests/test_config.py
+++ b/tests/test_config.py
@@ -56,6 +56,36 @@ class ConfigTest(CoverageTest):
self.assertFalse(cov.config.branch)
self.assertEqual(cov.config.data_file, "delete.me")
+ def test_toml_config_file(self):
+ # A .coveragerc file will be read into the configuration.
+ self.make_file("pyproject.toml", """\
+ # This is just a bogus toml file for testing.
+ [tool.coverage.run]
+ concurrency = ["a", "b"]
+ timid = true
+ data_file = ".hello_kitty.data"
+ [tool.coverage.report]
+ precision = 3
+ fail_under = 90.5
+ """)
+ cov = coverage.Coverage(config_file="pyproject.toml")
+ self.assertTrue(cov.config.timid)
+ self.assertFalse(cov.config.branch)
+ self.assertEqual(cov.config.concurrency, ["a", "b"])
+ self.assertEqual(cov.config.data_file, ".hello_kitty.data")
+ self.assertEqual(cov.config.precision, 3)
+ self.assertAlmostEqual(cov.config.fail_under, 90.5)
+
+ # Test that our class doesn't reject integers when loading floats
+ self.make_file("pyproject.toml", """\
+ # This is just a bogus toml file for testing.
+ [tool.coverage.report]
+ fail_under = 90
+ """)
+ cov = coverage.Coverage(config_file="pyproject.toml")
+ self.assertAlmostEqual(cov.config.fail_under, 90)
+ self.assertIsInstance(cov.config.fail_under, float)
+
def test_ignored_config_file(self):
# You can disable reading the .coveragerc file.
self.make_file(".coveragerc", """\
@@ -142,6 +172,33 @@ class ConfigTest(CoverageTest):
with self.assertRaisesRegex(CoverageException, msg):
coverage.Coverage()
+ def test_toml_parse_errors(self):
+ # Im-parsable values raise CoverageException, with details.
+ bad_configs_and_msgs = [
+ ("[tool.coverage.run]\ntimid = \"maybe?\"\n", r"maybe[?]"),
+ # ("timid = 1\n", r"timid = 1"),
+ ("[tool.coverage.run\n", r"Key group"),
+ ('[tool.coverage.report]\nexclude_lines = ["foo("]\n',
+ r"Invalid \[report\].exclude_lines value u?'foo\(': "
+ r"(unbalanced parenthesis|missing \))"),
+ ('[tool.coverage.report]\npartial_branches = ["foo["]\n',
+ r"Invalid \[report\].partial_branches value u?'foo\[': "
+ r"(unexpected end of regular expression|unterminated character set)"),
+ ('[tool.coverage.report]\npartial_branches_always = ["foo***"]\n',
+ r"Invalid \[report\].partial_branches_always value "
+ r"u?'foo\*\*\*': "
+ r"multiple repeat"),
+ ('[tool.coverage.run]\nconcurrency="foo"', "not a list"),
+ ("[tool.coverage.report]\nprecision=1.23", "not an integer"),
+ ('[tool.coverage.report]\nfail_under="s"', "not a float"),
+ ]
+
+ for bad_config, msg in bad_configs_and_msgs:
+ print("Trying %r" % bad_config)
+ self.make_file("pyproject.toml", bad_config)
+ with self.assertRaisesRegex(CoverageException, msg):
+ coverage.Coverage()
+
def test_environment_vars_in_config(self):
# Config files can have $envvars in them.
self.make_file(".coveragerc", """\
@@ -167,6 +224,31 @@ class ConfigTest(CoverageTest):
["the_$one", "anotherZZZ", "xZZZy", "xy", "huh${X}what"]
)
+ def test_environment_vars_in_toml_config(self):
+ # Config files can have $envvars in them.
+ self.make_file("pyproject.toml", """\
+ [tool.coverage.run]
+ data_file = "$DATA_FILE.fooey"
+ branch = true
+ [tool.coverage.report]
+ exclude_lines = [
+ "the_$$one",
+ "another${THING}",
+ "x${THING}y",
+ "x${NOTHING}y",
+ "huh$${X}what",
+ ]
+ """)
+ self.set_environ("DATA_FILE", "hello-world")
+ self.set_environ("THING", "ZZZ")
+ cov = coverage.Coverage()
+ self.assertEqual(cov.config.data_file, "hello-world.fooey")
+ self.assertEqual(cov.config.branch, True)
+ self.assertEqual(
+ cov.config.exclude_list,
+ ["the_$one", "anotherZZZ", "xZZZy", "xy", "huh${X}what"]
+ )
+
def test_tilde_in_config(self):
# Config entries that are file paths can be tilde-expanded.
self.make_file(".coveragerc", """\
@@ -198,6 +280,38 @@ class ConfigTest(CoverageTest):
self.assertEqual(cov.config.xml_output, "/Users/me/somewhere/xml.out")
self.assertEqual(cov.config.exclude_list, ["~/data.file", "~joe/html_dir"])
+ def test_tilde_in_toml_config(self):
+ # Config entries that are file paths can be tilde-expanded.
+ self.make_file("pyproject.toml", """\
+ [tool.coverage.run]
+ data_file = "~/data.file"
+
+ [tool.coverage.html]
+ directory = "~joe/html_dir"
+
+ [tool.coverage.xml]
+ output = "~/somewhere/xml.out"
+
+ [tool.coverage.report]
+ # Strings that aren't file paths are not tilde-expanded.
+ exclude_lines = [
+ "~/data.file",
+ "~joe/html_dir",
+ ]
+ """)
+ def expanduser(s):
+ """Fake tilde expansion"""
+ s = s.replace("~/", "/Users/me/")
+ s = s.replace("~joe/", "/Users/joe/")
+ return s
+
+ with mock.patch.object(coverage.config.os.path, 'expanduser', new=expanduser):
+ cov = coverage.Coverage()
+ self.assertEqual(cov.config.data_file, "/Users/me/data.file")
+ self.assertEqual(cov.config.html_dir, "/Users/joe/html_dir")
+ self.assertEqual(cov.config.xml_output, "/Users/me/somewhere/xml.out")
+ self.assertEqual(cov.config.exclude_list, ["~/data.file", "~joe/html_dir"])
+
def test_tweaks_after_constructor(self):
# set_option can be used after construction to affect the config.
cov = coverage.Coverage(timid=True, data_file="fooey.dat")
@@ -246,6 +360,15 @@ class ConfigTest(CoverageTest):
with self.assertRaisesRegex(CoverageException, msg):
_ = coverage.Coverage()
+ def test_unknown_option_toml(self):
+ self.make_file("pyproject.toml", """\
+ [tool.coverage.run]
+ xyzzy = 17
+ """)
+ msg = r"Unrecognized option '\[run\] xyzzy=' in config file pyproject.toml"
+ with self.assertRaisesRegex(CoverageException, msg):
+ _ = coverage.Coverage()
+
def test_misplaced_option(self):
self.make_file(".coveragerc", """\
[report]