def setUp(self): self.user = User.objects.create_user('testuser', '*****@*****.**', 'testPass') self.user.is_staff = True self.user.save() self.client.login(username='******', password='******') self.store = kittystore.get_store(SettingsModule(), debug=False, auto_create=True) self.client.defaults = { "kittystore.store": self.store, "HTTP_USER_AGENT": "testbot", } ml = FakeList("*****@*****.**") ml.subject_prefix = u"[example] " # Create 2 threads self.messages = [] for msgnum in range(2): msg = Message() msg["From"] = "*****@*****.**" 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)
def setUp(self): self.user = User.objects.create_user('testuser', '*****@*****.**', 'testPass') self.client.login(username='******', password='******') # Create test data ml = FakeList("*****@*****.**") ml.subject_prefix = u"[example] " # Create 3 threads messages = [] for msgnum in range(3): msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<id%d>" % (msgnum+1) msg["Subject"] = "Dummy message" msg.set_payload("Dummy message") self.store.add_to_list(ml, msg) messages.append(msg) # 1st is unread, 2nd is read, 3rd is updated LastView.objects.create(list_address="*****@*****.**", user=self.user, threadid=get_message_id_hash("<id2>")) LastView.objects.create(list_address="*****@*****.**", user=self.user, threadid=get_message_id_hash("<id3>")) msg4 = Message() msg4["From"] = "*****@*****.**" msg4["Message-ID"] = "<id4>" msg4["Subject"] = "Dummy message" msg4["In-Reply-To"] = "<id3>" msg4.set_payload("Dummy message") self.store.add_to_list(ml, msg4)
def setUp(self): self.user = User.objects.create_user('testuser', '*****@*****.**', 'testPass') self.client.login(username='******', password='******') store = kittystore.get_store(SettingsModule(), debug=False, auto_create=True) self.client.defaults = {"kittystore.store": store, "HTTP_USER_AGENT": "testbot", } # Create test data ml = FakeList("*****@*****.**") ml.subject_prefix = u"[example] " # Create 3 threads messages = [] for msgnum in range(3): msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<id%d>" % (msgnum+1) msg["Subject"] = "Dummy message" msg.set_payload("Dummy message") store.add_to_list(ml, msg) messages.append(msg) # 1st is unread, 2nd is read, 3rd is updated LastView.objects.create(list_address="*****@*****.**", user=self.user, threadid=get_message_id_hash("<id2>")) LastView.objects.create(list_address="*****@*****.**", user=self.user, threadid=get_message_id_hash("<id3>")) msg4 = Message() msg4["From"] = "*****@*****.**" msg4["Message-ID"] = "<id4>" msg4["Subject"] = "Dummy message" msg4["In-Reply-To"] = "<id3>" msg4.set_payload("Dummy message") store.add_to_list(ml, msg4)
def setUp(self): self.user = User.objects.create_user('testuser', '*****@*****.**', 'testPass') self.client.login(username='******', password='******') store = kittystore.get_store(SettingsModule(), debug=False) ml = FakeList("*****@*****.**") ml.subject_prefix = u"[example] " # Create 3 threads messages = [] for msgnum in range(3): msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<id%d>" % (msgnum + 1) msg["Subject"] = "Dummy message" msg.set_payload("Dummy message") store.add_to_list(ml, msg) messages.append(msg) # 1st is unread, 2nd is read, 3rd is updated LastView.objects.create(list_address="*****@*****.**", user=self.user, threadid=get_message_id_hash("<id2>")) LastView.objects.create(list_address="*****@*****.**", user=self.user, threadid=get_message_id_hash("<id3>")) msg4 = Message() msg4["From"] = "*****@*****.**" msg4["Message-ID"] = "<id4>" msg4["Subject"] = "Dummy message" msg4["In-Reply-To"] = "<id3>" msg4.set_payload("Dummy message") store.add_to_list(ml, msg4) # Factory defaults = {"kittystore.store": store, "HTTP_USER_AGENT": "testbot"} self.factory = RequestFactory(**defaults)
def test_private_list(self): # emails on private lists must not be found by a search on all lists ml = FakeList("example-list") ml.archive_policy = ArchivePolicy.private msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<dummy>" msg.set_payload("Dummy message") self.store.add_to_list(ml, msg) result = self.store.search("dummy") self.assertEqual(result["total"], 0)
def add_fetch_data(self): msg = Message() msg["From"] = "*****@*****.**" msg["Subject"] = "Fake Subject" msg["Message-ID"] = "<dummy>" msg["Date"] = "Fri, 02 Nov 2012 16:07:54" msg.set_payload("Fake Message") ml = FakeList("example-list") ml.display_name = u"name 1" ml.subject_prefix = u"[prefix 1]" return ml.fqdn_listname, self.store.add_to_list(ml, msg)
def test_update_list(self): """List records must be updated when changed in Mailman""" msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<dummy>" msg.set_payload("Dummy message") ml = FakeList("example-list") ml.display_name = u"name 1" self.store.add_to_list(ml, msg) ml_db = self.store.db.find(List).one() self.assertEqual(ml_db.display_name, "name 1") ml.display_name = u"name 2" self.store.add_to_list(ml, msg) ml_db = self.store.db.find(List).one() self.assertEqual(ml_db.display_name, "name 2")
def test_vote_cancel(self): ml = FakeList("*****@*****.**") msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<msg1>" msg.set_payload("Dummy message") self.store.add_to_list(ml, msg) msg.replace_header("Message-ID", "<msg2>") self.store.add_to_list(ml, msg) msg1 = self.store.get_message_by_id_from_list("*****@*****.**", "msg1") msg1.vote(1, u"testuser") msg2 = self.store.get_message_by_id_from_list("*****@*****.**", "msg2") msg2.vote(-1, u"testuser") self.assertEqual(msg1.likes, 1) self.assertEqual(msg2.dislikes, 1) for msg in (msg1, msg2): url = reverse('message_vote', args=("*****@*****.**", msg.message_id_hash)) resp = self.client.post(url, {"vote": "0"}) self.assertEqual(resp.status_code, 200) self.assertEqual(msg.likes, 0) self.assertEqual(msg.dislikes, 0) result = json.loads(resp.content) self.assertEqual(result["like"], 0) self.assertEqual(result["dislike"], 0)
def test_add_in_classical_thread(self): # msg1 # |-msg2 # | `-msg4 # `-msg3 ml = FakeList("example-list") msgs = [] for num in range(1, 5): msg = Message() msg["From"] = "*****@*****.**" % num msg["Message-ID"] = "<msg%d>" % num msg.set_payload("message %d" % num) msgs.append(msg) msgs[1]["In-Reply-To"] = "<msg1>" msgs[2]["In-Reply-To"] = "<msg1>" msgs[3]["In-Reply-To"] = "<msg2>" for msg in msgs: self.store.add_to_list(ml, msg) msgs = [] for num in range(1, 5): msg = self.store.get_message_by_id_from_list( "example-list", "msg%d" % num) msgs.append(msg) msg1, msg2, msg3, msg4 = msgs self.assertEqual(msg1.thread_order, 0) self.assertEqual(msg1.thread_depth, 0) self.assertEqual(msg2.thread_order, 1) self.assertEqual(msg2.thread_depth, 1) self.assertEqual(msg3.thread_order, 3) self.assertEqual(msg3.thread_depth, 1) self.assertEqual(msg4.thread_order, 2) self.assertEqual(msg4.thread_depth, 2)
def setUp(self): self.user = User.objects.create_user('testuser', '*****@*****.**', 'testPass') self.user.is_staff = True self.user.save() self.client.login(username='******', password='******') ml = FakeList("*****@*****.**") ml.subject_prefix = u"[example] " # Create 2 threads self.messages = [] for msgnum in range(2): msg = Message() msg["From"] = "*****@*****.**" 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)
def setUp(self): self.tmpdir = mkdtemp(prefix="hyperkitty-testing-") self.user = User.objects.create_user('testuser', '*****@*****.**', 'testPass') settings = SettingsModule() settings.KITTYSTORE_SEARCH_INDEX = self.tmpdir self.store = kittystore.get_store(settings, debug=False, auto_create=True) self.client.defaults = {"kittystore.store": self.store, "HTTP_USER_AGENT": "testbot", } ml = FakeList("*****@*****.**") ml.subject_prefix = u"[example] " ml.archive_policy = ArchivePolicy.private msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<msgid>" msg["Subject"] = "Dummy message" msg.set_payload("Dummy message") msg["Message-ID-Hash"] = self.msgid = self.store.add_to_list(ml, msg)
def test_date_aware(self): msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<dummy>" msg["Date"] = "Fri, 02 Nov 2012 16:07:54 +0100" msg.set_payload("Dummy message") try: self.store.add_to_list(FakeList("example-list"), msg) except IntegrityError, e: self.fail(e)
def test_no_date(self): msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<dummy>" msg.set_payload("Dummy message") now = datetime.datetime.utcnow() try: self.store.add_to_list(FakeList("example-list"), msg) except IntegrityError, e: self.fail(e)
def test_subject(self): ml = FakeList("example-list") msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<dummymsg>" msg["Date"] = "Fri, 02 Nov 2012 16:07:54 +0000" msg["Subject"] = "Dummy subject" msg.set_payload("Dummy message") self.store.add_to_list(ml, msg) thread = self.store.db.find(Thread).one() self.assertEqual(thread.subject, "Dummy subject")
def setUp(self): self.user = User.objects.create_user('testuser', '*****@*****.**', 'testPass') self.user.is_staff = True self.client.login(username='******', password='******') self.store = kittystore.get_store(SettingsModule(), debug=False) ml = FakeList("*****@*****.**") ml.subject_prefix = u"[example] " # Create 2 threads self.messages = [] for msgnum in range(2): msg = Message() msg["From"] = "*****@*****.**" 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 setUp(self): self.tmpdir = mkdtemp(prefix="hyperkitty-testing-") self.user = User.objects.create_user('testuser', '*****@*****.**', 'testPass') settings = SettingsModule() settings.KITTYSTORE_SEARCH_INDEX = self.tmpdir self.store = kittystore.get_store(settings, debug=False, auto_create=True) self.client.defaults = { "kittystore.store": self.store, "HTTP_USER_AGENT": "testbot", } ml = FakeList("*****@*****.**") ml.subject_prefix = u"[example] " ml.archive_policy = ArchivePolicy.private msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<msgid>" msg["Subject"] = "Dummy message" msg.set_payload("Dummy message") msg["Message-ID-Hash"] = self.msgid = self.store.add_to_list(ml, msg)
def test_thread_neighbors(self): ml = FakeList("example-list") # Create 3 threads msg_t1_1 = Message() msg_t1_1["From"] = "*****@*****.**" msg_t1_1["Message-ID"] = "<id1_1>" msg_t1_1.set_payload("Dummy message") self.store.add_to_list(ml, msg_t1_1) msg_t2_1 = Message() msg_t2_1["From"] = "*****@*****.**" msg_t2_1["Message-ID"] = "<id2_1>" msg_t2_1.set_payload("Dummy message") self.store.add_to_list(ml, msg_t2_1) msg_t3_1 = Message() msg_t3_1["From"] = "*****@*****.**" msg_t3_1["Message-ID"] = "<id3_1>" msg_t3_1.set_payload("Dummy message") self.store.add_to_list(ml, msg_t3_1) # Check the neighbors def check_neighbors(thread, expected_prev, expected_next): thread_id = get_message_id_hash("<id%s_1>" % thread) prev_th, next_th = self.store.get_thread_neighbors( "example-list", thread_id) # convert to something I can compare prev_th = prev_th and prev_th.thread_id expected_prev = expected_prev and \ get_message_id_hash("<id%s_1>" % expected_prev) next_th = next_th and next_th.thread_id expected_next = expected_next and \ get_message_id_hash("<id%s_1>" % expected_next) # compare self.assertEqual(prev_th, expected_prev) self.assertEqual(next_th, expected_next) # Order should be: 1, 2, 3 check_neighbors(1, None, 2) check_neighbors(2, 1, 3) check_neighbors(3, 2, None) # now add a new message in thread 1, which becomes the most recently # active msg_t1_2 = Message() msg_t1_2["From"] = "*****@*****.**" msg_t1_2["Message-ID"] = "<id1_2>" msg_t1_2["In-Reply-To"] = "<id1_1>" msg_t1_2.set_payload("Dummy message") self.store.add_to_list(ml, msg_t1_2) # Order should be: 2, 3, 1 check_neighbors(2, None, 3) check_neighbors(3, 2, 1) check_neighbors(1, 3, None)
def test_attachment_insert_order(self): """Attachments must not be inserted in the DB before the email""" # Re-activate foreign key support in sqlite self.store.db._connection._raw_connection.isolation_level = 'IMMEDIATE' self.store.db.execute("PRAGMA foreign_keys = ON") self.store.db._connection._raw_connection.execute( "PRAGMA foreign_keys = ON") #print "*"*10, list(self.store.db.execute("PRAGMA foreign_keys")) #self.store = get_storm_store("postgres://*****:*****@localhost/kittystore_test") with open(get_test_file("attachment-1.txt")) as email_file: msg = email.message_from_file(email_file, _class=Message) try: self.store.add_to_list(FakeList("example-list"), msg) except IntegrityError, e: self.fail(e)
def setUp(self): store = kittystore.get_store(SettingsModule(), debug=False, auto_create=True) self.client.defaults = { "kittystore.store": store, "HTTP_USER_AGENT": "testbot", } # Create the list by adding a dummy message ml = FakeList("*****@*****.**") msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<msg>" msg.set_payload("Dummy message") store.add_to_list(ml, msg)
def test_starting_message_1(self): # A basic thread: msg2 replies to msg1 ml = FakeList("example-list") msg1 = Message() msg1["From"] = "*****@*****.**" msg1["Message-ID"] = "<msg1>" msg1.set_payload("message 1") self.store.add_to_list(ml, msg1) msg2 = Message() msg2["From"] = "*****@*****.**" msg2["Message-ID"] = "<msg2>" msg2.set_payload("message 2") msg2["In-Reply-To"] = msg1["Message-ID"] self.store.add_to_list(ml, msg2) thread = self.store.db.find(Thread).one() self.assertEqual(thread.starting_email.message_id, "msg1")
def test_starting_message_2(self): # A partially-imported thread: msg1 replies to something we don't have ml = FakeList("example-list") msg1 = Message() msg1["From"] = "*****@*****.**" msg1["Message-ID"] = "<msg1>" msg1["In-Reply-To"] = "<msg0>" msg1.set_payload("message 1") self.store.add_to_list(ml, msg1) msg2 = Message() msg2["From"] = "*****@*****.**" msg2["Message-ID"] = "<msg2>" msg2["In-Reply-To"] = msg1["Message-ID"] msg2.set_payload("message 2") self.store.add_to_list(ml, msg2) thread = self.store.db.find(Thread).one() self.assertEqual(thread.starting_email.message_id, "msg1")
def test_starting_message_3(self): # A thread where the reply has an anterior date to the first email # (the In-Reply-To header must win over the date sort) ml = FakeList("example-list") msg1 = Message() msg1["From"] = "*****@*****.**" msg1["Message-ID"] = "<msg1>" msg1["Date"] = "Fri, 02 Nov 2012 16:07:54 +0000" msg1.set_payload("message 1") self.store.add_to_list(ml, msg1) msg2 = Message() msg2["From"] = "*****@*****.**" msg2["Message-ID"] = "<msg2>" msg2["Date"] = "Fri, 01 Nov 2012 16:07:54 +0000" msg2.set_payload("message 2") msg2["In-Reply-To"] = msg1["Message-ID"] self.store.add_to_list(ml, msg2) thread = self.store.db.find(Thread).one() self.assertEqual(thread.starting_email.message_id, "msg1")
def setUp(self): self.user = User.objects.create_user('testuser', '*****@*****.**', 'testPass') self.client.login(username='******', password='******') # use a temp variable below because self.client.session is actually a # property which returns a new instance en each call :-/ session = self.client.session session["user_id"] = u"testuser" session.save() self.store = kittystore.get_store(SettingsModule(), debug=False, auto_create=True) self.client.defaults = { "kittystore.store": self.store, "HTTP_USER_AGENT": "testbot", } # Create a dummy message to test on ml = FakeList("*****@*****.**") msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<msg>" msg.set_payload("Dummy message") self.store.add_to_list(ml, msg)
def test_update_list(self): """List records must be updated when changed in Mailman""" msg = Message() msg["From"] = "*****@*****.**" msg["Message-ID"] = "<dummy>" msg.set_payload("Dummy message") ml = FakeList("example-list") ml.display_name = u"name 1" ml.subject_prefix = u"[prefix 1]" self.store.add_to_list(ml, msg) ml_db = self.store.db.find(List).one() self.assertEqual(ml_db.display_name, "name 1") self.assertEqual(ml_db.subject_prefix, "[prefix 1]") ml.display_name = u"name 2" ml.subject_prefix = u"[prefix 2]" self.store.add_to_list(ml, msg) ml_db = self.store.db.find(List).one() self.assertEqual(ml_db.display_name, "name 2") self.assertEqual(ml_db.subject_prefix, "[prefix 2]")
def test_no_message_id(self): msg = Message() self.assertRaises(ValueError, self.store.add_to_list, FakeList("example-list"), msg)