Skip to content

Commit 64fd890

Browse files
committed
fix: endblock falsely reported as uncovered when on its own line (issue #74)
In parent templates, a TEXT token inside a {% block %} can end with a whitespace-only fragment before {% endblock %} with no newline terminator. That fragment is not an executable line but was incorrectly added to source_lines, causing {% endblock %} to appear as an uncovered line. Skip the trailing fragment when inside a block (inblock=True).
1 parent 53d114a commit 64fd890

File tree

2 files changed

+75
-0
lines changed

2 files changed

+75
-0
lines changed

django_coverage_plugin/plugin.py

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -349,6 +349,13 @@ def lines(self):
349349
if lines[0].isspace():
350350
lineno += 1
351351
num_lines -= 1
352+
# When {% endblock %} is not at the start of a line, the
353+
# preceding TEXT token ends with whitespace and no newline.
354+
# That partial line is not executable content.
355+
if inblock and num_lines > 0 and (
356+
lines[-1].isspace() and not lines[-1].endswith(("\n", "\r"))
357+
):
358+
num_lines -= 1
352359
source_lines.update(range(lineno, lineno+num_lines))
353360

354361
if SHOW_PARSING:

tests/test_extends.py

Lines changed: 68 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,74 @@
88

99
class BlockTest(DjangoPluginTestCase):
1010

11+
def test_empty_parent_block_on_new_line_when_extended(self):
12+
"""
13+
When a block is empty and extended, endblock should not appear
14+
as an uncovered line.
15+
16+
https://github.com/coveragepy/django_coverage_plugin/issues/74
17+
"""
18+
self.make_template(name="base.html", text="""\
19+
Hello
20+
{% block content %}
21+
{% endblock content %}
22+
Goodbye
23+
""")
24+
self.make_template(name="child.html", text="""\
25+
{% extends "base.html" %}
26+
{% block content %}
27+
Override
28+
{% endblock %}
29+
""")
30+
text = self.run_django_coverage(name="child.html")
31+
self.assert_analysis([1, 2, 4], name="base.html")
32+
self.assert_analysis([1, 3], name="child.html")
33+
self.assertEqual(text.strip(), "Hello\n \n Override\n\nGoodbye")
34+
35+
def test_non_empty_parent_block_when_extended(self):
36+
self.make_template(name="base.html", text="""\
37+
Hello
38+
{% block content %}
39+
This line should be reported as uncovered.
40+
{% endblock content %}
41+
Goodbye
42+
""")
43+
self.make_template(name="child.html", text="""\
44+
{% extends "base.html" %}
45+
{% block content %}
46+
Override
47+
{% endblock %}
48+
""")
49+
text = self.run_django_coverage(name="child.html")
50+
self.assert_analysis([1, 2, 3, 5], missing=[3], name="base.html")
51+
self.assert_analysis([1, 3], name="child.html")
52+
53+
self.assertEqual(text.strip(), "Hello\n \n Override\n\nGoodbye")
54+
55+
def test_nested_blocks_outer_endblock_on_its_own_line(self):
56+
"""
57+
When blocks are nested, on their own lines, and extended,
58+
then endblock should not appear as uncovered.
59+
60+
Ref: https://github.com/coveragepy/django_coverage_plugin/issues/74
61+
"""
62+
self.make_template(name="base.html", text="""\
63+
{% block outer %}
64+
{% block inner %}
65+
{% endblock inner %}
66+
{% endblock outer %}
67+
""")
68+
self.make_template(name="child.html", text="""\
69+
{% extends "base.html" %}
70+
{% block inner %}
71+
Override
72+
{% endblock %}
73+
""")
74+
text = self.run_django_coverage(name="child.html")
75+
self.assert_analysis([1, 2], missing=[], name="base.html")
76+
self.assert_analysis([1, 3], name="child.html")
77+
self.assertEqual(text.strip(), "Override")
78+
1179
def test_empty_block(self):
1280
self.make_template("""\
1381
{% block somewhere %}{% endblock %}

0 commit comments

Comments
 (0)