summaryrefslogtreecommitdiff
path: root/tests/test_report_core.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/test_report_core.py')
-rw-r--r--tests/test_report_core.py68
1 files changed, 68 insertions, 0 deletions
diff --git a/tests/test_report_core.py b/tests/test_report_core.py
new file mode 100644
index 00000000..77e234b6
--- /dev/null
+++ b/tests/test_report_core.py
@@ -0,0 +1,68 @@
+# Licensed under the Apache License: http://www.apache.org/licenses/LICENSE-2.0
+# For details: https://github.com/nedbat/coveragepy/blob/master/NOTICE.txt
+
+"""Tests for helpers in report.py"""
+
+from __future__ import annotations
+
+from typing import IO, Iterable, List, Optional, Type
+
+import pytest
+
+from coverage.exceptions import CoverageException
+from coverage.report_core import render_report
+from coverage.types import TMorf
+
+from tests.coveragetest import CoverageTest
+
+
+class FakeReporter:
+ """A fake implementation of a one-file reporter."""
+
+ report_type = "fake report file"
+
+ def __init__(self, output: str = "", error: Optional[Type[Exception]] = None) -> None:
+ self.output = output
+ self.error = error
+ self.morfs: Optional[Iterable[TMorf]] = None
+
+ def report(self, morfs: Optional[Iterable[TMorf]], outfile: IO[str]) -> float:
+ """Fake."""
+ self.morfs = morfs
+ outfile.write(self.output)
+ if self.error:
+ raise self.error("You asked for it!")
+ return 17.25
+
+
+class RenderReportTest(CoverageTest):
+ """Tests of render_report."""
+
+ def test_stdout(self) -> None:
+ fake = FakeReporter(output="Hello!\n")
+ msgs: List[str] = []
+ res = render_report("-", fake, [pytest, "coverage"], msgs.append)
+ assert res == 17.25
+ assert fake.morfs == [pytest, "coverage"]
+ assert self.stdout() == "Hello!\n"
+ assert not msgs
+
+ def test_file(self) -> None:
+ fake = FakeReporter(output="Gréètings!\n")
+ msgs: List[str] = []
+ res = render_report("output.txt", fake, [], msgs.append)
+ assert res == 17.25
+ assert self.stdout() == ""
+ with open("output.txt", "rb") as f:
+ assert f.read().rstrip() == b"Gr\xc3\xa9\xc3\xa8tings!"
+ assert msgs == ["Wrote fake report file to output.txt"]
+
+ @pytest.mark.parametrize("error", [CoverageException, ZeroDivisionError])
+ def test_exception(self, error: Type[Exception]) -> None:
+ fake = FakeReporter(error=error)
+ msgs: List[str] = []
+ with pytest.raises(error, match="You asked for it!"):
+ render_report("output.txt", fake, [], msgs.append)
+ assert self.stdout() == ""
+ self.assert_doesnt_exist("output.txt")
+ assert not msgs