From 0d9c97c5cad5a6b1e6f1aa9b91d31bf7223e3b62 Mon Sep 17 00:00:00 2001 From: Henrik Levkowetz Date: Sat, 10 Nov 2018 19:06:40 +0000 Subject: [PATCH] Added a test that checks the mailarch search failure return, and tweaks the no-result return handling. - Legacy-Id: 15745 --- ietf/doc/tests_review.py | 16 ++++++++++++++++ ietf/doc/views_review.py | 7 +++---- ietf/review/mailarch.py | 11 ++++++++--- 3 files changed, 27 insertions(+), 7 deletions(-) diff --git a/ietf/doc/tests_review.py b/ietf/doc/tests_review.py index e169ac91f..a018fd7dd 100644 --- a/ietf/doc/tests_review.py +++ b/ietf/doc/tests_review.py @@ -525,6 +525,22 @@ class ReviewTests(TestCase): self.assertEqual(messages[1]["subject"], "Review of {}".format(review_req.doc.name)) self.assertEqual(messages[1]["splitfrom"], ["John Doe II", "johndoe2@example.com"]) self.assertEqual(messages[1]["utcdate"][0], "") + + + # Test failure to return mailarch results + no_result_path = os.path.join(self.review_dir, "mailarch_no_result.html") + with open(no_result_path, "w") as f: + f.write('Content-Type: text/html\n\n
No results found
') + ietf.review.mailarch.construct_query_urls = lambda review_req, query=None: { "query_data_url": "file://" + os.path.abspath(no_result_path) } + + url = urlreverse('ietf.doc.views_review.search_mail_archive', kwargs={ "name": doc.name, "request_id": review_req.pk }) + + r = self.client.get(url) + self.assertEqual(r.status_code, 200) + result = json.loads(r.content) + self.assertNotIn('messages', result) + self.assertIn('No results found', result['error']) + finally: ietf.review.mailarch.construct_query_urls = real_fn diff --git a/ietf/doc/views_review.py b/ietf/doc/views_review.py index 386efd119..9e8841c98 100644 --- a/ietf/doc/views_review.py +++ b/ietf/doc/views_review.py @@ -703,11 +703,10 @@ def search_mail_archive(request, name, request_id): try: res["messages"] = mailarch.retrieve_messages(res["query_data_url"])[:MAX_RESULTS] + except KeyError as e: + res["error"] = "No results found" except Exception as e: - if unicode(e) == "NONE": - res["error"] = "No results found" - else: - res["error"] = "Retrieval from mail archive failed: %s" % unicode(e) + res["error"] = "Retrieval from mail archive failed: %s" % unicode(e) # raise # useful when debugging return JsonResponse(res) diff --git a/ietf/review/mailarch.py b/ietf/review/mailarch.py index 03ca543c8..ba6863115 100644 --- a/ietf/review/mailarch.py +++ b/ietf/review/mailarch.py @@ -4,7 +4,9 @@ import datetime, tarfile, mailbox, tempfile, hashlib, base64, email.utils import urllib import urllib2, contextlib -import re +import debug # pyflakes:ignore + +from pyquery import PyQuery from django.conf import settings @@ -94,8 +96,11 @@ def retrieve_messages(query_data_url): content_type = fileobj.info()["Content-type"] if not content_type.startswith("application/x-tar"): if content_type.startswith("text/html"): - if not re.search("no-results", fileobj.read(20000)) is None: - raise Exception("NONE") + r = fileobj.read(20000) + q = PyQuery(r) + div = q('div[class~="no-results"]') + if div: + raise KeyError("No results: %s -> %s" % (query_data_url, div.text(), )) raise Exception("Export failed - this usually means no matches were found") with tarfile.open(fileobj=fileobj, mode='r|*') as tar: