Mercurial > p > roundup > code
comparison test/test_mailgw.py @ 4965:a850f8bae536
Moved test_mailgw to email module and make message comparison sharper to flag differences in headers with the same name.
| author | Bernhard Reiter <bernhard@intevation.de> |
|---|---|
| date | Mon, 02 Mar 2015 17:08:40 +0100 |
| parents | 6e9b9743de89 |
| children | c355541aaae3 |
comparison
equal
deleted
inserted
replaced
| 4964:2c3cc4ccd024 | 4965:a850f8bae536 |
|---|---|
| 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of | 9 # but WITHOUT ANY WARRANTY; without even the implied warranty of |
| 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. | 10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. |
| 11 | 11 |
| 12 # TODO: test bcc | 12 # TODO: test bcc |
| 13 | 13 |
| 14 import unittest, tempfile, os, shutil, errno, imp, sys, difflib, rfc822, time | 14 import email |
| 15 import gpgmelib | 15 import gpgmelib |
| 16 from email.parser import FeedParser | 16 import unittest, tempfile, os, shutil, errno, imp, sys, difflib, time |
| 17 | 17 |
| 18 | 18 |
| 19 try: | 19 try: |
| 20 import pyme, pyme.core | 20 import pyme, pyme.core |
| 21 except ImportError: | 21 except ImportError: |
| 41 """ For marking a failing test. | 41 """ For marking a failing test. |
| 42 This will *not* run the test and return success instead. | 42 This will *not* run the test and return success instead. |
| 43 """ | 43 """ |
| 44 return lambda x: 0 | 44 return lambda x: 0 |
| 45 | 45 |
| 46 class Message(rfc822.Message): | 46 |
| 47 """String-based Message class with equivalence test.""" | 47 def get_body(message): |
| 48 def __init__(self, s): | 48 if not message.is_multipart(): |
| 49 rfc822.Message.__init__(self, StringIO(s.strip())) | 49 return message.get_payload() |
| 50 | 50 |
| 51 def __eq__(self, other): | 51 return message.as_string().split('\n\n', 1)[-1] |
| 52 return (self.dict == other.dict and | 52 |
| 53 self.fp.read() == other.fp.read()) | |
| 54 | 53 |
| 55 class Tracker(object): | 54 class Tracker(object): |
| 56 def open(self, journaltag): | 55 def open(self, journaltag): |
| 57 return self.db | 56 return self.db |
| 58 | 57 |
| 59 class DiffHelper: | 58 class DiffHelper: |
| 60 def compareMessages(self, new, old): | 59 def compareMessages(self, new, old): |
| 61 """Compare messages for semantic equivalence.""" | 60 """Compare messages for semantic equivalence.""" |
| 62 new, old = Message(new), Message(old) | 61 new = email.message_from_string(new.strip()) |
| 62 old = email.message_from_string(old.strip()) | |
| 63 | 63 |
| 64 # all Roundup-generated messages have "Precedence: bulk" | 64 # all Roundup-generated messages have "Precedence: bulk" |
| 65 old['Precedence'] = 'bulk' | 65 old['Precedence'] = 'bulk' |
| 66 | 66 |
| 67 # don't try to compare the date | 67 # don't try to compare the date |
| 84 # handle mime messages | 84 # handle mime messages |
| 85 newmime = new[key].split('=',1)[-1].strip('"') | 85 newmime = new[key].split('=',1)[-1].strip('"') |
| 86 oldmime = old.get(key, '').split('=',1)[-1].strip('"') | 86 oldmime = old.get(key, '').split('=',1)[-1].strip('"') |
| 87 replace ['--' + newmime] = '--' + oldmime | 87 replace ['--' + newmime] = '--' + oldmime |
| 88 replace ['--' + newmime + '--'] = '--' + oldmime + '--' | 88 replace ['--' + newmime + '--'] = '--' + oldmime + '--' |
| 89 elif new.get(key, '') != old.get(key, ''): | 89 elif new.get_all(key, '') != old.get_all(key, ''): |
| 90 res.append(' %s: %r != %r' % (key, old.get(key, ''), | 90 # check that all other headers are identical, including |
| 91 new.get(key, ''))) | 91 # headers that appear more than once. |
| 92 | 92 res.append(' %s: %r != %r' % (key, old.get_all(key, ''), |
| 93 body_diff = self.compareStrings(new.fp.read(), old.fp.read(), | 93 new.get_all(key, ''))) |
| 94 | |
| 95 # TODO replace the string comparision with a mimepart comparison | |
| 96 body_diff = self.compareStrings(get_body(new), get_body(old), | |
| 94 replace=replace) | 97 replace=replace) |
| 95 if body_diff: | 98 if body_diff: |
| 96 res.append('') | 99 res.append('') |
| 97 res.extend(body_diff) | 100 res.extend(body_diff) |
| 98 | 101 |
| 3502 self.db.security.addPermissionToRole('pgp', 'Email Access') | 3505 self.db.security.addPermissionToRole('pgp', 'Email Access') |
| 3503 self.db.security.addPermissionToRole('pgp', 'Create', 'issue') | 3506 self.db.security.addPermissionToRole('pgp', 'Create', 'issue') |
| 3504 # trap_exc=1: we want a bounce message: | 3507 # trap_exc=1: we want a bounce message: |
| 3505 self._handle_mail(self.encrypted_msg, trap_exc=1) | 3508 self._handle_mail(self.encrypted_msg, trap_exc=1) |
| 3506 m = self._get_mail() | 3509 m = self._get_mail() |
| 3507 fp = FeedParser() | 3510 fp = email.parser.FeedParser() |
| 3508 fp.feed(m) | 3511 fp.feed(m) |
| 3509 parts = fp.close().get_payload() | 3512 parts = fp.close().get_payload() |
| 3510 self.assertEqual(len(parts),2) | 3513 self.assertEqual(len(parts),2) |
| 3511 self.assertEqual(parts[0].get_payload().strip(), 'Version: 1') | 3514 self.assertEqual(parts[0].get_payload().strip(), 'Version: 1') |
| 3512 crypt = pyme.core.Data(parts[1].get_payload()) | 3515 crypt = pyme.core.Data(parts[1].get_payload()) |
| 3513 plain = pyme.core.Data() | 3516 plain = pyme.core.Data() |
| 3514 ctx = pyme.core.Context() | 3517 ctx = pyme.core.Context() |
| 3515 res = ctx.op_decrypt(crypt, plain) | 3518 res = ctx.op_decrypt(crypt, plain) |
| 3516 self.assertEqual(res, None) | 3519 self.assertEqual(res, None) |
| 3517 plain.seek(0,0) | 3520 plain.seek(0,0) |
| 3518 fp = FeedParser() | 3521 fp = email.parser.FeedParser() |
| 3519 fp.feed(plain.read()) | 3522 fp.feed(plain.read()) |
| 3520 parts = fp.close().get_payload() | 3523 parts = fp.close().get_payload() |
| 3521 self.assertEqual(len(parts),2) | 3524 self.assertEqual(len(parts),2) |
| 3522 self.assertEqual(parts[0].get_payload().strip(), | 3525 self.assertEqual(parts[0].get_payload().strip(), |
| 3523 'You are not permitted to create messages.') | 3526 'You are not permitted to create messages.') |
