Skip to content

Commit 8dc19fd

Browse files
committed
Improve the coverage checker, skip some trivial views (redirects and
flat templates) - Legacy-Id: 7078
1 parent c7a2c64 commit 8dc19fd

1 file changed

Lines changed: 27 additions & 17 deletions

File tree

ietf/utils/test_runner.py

Lines changed: 27 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -93,41 +93,51 @@ def process_request(self, request):
9393
if request.user.is_authenticated() and "REMOTE_USER" not in request.META:
9494
request.META["REMOTE_USER"] = request.user.username
9595

96-
def get_patterns(module):
97-
all = []
96+
def get_url_patterns(module):
97+
res = []
9898
try:
9999
patterns = module.urlpatterns
100100
except AttributeError:
101101
patterns = []
102102
for item in patterns:
103103
try:
104-
subpatterns = get_patterns(item.urlconf_module)
104+
subpatterns = get_url_patterns(item.urlconf_module)
105105
except:
106-
subpatterns = [""]
107-
for sub in subpatterns:
106+
subpatterns = [("", None)]
107+
for sub, subitem in subpatterns:
108108
if not sub:
109-
all.append(item.regex.pattern)
109+
res.append((item.regex.pattern, item))
110110
elif sub.startswith("^"):
111-
all.append(item.regex.pattern + sub[1:])
111+
res.append((item.regex.pattern + sub[1:], subitem))
112112
else:
113-
all.append(item.regex.pattern + ".*" + sub)
114-
return all
113+
res.append((item.regex.pattern + ".*" + sub, subitem))
114+
return res
115115

116116
def check_url_coverage():
117-
patterns = get_patterns(ietf.urls)
117+
import ietf.urls
118118

119-
IGNORED_PATTERNS = ("admin",)
119+
url_patterns = get_url_patterns(ietf.urls)
120120

121-
patterns = [(p, re.compile(p)) for p in patterns if p[1:].split("/")[0] not in IGNORED_PATTERNS]
121+
# skip some patterns that we don't bother with
122+
def ignore_pattern(regex, pattern):
123+
import django.views.static
124+
return (regex in ("^_test500/",)
125+
or regex.startswith("^admin/")
126+
or getattr(pattern.callback, "__name__", "") == "RedirectView"
127+
or getattr(pattern.callback, "__name__", "") == "TemplateView"
128+
or pattern.callback == django.views.static.serve)
129+
130+
patterns = [(regex, re.compile(regex)) for regex, pattern in url_patterns
131+
if not ignore_pattern(regex, pattern)]
122132

123133
covered = set()
124134
for url in visited_urls:
125-
for pattern, compiled in patterns:
126-
if pattern not in covered and compiled.match(url[1:]): # strip leading /
127-
covered.add(pattern)
135+
for regex, compiled in patterns:
136+
if regex not in covered and compiled.match(url[1:]): # strip leading /
137+
covered.add(regex)
128138
break
129139

130-
missing = list(set(p for p, compiled in patterns) - covered)
140+
missing = list(set(regex for regex, compiled in patterns) - covered)
131141

132142
if missing:
133143
print "The following URL patterns were not tested"
@@ -225,8 +235,8 @@ def run_tests(self, test_labels, extra_tests=None, **kwargs):
225235
failures = super(IetfTestRunner, self).run_tests(test_labels, extra_tests=extra_tests, **kwargs)
226236

227237
if check_coverage and not failures:
228-
check_url_coverage()
229238
check_template_coverage()
239+
check_url_coverage()
230240

231241
print "0 test failures - coverage shown above"
232242

0 commit comments

Comments
 (0)