diff options
author | Aurélien Bompard <aurelien@bompard.org> | 2013-07-18 18:30:06 +0200 |
---|---|---|
committer | Aurélien Bompard <aurelien@bompard.org> | 2013-07-18 18:30:06 +0200 |
commit | 859c8ca6e54d95b8fd6b26487a09165f0a294025 (patch) | |
tree | 7a85e95873b716e3b134a42962c4b39b306b2889 | |
parent | 63db25bb5e1a2605c7a2fdaabcba32422191f70b (diff) | |
download | hyperkitty-859c8ca6e54d95b8fd6b26487a09165f0a294025.tar.gz hyperkitty-859c8ca6e54d95b8fd6b26487a09165f0a294025.tar.xz hyperkitty-859c8ca6e54d95b8fd6b26487a09165f0a294025.zip |
Add unit tests for the reattach page
-rw-r--r-- | hyperkitty/tests/test_views.py | 150 | ||||
-rw-r--r-- | hyperkitty/views/thread.py | 2 |
2 files changed, 150 insertions, 2 deletions
diff --git a/hyperkitty/tests/test_views.py b/hyperkitty/tests/test_views.py index fb7945d..b39544c 100644 --- a/hyperkitty/tests/test_views.py +++ b/hyperkitty/tests/test_views.py @@ -254,3 +254,153 @@ class ListArchivesTestCase(TestCase): 'month': today.month, }) self.assertEqual(response["location"], final_url) + + + +from hyperkitty.views.thread import reattach, reattach_suggest + +class ReattachTestCase(TestCase): + + def setUp(self): + self.user = User.objects.create_user('testuser', 'test@example.com', 'testPass') + self.user.is_staff = True + self.client.login(username='testuser', password='testPass') + self.store = kittystore.get_store("sqlite:", debug=False) + ml = FakeList("list@example.com") + ml.subject_prefix = u"[example] " + # Create 2 threads + self.messages = [] + for msgnum in range(2): + msg = Message() + msg["From"] = "dummy@example.com" + msg["Message-ID"] = "<id%d>" % (msgnum+1) + msg["Subject"] = "Dummy message" + msg.set_payload("Dummy message") + msg["Message-ID-Hash"] = self.store.add_to_list(ml, msg) + self.messages.append(msg) + # Factory + defaults = {"kittystore.store": self.store, "HTTP_USER_AGENT": "testbot"} + self.factory = RequestFactory(**defaults) + + def test_suggestions(self): + threadid = self.messages[0]["Message-ID-Hash"] + request = self.factory.get(reverse('thread_reattach_suggest', + args=["list@example.com", threadid])) + msg2 = self.store.get_message_by_id_from_list("list@example.com", "id2") + self.store.search = Mock(return_value={"results": [msg2]}) + response = reattach_suggest(request, "list@example.com", threadid) + self.store.search.assert_called_with( + u'dummy message', 'list@example.com', 1, 50) + other_threadid = self.messages[1]["Message-ID-Hash"] + expected = '<input type="radio" name="parent" value="%s" />' % other_threadid + self.assertContains(response, expected, count=1, status_code=200) + + def test_reattach(self): + threadid1 = self.messages[0]["Message-ID-Hash"] + threadid2 = self.messages[1]["Message-ID-Hash"] + request = self.factory.post(reverse('thread_reattach', + args=["list@example.com", threadid2]), + data={"parent": threadid1}) + request.user = self.user + response = reattach(request, "list@example.com", threadid2) + now = datetime.datetime.now() + threads = self.store.get_threads("list@example.com", + now - datetime.timedelta(days=1), + now + datetime.timedelta(days=1)) + self.assertEqual(len(threads), 1) + self.assertEqual(threads[0].thread_id, threadid1) + expected_url = reverse('thread', args=["list@example.com", threadid1]) + "?msg=attached-ok" + self.assertEqual(response["location"], expected_url) + + def test_reattach_manual(self): + threadid1 = self.messages[0]["Message-ID-Hash"] + threadid2 = self.messages[1]["Message-ID-Hash"] + request = self.factory.post(reverse('thread_reattach', + args=["list@example.com", threadid2]), + data={"parent": "", + "parent-manual": threadid1}) + request.user = self.user + response = reattach(request, "list@example.com", threadid2) + now = datetime.datetime.now() + threads = self.store.get_threads("list@example.com", + now - datetime.timedelta(days=1), + now + datetime.timedelta(days=1)) + self.assertEqual(len(threads), 1) + self.assertEqual(threads[0].thread_id, threadid1) + expected_url = reverse('thread', args=["list@example.com", threadid1]) + "?msg=attached-ok" + self.assertEqual(response["location"], expected_url) + + def test_reattach_invalid(self): + threadid = self.messages[0]["Message-ID-Hash"] + request = self.factory.post(reverse('thread_reattach', + args=["list@example.com", threadid]), + data={"parent": "invalid-data"}) + request.user = self.user + self.store.attach_to_thread = Mock() + response = reattach(request, "list@example.com", threadid) + self.assertFalse(self.store.attach_to_thread.called) + now = datetime.datetime.now() + threads = self.store.get_threads("list@example.com", + now - datetime.timedelta(days=1), + now + datetime.timedelta(days=1)) + self.assertEqual(len(threads), 2) + errormsg = '<div class="flashmsgs"><div class="flashmsg-wrapper"><div class="alert alert-error">' + self.assertContains(response, '<div class="alert alert-warning">', + count=1, status_code=200) + self.assertContains(response, "Invalid thread id, it should look") + + def test_reattach_on_itself(self): + threadid = self.messages[0]["Message-ID-Hash"] + request = self.factory.post(reverse('thread_reattach', + args=["list@example.com", threadid]), + data={"parent": threadid}) + request.user = self.user + self.store.attach_to_thread = Mock() + response = reattach(request, "list@example.com", threadid) + self.assertFalse(self.store.attach_to_thread.called) + now = datetime.datetime.now() + threads = self.store.get_threads("list@example.com", + now - datetime.timedelta(days=1), + now + datetime.timedelta(days=1)) + self.assertEqual(len(threads), 2) + errormsg = '<div class="flashmsgs"><div class="flashmsg-wrapper"><div class="alert alert-error">' + self.assertContains(response, '<div class="alert alert-warning">', + count=1, status_code=200) + self.assertContains(response, "Can't re-attach a thread to itself") + + def test_reattach_on_unknown(self): + threadid = self.messages[0]["Message-ID-Hash"] + threadid_unknown = "L36TVP2EFFDSXGVNQJCY44W5AB2YMJ65" + request = self.factory.post(reverse('thread_reattach', + args=["list@example.com", threadid]), + data={"parent": threadid_unknown}) + request.user = self.user + self.store.attach_to_thread = Mock() + response = reattach(request, "list@example.com", threadid) + self.assertFalse(self.store.attach_to_thread.called) + now = datetime.datetime.now() + errormsg = '<div class="flashmsgs"><div class="flashmsg-wrapper"><div class="alert alert-error">' + self.assertContains(response, '<div class="alert alert-warning">', + count=1, status_code=200) + self.assertContains(response, "Unknown thread") + + def test_reattach_old_to_new(self): + threadid1 = self.messages[0]["Message-ID-Hash"] + threadid2 = self.messages[1]["Message-ID-Hash"] + request = self.factory.post(reverse('thread_reattach', + args=["list@example.com", threadid1]), + data={"parent": threadid2}) + request.user = self.user + self.store.attach_to_thread = Mock() + response = reattach(request, "list@example.com", threadid1) + self.assertFalse(self.store.attach_to_thread.called) + now = datetime.datetime.now() + threads = self.store.get_threads("list@example.com", + now - datetime.timedelta(days=1), + now + datetime.timedelta(days=1)) + self.assertEqual(len(threads), 2) + errormsg = '<div class="flashmsgs"><div class="flashmsg-wrapper"><div class="alert alert-error">' + self.assertContains(response, '<div class="alert alert-error">', + count=1, status_code=200) + self.assertContains(response, "Can't attach an older thread to a newer thread.", + count=1, status_code=200) diff --git a/hyperkitty/views/thread.py b/hyperkitty/views/thread.py index 5742703..a067aab 100644 --- a/hyperkitty/views/thread.py +++ b/hyperkitty/views/thread.py @@ -347,8 +347,6 @@ def reattach(request, mlist_fqdn, threadid): if not parent_tid: parent_tid = request.POST.get("parent-manual") if not parent_tid or not re.match("\w{32}", parent_tid): - raise ValueError("Invalid thread id, it should look like " - "OUAASTM6GS4E5TEATD6R2VWMULG44NKJ") flash_messages.append({"type": "warning", "msg": "Invalid thread id, it should look " "like OUAASTM6GS4E5TEATD6R2VWMULG44NKJ."}) |