X-Git-Url: https://git.tokkee.org/?a=blobdiff_plain;f=test%2Ftest_mailgw.py;h=2fce57d68ea4d083c7df004544e72679905d5034;hb=dc251d52e45b081b8a6a908e73234623bdfe694f;hp=af81ce6a81a627855944b9c63f67d6475046133e;hpb=e36034954b3a18a3ff48acbeedb501b27a6367c4;p=roundup.git diff --git a/test/test_mailgw.py b/test/test_mailgw.py index af81ce6..2fce57d 100644 --- a/test/test_mailgw.py +++ b/test/test_mailgw.py @@ -8,42 +8,45 @@ # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # -# $Id: test_mailgw.py,v 1.32 2002-09-26 03:04:24 richard Exp $ +# $Id: test_mailgw.py,v 1.50 2003-09-07 18:27:47 jlgijsbers Exp $ -import unittest, cStringIO, tempfile, os, shutil, errno, imp, sys, difflib +import unittest, tempfile, os, shutil, errno, imp, sys, difflib, rfc822 -# Note: Should parse emails according to RFC2822 instead of performing a -# literal string comparision. Parsing the messages allows the tests to work for -# any legal serialization of an email. -#try : -# import email -#except ImportError : -# import rfc822 as email +from cStringIO import StringIO -from roundup.mailgw import MailGW, Unauthorized -from roundup import init, instance +from roundup.mailgw import MailGW, Unauthorized, uidFromAddress +from roundup import init, instance, rfc2822 -# TODO: make this output only enough equal lines for context, not all of -# them +class Message(rfc822.Message): + """String-based Message class with equivalence test.""" + def __init__(self, s): + rfc822.Message.__init__(self, StringIO(s.strip())) + + def __eq__(self, other): + del self['date'], other['date'] + + return (self.dict == other.dict and + self.fp.read() == other.fp.read()) + +# TODO: Do a semantic diff instead of a straight text diff when a test fails. class DiffHelper: + def compareMessages(self, s2, s1): + """Compare messages for semantic equivalence.""" + if not Message(s2) == Message(s1): + self.compareStrings(s2, s1) + def compareStrings(self, s2, s1): '''Note the reversal of s2 and s1 - difflib.SequenceMatcher wants the first to be the "original" but in the calls in this file, the second arg is the original. Ho hum. ''' - if s1 == s2: + # we have to special-case the Date: header here 'cos we can't test + # for it properly + l1=s1.strip().split('\n') + l2=[x for x in s2.strip().split('\n') if not x.startswith('Date: ')] + if l1 == l2: return - # under python2.[12] we allow a difference of one trailing empty line. - if sys.version_info[0:2] == (2,1): - if s1+'\n' == s2: - return - if sys.version_info[0:2] == (2,2): - if s1 == s2+'\n': - return - - l1=s1.split('\n') - l2=s2.split('\n') s = difflib.SequenceMatcher(None, l1, l2) res = ['Generated message not correct (diff follows):'] for value, s1s, s1e, s2s, s2e in s.get_opcodes(): @@ -74,20 +77,22 @@ class MailgwTestCase(unittest.TestCase, DiffHelper): except OSError, error: if error.errno not in (errno.ENOENT, errno.ESRCH): raise # create the instance - init.install(self.dirname, 'classic', 'anydbm') + init.install(self.dirname, 'templates/classic') + init.write_select_db(self.dirname, 'anydbm') init.initialise(self.dirname, 'sekrit') # check we can load the package self.instance = instance.open(self.dirname) # and open the database self.db = self.instance.open('admin') self.db.user.create(username='Chef', address='chef@bork.bork.bork', - roles='User') + realname='Bork, Chef', roles='User') self.db.user.create(username='richard', address='richard@test', roles='User') self.db.user.create(username='mary', address='mary@test', - roles='User') + roles='User', realname='Contrary, Mary') self.db.user.create(username='john', address='john@test', - alternate_addresses='jondoe@test\njohn.doe@test', roles='User') + alternate_addresses='jondoe@test\njohn.doe@test', roles='User', + realname='John Doe') def tearDown(self): if os.path.exists(os.environ['SENDMAILDEBUG']): @@ -98,8 +103,26 @@ class MailgwTestCase(unittest.TestCase, DiffHelper): except OSError, error: if error.errno not in (errno.ENOENT, errno.ESRCH): raise + def testEmptyMessage(self): + message = StringIO('''Content-Type: text/plain; + charset="iso-8859-1" +From: Chef +To: issue_tracker@your.tracker.email.domain.example +Cc: richard@test +Message-Id: +Subject: [issue] Testing... + +''') + handler = self.instance.MailGW(self.instance, self.db) + handler.trapExceptions = 0 + nodeid = handler.main(message) + if os.path.exists(os.environ['SENDMAILDEBUG']): + error = open(os.environ['SENDMAILDEBUG']).read() + self.assertEqual('no error', error) + self.assertEqual(self.db.issue.get(nodeid, 'title'), 'Testing...') + def doNewIssue(self): - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: Chef To: issue_tracker@your.tracker.email.domain.example @@ -118,13 +141,14 @@ This is a test submission of a new issue. l = self.db.issue.get(nodeid, 'nosy') l.sort() self.assertEqual(l, ['3', '4']) + return nodeid def testNewIssue(self): self.doNewIssue() def testNewIssueNosy(self): self.instance.config.ADD_AUTHOR_TO_NOSY = 'yes' - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: Chef To: issue_tracker@your.tracker.email.domain.example @@ -145,7 +169,7 @@ This is a test submission of a new issue. self.assertEqual(l, ['3', '4']) def testAlternateAddress(self): - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: John Doe To: issue_tracker@your.tracker.email.domain.example @@ -165,7 +189,7 @@ This is a test submission of a new issue. "user created when it shouldn't have been") def testNewIssueNoClass(self): - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: Chef To: issue_tracker@your.tracker.email.domain.example @@ -183,7 +207,7 @@ This is a test submission of a new issue. self.assertEqual('no error', error) def testNewIssueAuthMsg(self): - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: Chef To: issue_tracker@your.tracker.email.domain.example @@ -198,35 +222,35 @@ This is a test submission of a new issue. self.db.config.MESSAGES_TO_AUTHOR = 'yes' handler.main(message) - self.compareStrings(open(os.environ['SENDMAILDEBUG']).read(), + self.compareMessages(open(os.environ['SENDMAILDEBUG']).read(), '''FROM: roundup-admin@your.tracker.email.domain.example TO: chef@bork.bork.bork, mary@test, richard@test -Content-Type: text/plain +Content-Type: text/plain; charset=utf-8 Subject: [issue1] Testing... To: chef@bork.bork.bork, mary@test, richard@test -From: "Chef" -Reply-To: "Roundup issue tracker" +From: "Bork, Chef" +Reply-To: Roundup issue tracker MIME-Version: 1.0 Message-Id: X-Roundup-Name: Roundup issue tracker +X-Roundup-Loop: hello Content-Transfer-Encoding: quoted-printable -New submission from Chef : +New submission from Bork, Chef : This is a test submission of a new issue. - ---------- assignedto: richard messages: 1 nosy: Chef, mary, richard status: unread title: Testing... -_________________________________________________________________________ -"Roundup issue tracker" -http://your.tracker.url.example/issue1 -_________________________________________________________________________ +_______________________________________________________________________ +Roundup issue tracker + +_______________________________________________________________________ ''') # BUG @@ -240,7 +264,7 @@ _________________________________________________________________________ def testSimpleFollowup(self): self.doNewIssue() - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: mary To: issue_tracker@your.tracker.email.domain.example @@ -253,38 +277,38 @@ This is a second followup handler = self.instance.MailGW(self.instance, self.db) handler.trapExceptions = 0 handler.main(message) - self.compareStrings(open(os.environ['SENDMAILDEBUG']).read(), + self.compareMessages(open(os.environ['SENDMAILDEBUG']).read(), '''FROM: roundup-admin@your.tracker.email.domain.example TO: chef@bork.bork.bork, richard@test -Content-Type: text/plain +Content-Type: text/plain; charset=utf-8 Subject: [issue1] Testing... To: chef@bork.bork.bork, richard@test -From: "mary" -Reply-To: "Roundup issue tracker" +From: "Contrary, Mary" +Reply-To: Roundup issue tracker MIME-Version: 1.0 Message-Id: In-Reply-To: X-Roundup-Name: Roundup issue tracker +X-Roundup-Loop: hello Content-Transfer-Encoding: quoted-printable -mary added the comment: +Contrary, Mary added the comment: This is a second followup - ---------- status: unread -> chatting -_________________________________________________________________________ -"Roundup issue tracker" -http://your.tracker.url.example/issue1 -_________________________________________________________________________ +_______________________________________________________________________ +Roundup issue tracker + +_______________________________________________________________________ ''') def testFollowup(self): self.doNewIssue() - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: richard To: issue_tracker@your.tracker.email.domain.example @@ -301,18 +325,19 @@ This is a followup l.sort() self.assertEqual(l, ['3', '4', '5', '6']) - self.compareStrings(open(os.environ['SENDMAILDEBUG']).read(), + self.compareMessages(open(os.environ['SENDMAILDEBUG']).read(), '''FROM: roundup-admin@your.tracker.email.domain.example TO: chef@bork.bork.bork, john@test, mary@test -Content-Type: text/plain +Content-Type: text/plain; charset=utf-8 Subject: [issue1] Testing... To: chef@bork.bork.bork, john@test, mary@test -From: "richard" -Reply-To: "Roundup issue tracker" +From: richard +Reply-To: Roundup issue tracker MIME-Version: 1.0 Message-Id: In-Reply-To: X-Roundup-Name: Roundup issue tracker +X-Roundup-Loop: hello Content-Transfer-Encoding: quoted-printable @@ -320,20 +345,19 @@ richard added the comment: This is a followup - ---------- assignedto: -> mary nosy: +john, mary status: unread -> chatting -_________________________________________________________________________ -"Roundup issue tracker" -http://your.tracker.url.example/issue1 -_________________________________________________________________________ +_______________________________________________________________________ +Roundup issue tracker + +_______________________________________________________________________ ''') def testFollowupTitleMatch(self): self.doNewIssue() - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: richard To: issue_tracker@your.tracker.email.domain.example @@ -347,18 +371,19 @@ This is a followup handler.trapExceptions = 0 handler.main(message) - self.compareStrings(open(os.environ['SENDMAILDEBUG']).read(), + self.compareMessages(open(os.environ['SENDMAILDEBUG']).read(), '''FROM: roundup-admin@your.tracker.email.domain.example TO: chef@bork.bork.bork, john@test, mary@test -Content-Type: text/plain +Content-Type: text/plain; charset=utf-8 Subject: [issue1] Testing... To: chef@bork.bork.bork, john@test, mary@test -From: "richard" -Reply-To: "Roundup issue tracker" +From: richard +Reply-To: Roundup issue tracker MIME-Version: 1.0 Message-Id: In-Reply-To: X-Roundup-Name: Roundup issue tracker +X-Roundup-Loop: hello Content-Transfer-Encoding: quoted-printable @@ -366,21 +391,20 @@ richard added the comment: This is a followup - ---------- assignedto: -> mary nosy: +john, mary status: unread -> chatting -_________________________________________________________________________ -"Roundup issue tracker" -http://your.tracker.url.example/issue1 -_________________________________________________________________________ +_______________________________________________________________________ +Roundup issue tracker + +_______________________________________________________________________ ''') def testFollowupNosyAuthor(self): self.doNewIssue() self.db.config.ADD_AUTHOR_TO_NOSY = 'yes' - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: john@test To: issue_tracker@your.tracker.email.domain.example @@ -394,40 +418,40 @@ This is a followup handler.trapExceptions = 0 handler.main(message) - self.compareStrings(open(os.environ['SENDMAILDEBUG']).read(), + self.compareMessages(open(os.environ['SENDMAILDEBUG']).read(), '''FROM: roundup-admin@your.tracker.email.domain.example TO: chef@bork.bork.bork, richard@test -Content-Type: text/plain +Content-Type: text/plain; charset=utf-8 Subject: [issue1] Testing... To: chef@bork.bork.bork, richard@test -From: "john" -Reply-To: "Roundup issue tracker" +From: John Doe +Reply-To: Roundup issue tracker MIME-Version: 1.0 Message-Id: In-Reply-To: X-Roundup-Name: Roundup issue tracker +X-Roundup-Loop: hello Content-Transfer-Encoding: quoted-printable -john added the comment: +John Doe added the comment: This is a followup - ---------- nosy: +john status: unread -> chatting -_________________________________________________________________________ -"Roundup issue tracker" -http://your.tracker.url.example/issue1 -_________________________________________________________________________ +_______________________________________________________________________ +Roundup issue tracker + +_______________________________________________________________________ ''') def testFollowupNosyRecipients(self): self.doNewIssue() self.db.config.ADD_RECIPIENTS_TO_NOSY = 'yes' - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: richard@test To: issue_tracker@your.tracker.email.domain.example @@ -442,18 +466,19 @@ This is a followup handler.trapExceptions = 0 handler.main(message) - self.compareStrings(open(os.environ['SENDMAILDEBUG']).read(), + self.compareMessages(open(os.environ['SENDMAILDEBUG']).read(), '''FROM: roundup-admin@your.tracker.email.domain.example TO: chef@bork.bork.bork -Content-Type: text/plain +Content-Type: text/plain; charset=utf-8 Subject: [issue1] Testing... To: chef@bork.bork.bork -From: "richard" -Reply-To: "Roundup issue tracker" +From: richard +Reply-To: Roundup issue tracker MIME-Version: 1.0 Message-Id: In-Reply-To: X-Roundup-Name: Roundup issue tracker +X-Roundup-Loop: hello Content-Transfer-Encoding: quoted-printable @@ -461,14 +486,13 @@ richard added the comment: This is a followup - ---------- nosy: +john status: unread -> chatting -_________________________________________________________________________ -"Roundup issue tracker" -http://your.tracker.url.example/issue1 -_________________________________________________________________________ +_______________________________________________________________________ +Roundup issue tracker + +_______________________________________________________________________ ''') @@ -476,7 +500,7 @@ _________________________________________________________________________ self.doNewIssue() self.db.config.ADD_AUTHOR_TO_NOSY = 'yes' self.db.config.MESSAGES_TO_AUTHOR = 'yes' - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: john@test To: issue_tracker@your.tracker.email.domain.example @@ -490,40 +514,40 @@ This is a followup handler.trapExceptions = 0 handler.main(message) - self.compareStrings(open(os.environ['SENDMAILDEBUG']).read(), + self.compareMessages(open(os.environ['SENDMAILDEBUG']).read(), '''FROM: roundup-admin@your.tracker.email.domain.example TO: chef@bork.bork.bork, john@test, richard@test -Content-Type: text/plain +Content-Type: text/plain; charset=utf-8 Subject: [issue1] Testing... To: chef@bork.bork.bork, john@test, richard@test -From: "john" -Reply-To: "Roundup issue tracker" +From: John Doe +Reply-To: Roundup issue tracker MIME-Version: 1.0 Message-Id: In-Reply-To: X-Roundup-Name: Roundup issue tracker +X-Roundup-Loop: hello Content-Transfer-Encoding: quoted-printable -john added the comment: +John Doe added the comment: This is a followup - ---------- nosy: +john status: unread -> chatting -_________________________________________________________________________ -"Roundup issue tracker" -http://your.tracker.url.example/issue1 -_________________________________________________________________________ +_______________________________________________________________________ +Roundup issue tracker + +_______________________________________________________________________ ''') def testFollowupNoNosyAuthor(self): self.doNewIssue() self.instance.config.ADD_AUTHOR_TO_NOSY = 'no' - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: john@test To: issue_tracker@your.tracker.email.domain.example @@ -537,39 +561,39 @@ This is a followup handler.trapExceptions = 0 handler.main(message) - self.compareStrings(open(os.environ['SENDMAILDEBUG']).read(), + self.compareMessages(open(os.environ['SENDMAILDEBUG']).read(), '''FROM: roundup-admin@your.tracker.email.domain.example TO: chef@bork.bork.bork, richard@test -Content-Type: text/plain +Content-Type: text/plain; charset=utf-8 Subject: [issue1] Testing... To: chef@bork.bork.bork, richard@test -From: "john" -Reply-To: "Roundup issue tracker" +From: John Doe +Reply-To: Roundup issue tracker MIME-Version: 1.0 Message-Id: In-Reply-To: X-Roundup-Name: Roundup issue tracker +X-Roundup-Loop: hello Content-Transfer-Encoding: quoted-printable -john added the comment: +John Doe added the comment: This is a followup - ---------- status: unread -> chatting -_________________________________________________________________________ -"Roundup issue tracker" -http://your.tracker.url.example/issue1 -_________________________________________________________________________ +_______________________________________________________________________ +Roundup issue tracker + +_______________________________________________________________________ ''') def testFollowupNoNosyRecipients(self): self.doNewIssue() self.instance.config.ADD_RECIPIENTS_TO_NOSY = 'no' - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: richard@test To: issue_tracker@your.tracker.email.domain.example @@ -584,18 +608,19 @@ This is a followup handler.trapExceptions = 0 handler.main(message) - self.compareStrings(open(os.environ['SENDMAILDEBUG']).read(), + self.compareMessages(open(os.environ['SENDMAILDEBUG']).read(), '''FROM: roundup-admin@your.tracker.email.domain.example TO: chef@bork.bork.bork -Content-Type: text/plain +Content-Type: text/plain; charset=utf-8 Subject: [issue1] Testing... To: chef@bork.bork.bork -From: "richard" -Reply-To: "Roundup issue tracker" +From: richard +Reply-To: Roundup issue tracker MIME-Version: 1.0 Message-Id: In-Reply-To: X-Roundup-Name: Roundup issue tracker +X-Roundup-Loop: hello Content-Transfer-Encoding: quoted-printable @@ -603,20 +628,41 @@ richard added the comment: This is a followup - ---------- status: unread -> chatting -_________________________________________________________________________ -"Roundup issue tracker" -http://your.tracker.url.example/issue1 -_________________________________________________________________________ +_______________________________________________________________________ +Roundup issue tracker + +_______________________________________________________________________ + +''') + + def testFollowupEmptyMessage(self): + self.doNewIssue() + + message = StringIO('''Content-Type: text/plain; + charset="iso-8859-1" +From: richard +To: issue_tracker@your.tracker.email.domain.example +Message-Id: +In-Reply-To: +Subject: [issue1] Testing... [assignedto=mary; nosy=+john] ''') + handler = self.instance.MailGW(self.instance, self.db) + handler.trapExceptions = 0 + handler.main(message) + l = self.db.issue.get('1', 'nosy') + l.sort() + self.assertEqual(l, ['3', '4', '5', '6']) + + # should be no file created (ie. no message) + assert not os.path.exists(os.environ['SENDMAILDEBUG']) def testNosyRemove(self): self.doNewIssue() - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: richard To: issue_tracker@your.tracker.email.domain.example @@ -638,7 +684,7 @@ Subject: [issue1] Testing... [nosy=-richard] def testNewUserAuthor(self): # first without the permission # heh... just ignore the API for a second ;) - self.db.security.role['Anonymous'].permissions=[] + self.db.security.role['anonymous'].permissions=[] anonid = self.db.user.lookup('anonymous') self.db.user.set(anonid, roles='Anonymous') @@ -654,7 +700,7 @@ Subject: [issue] Testing... This is a test submission of a new issue. ''' - message = cStringIO.StringIO(s) + message = StringIO(s) handler = self.instance.MailGW(self.instance, self.db) handler.trapExceptions = 0 self.assertRaises(Unauthorized, handler.main, message) @@ -664,10 +710,10 @@ This is a test submission of a new issue. # now with the permission p = self.db.security.getPermission('Email Registration') - self.db.security.role['Anonymous'].permissions=[p] + self.db.security.role['anonymous'].permissions=[p] handler = self.instance.MailGW(self.instance, self.db) handler.trapExceptions = 0 - message = cStringIO.StringIO(s) + message = StringIO(s) handler.main(message) m = self.db.user.list() m.sort() @@ -675,7 +721,7 @@ This is a test submission of a new issue. def testEnc01(self): self.doNewIssue() - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: mary To: issue_tracker@your.tracker.email.domain.example @@ -692,37 +738,38 @@ A message with encoding (encoded oe =F6) handler = self.instance.MailGW(self.instance, self.db) handler.trapExceptions = 0 handler.main(message) - self.compareStrings(open(os.environ['SENDMAILDEBUG']).read(), + self.compareMessages(open(os.environ['SENDMAILDEBUG']).read(), '''FROM: roundup-admin@your.tracker.email.domain.example TO: chef@bork.bork.bork, richard@test -Content-Type: text/plain +Content-Type: text/plain; charset=utf-8 Subject: [issue1] Testing... To: chef@bork.bork.bork, richard@test -From: "mary" -Reply-To: "Roundup issue tracker" +From: "Contrary, Mary" +Reply-To: Roundup issue tracker MIME-Version: 1.0 Message-Id: In-Reply-To: X-Roundup-Name: Roundup issue tracker +X-Roundup-Loop: hello Content-Transfer-Encoding: quoted-printable -mary added the comment: +Contrary, Mary added the comment: -A message with encoding (encoded oe =F6) +A message with encoding (encoded oe =C3=B6) ---------- status: unread -> chatting -_________________________________________________________________________ -"Roundup issue tracker" -http://your.tracker.url.example/issue1 -_________________________________________________________________________ +_______________________________________________________________________ +Roundup issue tracker + +_______________________________________________________________________ ''') def testMultipartEnc01(self): self.doNewIssue() - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: mary To: issue_tracker@your.tracker.email.domain.example @@ -746,37 +793,73 @@ A message with first part encoded (encoded oe =F6) handler = self.instance.MailGW(self.instance, self.db) handler.trapExceptions = 0 handler.main(message) - self.compareStrings(open(os.environ['SENDMAILDEBUG']).read(), + self.compareMessages(open(os.environ['SENDMAILDEBUG']).read(), '''FROM: roundup-admin@your.tracker.email.domain.example TO: chef@bork.bork.bork, richard@test -Content-Type: text/plain +Content-Type: text/plain; charset=utf-8 Subject: [issue1] Testing... To: chef@bork.bork.bork, richard@test -From: "mary" -Reply-To: "Roundup issue tracker" +From: "Contrary, Mary" +Reply-To: Roundup issue tracker MIME-Version: 1.0 Message-Id: In-Reply-To: X-Roundup-Name: Roundup issue tracker +X-Roundup-Loop: hello Content-Transfer-Encoding: quoted-printable -mary added the comment: +Contrary, Mary added the comment: -A message with first part encoded (encoded oe =F6) +A message with first part encoded (encoded oe =C3=B6) ---------- status: unread -> chatting -_________________________________________________________________________ -"Roundup issue tracker" -http://your.tracker.url.example/issue1 -_________________________________________________________________________ +_______________________________________________________________________ +Roundup issue tracker + +_______________________________________________________________________ ''') + def testContentDisposition(self): + self.doNewIssue() + message = StringIO('''Content-Type: text/plain; + charset="iso-8859-1" +From: mary +To: issue_tracker@your.tracker.email.domain.example +Message-Id: +In-Reply-To: +Subject: [issue1] Testing... +Content-Type: multipart/mixed; boundary="bCsyhTFzCvuiizWE" +Content-Disposition: inline + + +--bCsyhTFzCvuiizWE +Content-Type: text/plain; charset=us-ascii +Content-Disposition: inline + +test attachment binary + +--bCsyhTFzCvuiizWE +Content-Type: application/octet-stream +Content-Disposition: attachment; filename="main.dvi" + +xxxxxx + +--bCsyhTFzCvuiizWE-- +''') + handler = self.instance.MailGW(self.instance, self.db) + handler.trapExceptions = 0 + handler.main(message) + messages = self.db.issue.get('1', 'messages') + messages.sort() + file = self.db.msg.get(messages[-1], 'files')[0] + self.assertEqual(self.db.file.get(file, 'name'), 'main.dvi') + def testFollowupStupidQuoting(self): self.doNewIssue() - message = cStringIO.StringIO('''Content-Type: text/plain; + message = StringIO('''Content-Type: text/plain; charset="iso-8859-1" From: richard To: issue_tracker@your.tracker.email.domain.example @@ -790,18 +873,19 @@ This is a followup handler.trapExceptions = 0 handler.main(message) - self.compareStrings(open(os.environ['SENDMAILDEBUG']).read(), + self.compareMessages(open(os.environ['SENDMAILDEBUG']).read(), '''FROM: roundup-admin@your.tracker.email.domain.example TO: chef@bork.bork.bork -Content-Type: text/plain +Content-Type: text/plain; charset=utf-8 Subject: [issue1] Testing... To: chef@bork.bork.bork -From: "richard" -Reply-To: "Roundup issue tracker" +From: richard +Reply-To: Roundup issue tracker MIME-Version: 1.0 Message-Id: In-Reply-To: X-Roundup-Name: Roundup issue tracker +X-Roundup-Loop: hello Content-Transfer-Encoding: quoted-printable @@ -809,15 +893,100 @@ richard added the comment: This is a followup - ---------- status: unread -> chatting -_________________________________________________________________________ -"Roundup issue tracker" -http://your.tracker.url.example/issue1 -_________________________________________________________________________ +_______________________________________________________________________ +Roundup issue tracker + +_______________________________________________________________________ +''') + + def testEmailQuoting(self): + self.instance.config.EMAIL_KEEP_QUOTED_TEXT = 'no' + self.innerTestQuoting('''This is a followup +''') + + def testEmailQuotingRemove(self): + self.instance.config.EMAIL_KEEP_QUOTED_TEXT = 'yes' + self.innerTestQuoting('''Blah blah wrote: +> Blah bklaskdfj sdf asdf jlaskdf skj sdkfjl asdf +> skdjlkjsdfalsdkfjasdlfkj dlfksdfalksd fj +> + +This is a followup ''') + def innerTestQuoting(self, expect): + nodeid = self.doNewIssue() + + messages = self.db.issue.get(nodeid, 'messages') + + message = StringIO('''Content-Type: text/plain; + charset="iso-8859-1" +From: richard +To: issue_tracker@your.tracker.email.domain.example +Message-Id: +In-Reply-To: +Subject: Re: [issue1] Testing... + +Blah blah wrote: +> Blah bklaskdfj sdf asdf jlaskdf skj sdkfjl asdf +> skdjlkjsdfalsdkfjasdlfkj dlfksdfalksd fj +> + +This is a followup +''') + handler = self.instance.MailGW(self.instance, self.db) + handler.trapExceptions = 0 + handler.main(message) + + # figure the new message id + newmessages = self.db.issue.get(nodeid, 'messages') + for msg in messages: + newmessages.remove(msg) + messageid = newmessages[0] + + self.compareMessages(self.db.msg.get(messageid, 'content'), expect) + + def testUserLookup(self): + i = self.db.user.create(username='user1', address='user1@foo.com') + self.assertEqual(uidFromAddress(self.db, ('', 'user1@foo.com'), 0), i) + self.assertEqual(uidFromAddress(self.db, ('', 'USER1@foo.com'), 0), i) + i = self.db.user.create(username='user2', address='USER2@foo.com') + self.assertEqual(uidFromAddress(self.db, ('', 'USER2@foo.com'), 0), i) + self.assertEqual(uidFromAddress(self.db, ('', 'user2@foo.com'), 0), i) + + def testUserCreate(self): + i = uidFromAddress(self.db, ('', 'user@foo.com'), 1) + self.assertNotEqual(uidFromAddress(self.db, ('', 'user@bar.com'), 1), i) + + def testRFC2822(self): + ascii_header = "[issue243] This is a \"test\" - with 'quotation' marks" + unicode_header = '[issue244] \xd0\xb0\xd0\xbd\xd0\xb4\xd1\x80\xd0\xb5\xd0\xb9' + unicode_encoded = '=?utf-8?q?[issue244]_=D0=B0=D0=BD=D0=B4=D1=80=D0=B5=D0=B9?=' + self.assertEqual(rfc2822.encode_header(ascii_header), ascii_header) + self.assertEqual(rfc2822.encode_header(unicode_header), unicode_encoded) + + def testRegistrationConfirmation(self): + otk = "Aj4euk4LZSAdwePohj90SME5SpopLETL" + self.db.otks.set(otk, username='johannes', __time='') + message = StringIO('''Content-Type: text/plain; + charset="iso-8859-1" +From: Chef +To: issue_tracker@your.tracker.email.domain.example +Cc: richard@test +Message-Id: +Subject: Re: Complete your registration to Roundup issue tracker + -- key %s + +This is a test confirmation of registration. +''' % otk) + handler = self.instance.MailGW(self.instance, self.db) + handler.trapExceptions = 0 + handler.main(message) + + self.db.user.lookup('johannes') + def suite(): l = [unittest.makeSuite(MailgwTestCase), ]