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.')

Roundup Issue Tracker: http://roundup-tracker.org/