summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorPatrick Totzke <patricktotzke@gmail.com>2018-06-17 14:19:13 +0100
committerPatrick Totzke <patricktotzke@gmail.com>2018-06-17 14:19:13 +0100
commite14488f10e0c75725e58c5fd7d83f9b6d5b90c53 (patch)
treee8eaa3bac895043897659ae709d2564ebf7339a1 /tests
parentbdd2a5142dedcbf1aec237c2a321e4f9d9cf82b0 (diff)
parent7a9a14ffce953e0892ff45337b7ec81e82532654 (diff)
Merge branch 'py3k'
Diffstat (limited to 'tests')
-rw-r--r--tests/account_test.py122
-rw-r--r--tests/addressbook/abook_test.py2
-rw-r--r--tests/commands/envelope_test.py2
-rw-r--r--tests/commands/global_test.py20
-rw-r--r--tests/commands/thread_test.py4
-rw-r--r--tests/commands/utils_tests.py18
-rw-r--r--tests/completion_test.py6
-rw-r--r--tests/crypto_test.py39
-rw-r--r--tests/db/thread_test.py2
-rw-r--r--tests/db/utils_test.py102
-rw-r--r--tests/helper_test.py16
-rw-r--r--tests/settings/manager_test.py24
12 files changed, 186 insertions, 171 deletions
diff --git a/tests/account_test.py b/tests/account_test.py
index cfc51bf8..99df9632 100644
--- a/tests/account_test.py
+++ b/tests/account_test.py
@@ -14,7 +14,7 @@
# You should have received a copy of the GNU General Public License
# along with this program. If not, see <http://www.gnu.org/licenses/>.
-from __future__ import absolute_import
+
import unittest
from alot import account
@@ -32,138 +32,126 @@ class TestAccount(unittest.TestCase):
def test_get_address(self):
"""Tests address without aliases."""
- acct = _AccountTestClass(address=u"foo@example.com")
- self.assertListEqual(acct.get_addresses(), [u'foo@example.com'])
+ acct = _AccountTestClass(address="foo@example.com")
+ self.assertListEqual(acct.get_addresses(), ['foo@example.com'])
def test_get_address_with_aliases(self):
"""Tests address with aliases."""
- acct = _AccountTestClass(address=u"foo@example.com",
- aliases=[u'bar@example.com'])
+ acct = _AccountTestClass(address="foo@example.com",
+ aliases=['bar@example.com'])
self.assertListEqual(acct.get_addresses(),
- [u'foo@example.com', u'bar@example.com'])
+ ['foo@example.com', 'bar@example.com'])
def test_deprecated_encrypt_by_default(self):
"""Tests that depreacted values are still accepted."""
- for each in [u'true', u'yes', u'1']:
- acct = _AccountTestClass(address=u'foo@example.com',
+ for each in ['true', 'yes', '1']:
+ acct = _AccountTestClass(address='foo@example.com',
encrypt_by_default=each)
- self.assertEqual(acct.encrypt_by_default, u'all')
- for each in [u'false', u'no', u'0']:
- acct = _AccountTestClass(address=u'foo@example.com',
+ self.assertEqual(acct.encrypt_by_default, 'all')
+ for each in ['false', 'no', '0']:
+ acct = _AccountTestClass(address='foo@example.com',
encrypt_by_default=each)
- self.assertEqual(acct.encrypt_by_default, u'none')
+ self.assertEqual(acct.encrypt_by_default, 'none')
class TestAddress(unittest.TestCase):
"""Tests for the Address class."""
- def test_constructor_bytes(self):
- with self.assertRaises(AssertionError):
- account.Address(b'username', b'domainname')
-
- def test_from_string_bytes(self):
- with self.assertRaises(AssertionError):
- account.Address.from_string(b'user@example.com')
-
def test_from_string(self):
- addr = account.Address.from_string(u'user@example.com')
- self.assertEqual(addr.username, u'user')
- self.assertEqual(addr.domainname, u'example.com')
-
- def test_unicode(self):
- addr = account.Address(u'ušer', u'example.com')
- self.assertEqual(unicode(addr), u'ušer@example.com')
+ addr = account.Address.from_string('user@example.com')
+ self.assertEqual(addr.username, 'user')
+ self.assertEqual(addr.domainname, 'example.com')
def test_str(self):
- addr = account.Address(u'ušer', u'example.com')
- self.assertEqual(str(addr), u'ušer@example.com'.encode('utf-8'))
+ addr = account.Address('ušer', 'example.com')
+ self.assertEqual(str(addr), 'ušer@example.com')
def test_eq_unicode(self):
- addr = account.Address(u'ušer', u'example.com')
- self.assertEqual(addr, u'ušer@example.com')
+ addr = account.Address('ušer', 'example.com')
+ self.assertEqual(addr, 'ušer@example.com')
def test_eq_address(self):
- addr = account.Address(u'ušer', u'example.com')
- addr2 = account.Address(u'ušer', u'example.com')
+ addr = account.Address('ušer', 'example.com')
+ addr2 = account.Address('ušer', 'example.com')
self.assertEqual(addr, addr2)
def test_ne_unicode(self):
- addr = account.Address(u'ušer', u'example.com')
- self.assertNotEqual(addr, u'user@example.com')
+ addr = account.Address('ušer', 'example.com')
+ self.assertNotEqual(addr, 'user@example.com')
def test_ne_address(self):
- addr = account.Address(u'ušer', u'example.com')
- addr2 = account.Address(u'user', u'example.com')
+ addr = account.Address('ušer', 'example.com')
+ addr2 = account.Address('user', 'example.com')
self.assertNotEqual(addr, addr2)
def test_eq_unicode_case(self):
- addr = account.Address(u'UŠer', u'example.com')
- self.assertEqual(addr, u'ušer@example.com')
+ addr = account.Address('UŠer', 'example.com')
+ self.assertEqual(addr, 'ušer@example.com')
def test_ne_unicode_case(self):
- addr = account.Address(u'ušer', u'example.com')
- self.assertEqual(addr, u'uŠer@example.com')
+ addr = account.Address('ušer', 'example.com')
+ self.assertEqual(addr, 'uŠer@example.com')
def test_ne_address_case(self):
- addr = account.Address(u'ušer', u'example.com')
- addr2 = account.Address(u'uŠer', u'example.com')
+ addr = account.Address('ušer', 'example.com')
+ addr2 = account.Address('uŠer', 'example.com')
self.assertEqual(addr, addr2)
def test_eq_address_case(self):
- addr = account.Address(u'UŠer', u'example.com')
- addr2 = account.Address(u'ušer', u'example.com')
+ addr = account.Address('UŠer', 'example.com')
+ addr2 = account.Address('ušer', 'example.com')
self.assertEqual(addr, addr2)
def test_eq_unicode_case_sensitive(self):
- addr = account.Address(u'UŠer', u'example.com', case_sensitive=True)
- self.assertNotEqual(addr, u'ušer@example.com')
+ addr = account.Address('UŠer', 'example.com', case_sensitive=True)
+ self.assertNotEqual(addr, 'ušer@example.com')
def test_eq_address_case_sensitive(self):
- addr = account.Address(u'UŠer', u'example.com', case_sensitive=True)
- addr2 = account.Address(u'ušer', u'example.com')
+ addr = account.Address('UŠer', 'example.com', case_sensitive=True)
+ addr2 = account.Address('ušer', 'example.com')
self.assertNotEqual(addr, addr2)
def test_eq_str(self):
- addr = account.Address(u'user', u'example.com', case_sensitive=True)
+ addr = account.Address('user', 'example.com', case_sensitive=True)
with self.assertRaises(TypeError):
addr == 1 # pylint: disable=pointless-statement
def test_ne_str(self):
- addr = account.Address(u'user', u'example.com', case_sensitive=True)
+ addr = account.Address('user', 'example.com', case_sensitive=True)
with self.assertRaises(TypeError):
addr != 1 # pylint: disable=pointless-statement
def test_repr(self):
- addr = account.Address(u'user', u'example.com', case_sensitive=True)
+ addr = account.Address('user', 'example.com', case_sensitive=True)
self.assertEqual(
repr(addr),
- "Address(u'user', u'example.com', case_sensitive=True)")
+ "Address('user', 'example.com', case_sensitive=True)")
def test_domain_name_ne(self):
- addr = account.Address(u'user', u'example.com')
- self.assertNotEqual(addr, u'user@example.org')
+ addr = account.Address('user', 'example.com')
+ self.assertNotEqual(addr, 'user@example.org')
def test_domain_name_eq_case(self):
- addr = account.Address(u'user', u'example.com')
- self.assertEqual(addr, u'user@Example.com')
+ addr = account.Address('user', 'example.com')
+ self.assertEqual(addr, 'user@Example.com')
def test_domain_name_ne_unicode(self):
- addr = account.Address(u'user', u'éxample.com')
- self.assertNotEqual(addr, u'user@example.com')
+ addr = account.Address('user', 'éxample.com')
+ self.assertNotEqual(addr, 'user@example.com')
def test_domain_name_eq_unicode(self):
- addr = account.Address(u'user', u'éxample.com')
- self.assertEqual(addr, u'user@Éxample.com')
+ addr = account.Address('user', 'éxample.com')
+ self.assertEqual(addr, 'user@Éxample.com')
def test_domain_name_eq_case_sensitive(self):
- addr = account.Address(u'user', u'example.com', case_sensitive=True)
- self.assertEqual(addr, u'user@Example.com')
+ addr = account.Address('user', 'example.com', case_sensitive=True)
+ self.assertEqual(addr, 'user@Example.com')
def test_domain_name_eq_unicode_sensitive(self):
- addr = account.Address(u'user', u'éxample.com', case_sensitive=True)
- self.assertEqual(addr, u'user@Éxample.com')
+ addr = account.Address('user', 'éxample.com', case_sensitive=True)
+ self.assertEqual(addr, 'user@Éxample.com')
def test_cmp_empty(self):
- addr = account.Address(u'user', u'éxample.com')
- self.assertNotEqual(addr, u'')
+ addr = account.Address('user', 'éxample.com')
+ self.assertNotEqual(addr, '')
diff --git a/tests/addressbook/abook_test.py b/tests/addressbook/abook_test.py
index 32be2cbe..c5686caf 100644
--- a/tests/addressbook/abook_test.py
+++ b/tests/addressbook/abook_test.py
@@ -29,7 +29,7 @@ class TestAbookAddressBook(unittest.TestCase):
name = you
email = you@other.domain, you@example.com
"""
- with tempfile.NamedTemporaryFile(delete=False) as tmp:
+ with tempfile.NamedTemporaryFile(mode='w+', delete=False) as tmp:
tmp.write(data)
path = tmp.name
self.addCleanup(os.unlink, path)
diff --git a/tests/commands/envelope_test.py b/tests/commands/envelope_test.py
index c48a0d91..ee1c0acc 100644
--- a/tests/commands/envelope_test.py
+++ b/tests/commands/envelope_test.py
@@ -315,7 +315,7 @@ class TestSignCommand(unittest.TestCase):
""")
# Allow settings.reload to work by not deleting the file until the end
- with tempfile.NamedTemporaryFile(delete=False) as f:
+ with tempfile.NamedTemporaryFile(mode='w+', delete=False) as f:
f.write(config)
self.addCleanup(os.unlink, f.name)
diff --git a/tests/commands/global_test.py b/tests/commands/global_test.py
index e3d91f8a..850c9447 100644
--- a/tests/commands/global_test.py
+++ b/tests/commands/global_test.py
@@ -48,7 +48,8 @@ class TestComposeCommand(unittest.TestCase):
return envelope
@staticmethod
- def _make_account_mock(sign_by_default=True, gpg_key=mock.sentinel.gpg_key):
+ def _make_account_mock(
+ sign_by_default=True, gpg_key=mock.sentinel.gpg_key):
account = mock.Mock()
account.sign_by_default = sign_by_default
account.gpg_key = gpg_key
@@ -136,8 +137,9 @@ class TestComposeCommand(unittest.TestCase):
cmd = g_commands.ComposeCommand(template=f.name)
# Crutch to exit the giant `apply` method early.
- with mock.patch('alot.commands.globals.settings.get_account_by_address',
- mock.Mock(side_effect=Stop)):
+ with mock.patch(
+ 'alot.commands.globals.settings.get_account_by_address',
+ mock.Mock(side_effect=Stop)):
try:
yield cmd.apply(mock.Mock())
except Stop:
@@ -172,7 +174,8 @@ class TestExternalCommand(unittest.TestCase):
def test_no_spawn_stdin_attached(self):
ui = utilities.make_ui()
- cmd = g_commands.ExternalCommand(u"test -t 0", stdin=u'0', refocus=False)
+ cmd = g_commands.ExternalCommand(
+ u"test -t 0", stdin=u'0', refocus=False)
cmd.apply(ui)
ui.notify.assert_called_once_with('', priority='error')
@@ -182,7 +185,8 @@ class TestExternalCommand(unittest.TestCase):
cmd.apply(ui)
ui.notify.assert_called_once_with('', priority='error')
- @mock.patch('alot.commands.globals.settings.get', mock.Mock(return_value=''))
+ @mock.patch(
+ 'alot.commands.globals.settings.get', mock.Mock(return_value=''))
@mock.patch.dict(os.environ, {'DISPLAY': ':0'})
def test_spawn_no_stdin_success(self):
ui = utilities.make_ui()
@@ -190,7 +194,8 @@ class TestExternalCommand(unittest.TestCase):
cmd.apply(ui)
ui.notify.assert_not_called()
- @mock.patch('alot.commands.globals.settings.get', mock.Mock(return_value=''))
+ @mock.patch(
+ 'alot.commands.globals.settings.get', mock.Mock(return_value=''))
@mock.patch.dict(os.environ, {'DISPLAY': ':0'})
def test_spawn_stdin_success(self):
ui = utilities.make_ui()
@@ -200,7 +205,8 @@ class TestExternalCommand(unittest.TestCase):
cmd.apply(ui)
ui.notify.assert_not_called()
- @mock.patch('alot.commands.globals.settings.get', mock.Mock(return_value=''))
+ @mock.patch(
+ 'alot.commands.globals.settings.get', mock.Mock(return_value=''))
@mock.patch.dict(os.environ, {'DISPLAY': ':0'})
def test_spawn_failure(self):
ui = utilities.make_ui()
diff --git a/tests/commands/thread_test.py b/tests/commands/thread_test.py
index 6897a953..81328410 100644
--- a/tests/commands/thread_test.py
+++ b/tests/commands/thread_test.py
@@ -163,7 +163,7 @@ class TestDetermineSender(unittest.TestCase):
expected = (u'to@example.com', account2)
self._test(accounts=[account1, account2, account3], expected=expected)
- def test_force_realname_includes_real_name_in_returned_address_if_defined(self):
+ def test_force_realname_has_real_name_in_returned_address_if_defined(self):
account1 = _AccountTestClass(address=u'foo@example.com')
account2 = _AccountTestClass(address=u'to@example.com', realname='Bar')
account3 = _AccountTestClass(address=u'baz@example.com')
@@ -179,7 +179,7 @@ class TestDetermineSender(unittest.TestCase):
self._test(accounts=[account1, account2, account3], expected=expected,
force_realname=True)
- def test_with_force_address_main_address_is_used_regardless_of_matching_address(self):
+ def test_with_force_address_main_address_is_always_used(self):
# In python 3.4 this and the next test could be written as subtests.
account1 = _AccountTestClass(address=u'foo@example.com')
account2 = _AccountTestClass(address=u'bar@example.com',
diff --git a/tests/commands/utils_tests.py b/tests/commands/utils_tests.py
index 5320aadd..c17473dc 100644
--- a/tests/commands/utils_tests.py
+++ b/tests/commands/utils_tests.py
@@ -57,7 +57,8 @@ def setUpModule():
with gpg.core.Context(armor=True) as ctx:
# Add the public and private keys. They have no password
- search_dir = os.path.join(os.path.dirname(__file__), '../static/gpg-keys')
+ search_dir = os.path.join(
+ os.path.dirname(__file__), '../static/gpg-keys')
for each in os.listdir(search_dir):
if os.path.splitext(each)[1] == '.gpg':
with open(os.path.join(search_dir, each)) as f:
@@ -106,7 +107,8 @@ class TestGetKeys(unittest.TestCase):
@inlineCallbacks
def test_get_keys_ambiguous(self):
"""Test gettings keys when when the key is ambiguous."""
- key = crypto.get_key(FPR, validate=True, encrypt=True, signed_only=False)
+ key = crypto.get_key(
+ FPR, validate=True, encrypt=True, signed_only=False)
ui = utilities.make_ui()
# Creat a ui.choice object that can satisfy twisted, but can also be
@@ -141,8 +143,8 @@ class TestSetEncrypt(unittest.TestCase):
envelope['To'] = 'ambig@example.com, test@example.com'
yield utils.set_encrypt(ui, envelope)
self.assertTrue(envelope.encrypt)
- self.assertEqual(
- [f.fpr for f in envelope.encrypt_keys.itervalues()],
+ self.assertCountEqual(
+ [f.fpr for f in envelope.encrypt_keys.values()],
[crypto.get_key(FPR).fpr, crypto.get_key(EXTRA_FPRS[0]).fpr])
@inlineCallbacks
@@ -152,8 +154,8 @@ class TestSetEncrypt(unittest.TestCase):
envelope['Cc'] = 'ambig@example.com, test@example.com'
yield utils.set_encrypt(ui, envelope)
self.assertTrue(envelope.encrypt)
- self.assertEqual(
- [f.fpr for f in envelope.encrypt_keys.itervalues()],
+ self.assertCountEqual(
+ [f.fpr for f in envelope.encrypt_keys.values()],
[crypto.get_key(FPR).fpr, crypto.get_key(EXTRA_FPRS[0]).fpr])
@inlineCallbacks
@@ -163,8 +165,8 @@ class TestSetEncrypt(unittest.TestCase):
envelope['Cc'] = 'foo@example.com, test@example.com'
yield utils.set_encrypt(ui, envelope)
self.assertTrue(envelope.encrypt)
- self.assertEqual(
- [f.fpr for f in envelope.encrypt_keys.itervalues()],
+ self.assertCountEqual(
+ [f.fpr for f in envelope.encrypt_keys.values()],
[crypto.get_key(FPR).fpr])
@inlineCallbacks
diff --git a/tests/completion_test.py b/tests/completion_test.py
index 5b335779..15a80a89 100644
--- a/tests/completion_test.py
+++ b/tests/completion_test.py
@@ -57,7 +57,8 @@ class AbooksCompleterTest(unittest.TestCase):
self.assertTupleEqual(actual[0], expected[0])
def test_empty_real_name_returns_plain_email_address(self):
- actual = self.__class__.example_abook_completer.complete("real-name", 9)
+ actual = self.__class__.example_abook_completer.complete(
+ "real-name", 9)
expected = [("no-real-name@example.com", 24)]
self._assert_only_one_list_entry(actual, expected)
@@ -79,7 +80,8 @@ class AbooksCompleterTest(unittest.TestCase):
def test_real_name_double_quotes(self):
actual = self.__class__.example_abook_completer.complete("dquote", 6)
expected = [("", 0)]
- expected = [(r""""double \"quote\" person" <dquote@example.com>""", 46)]
+ expected = [
+ (r""""double \"quote\" person" <dquote@example.com>""", 46)]
self._assert_only_one_list_entry(actual, expected)
def test_real_name_with_quotes_and_comma(self):
diff --git a/tests/crypto_test.py b/tests/crypto_test.py
index d481d64e..c3db1055 100644
--- a/tests/crypto_test.py
+++ b/tests/crypto_test.py
@@ -12,6 +12,7 @@ import unittest
import gpg
import mock
+import urwid
from alot import crypto
from alot.errors import GPGProblem, GPGCode
@@ -57,7 +58,9 @@ def tearDownModule():
# Kill any gpg-agent's that have been opened
lookfor = 'gpg-agent --homedir {}'.format(os.environ['GNUPGHOME'])
- out = subprocess.check_output(['ps', 'xo', 'pid,cmd'], stderr=DEVNULL)
+ out = subprocess.check_output(
+ ['ps', 'xo', 'pid,cmd'],
+ stderr=DEVNULL).decode(urwid.util.detected_encoding)
for each in out.strip().split('\n'):
pid, cmd = each.strip().split(' ', 1)
if cmd.startswith(lookfor):
@@ -109,9 +112,10 @@ class TestHashAlgorithmHelper(unittest.TestCase):
class TestDetachedSignatureFor(unittest.TestCase):
def test_valid_signature_generated(self):
- to_sign = "this is some text.\nit is more than nothing.\n"
+ to_sign = b"this is some text.\nit is more than nothing.\n"
with gpg.core.Context() as ctx:
- _, detached = crypto.detached_signature_for(to_sign, [ctx.get_key(FPR)])
+ _, detached = crypto.detached_signature_for(
+ to_sign, [ctx.get_key(FPR)])
with tempfile.NamedTemporaryFile(delete=False) as f:
f.write(detached)
@@ -131,9 +135,10 @@ class TestDetachedSignatureFor(unittest.TestCase):
class TestVerifyDetached(unittest.TestCase):
def test_verify_signature_good(self):
- to_sign = "this is some text.\nIt's something\n."
+ to_sign = b"this is some text.\nIt's something\n."
with gpg.core.Context() as ctx:
- _, detached = crypto.detached_signature_for(to_sign, [ctx.get_key(FPR)])
+ _, detached = crypto.detached_signature_for(
+ to_sign, [ctx.get_key(FPR)])
try:
crypto.verify_detached(to_sign, detached)
@@ -141,10 +146,11 @@ class TestVerifyDetached(unittest.TestCase):
raise AssertionError
def test_verify_signature_bad(self):
- to_sign = "this is some text.\nIt's something\n."
- similar = "this is some text.\r\n.It's something\r\n."
+ to_sign = b"this is some text.\nIt's something\n."
+ similar = b"this is some text.\r\n.It's something\r\n."
with gpg.core.Context() as ctx:
- _, detached = crypto.detached_signature_for(to_sign, [ctx.get_key(FPR)])
+ _, detached = crypto.detached_signature_for(
+ to_sign, [ctx.get_key(FPR)])
with self.assertRaises(GPGProblem):
crypto.verify_detached(similar, detached)
@@ -178,7 +184,8 @@ class TestValidateKey(unittest.TestCase):
def test_encrypt(self):
with self.assertRaises(GPGProblem) as caught:
- crypto.validate_key(utilities.make_key(can_encrypt=False), encrypt=True)
+ crypto.validate_key(
+ utilities.make_key(can_encrypt=False), encrypt=True)
self.assertEqual(caught.exception.code, GPGCode.KEY_CANNOT_ENCRYPT)
@@ -284,7 +291,8 @@ class TestGetKey(unittest.TestCase):
# once.
with gpg.core.Context() as ctx:
expected = ctx.get_key(FPR).uids[0].uid
- actual = crypto.get_key(FPR, validate=True, encrypt=True, sign=True).uids[0].uid
+ actual = crypto.get_key(
+ FPR, validate=True, encrypt=True, sign=True).uids[0].uid
self.assertEqual(expected, actual)
def test_missing_key(self):
@@ -304,7 +312,8 @@ class TestGetKey(unittest.TestCase):
except GPGProblem as e:
raise AssertionError(e)
- @mock.patch('alot.crypto.check_uid_validity', mock.Mock(return_value=False))
+ @mock.patch(
+ 'alot.crypto.check_uid_validity', mock.Mock(return_value=False))
def test_signed_only_false(self):
with self.assertRaises(GPGProblem) as e:
crypto.get_key(FPR, signed_only=True)
@@ -360,7 +369,7 @@ class TestGetKey(unittest.TestCase):
class TestEncrypt(unittest.TestCase):
def test_encrypt(self):
- to_encrypt = "this is a string\nof data."
+ to_encrypt = b"this is a string\nof data."
encrypted = crypto.encrypt(to_encrypt, keys=[crypto.get_key(FPR)])
with tempfile.NamedTemporaryFile(delete=False) as f:
@@ -368,15 +377,15 @@ class TestEncrypt(unittest.TestCase):
enc_file = f.name
self.addCleanup(os.unlink, enc_file)
- dec = subprocess.check_output(['gpg', '--decrypt', enc_file],
- stderr=DEVNULL)
+ dec = subprocess.check_output(
+ ['gpg', '--decrypt', enc_file], stderr=DEVNULL)
self.assertEqual(to_encrypt, dec)
class TestDecrypt(unittest.TestCase):
def test_decrypt(self):
- to_encrypt = "this is a string\nof data."
+ to_encrypt = b"this is a string\nof data."
encrypted = crypto.encrypt(to_encrypt, keys=[crypto.get_key(FPR)])
_, dec = crypto.decrypt_verify(encrypted)
self.assertEqual(to_encrypt, dec)
diff --git a/tests/db/thread_test.py b/tests/db/thread_test.py
index 678a5e59..8e4a5003 100644
--- a/tests/db/thread_test.py
+++ b/tests/db/thread_test.py
@@ -45,7 +45,7 @@ class TestThreadGetAuthor(unittest.TestCase):
m.get_author = mock.Mock(return_value=a)
get_messages.append(m)
gm = mock.Mock()
- gm.iterkeys = mock.Mock(return_value=get_messages)
+ gm.keys = mock.Mock(return_value=get_messages)
cls.__patchers.extend([
mock.patch('alot.db.thread.Thread.get_messages',
diff --git a/tests/db/utils_test.py b/tests/db/utils_test.py
index 3e7ef9d3..484562fc 100644
--- a/tests/db/utils_test.py
+++ b/tests/db/utils_test.py
@@ -6,6 +6,7 @@
from __future__ import absolute_import
import base64
+import codecs
import email
import email.header
import email.mime.application
@@ -171,6 +172,7 @@ class TestEncodeHeader(unittest.TestCase):
expected = email.header.Header('value')
self.assertEqual(actual, expected)
+ @unittest.expectedFailure
def test_unicode_chars_are_encoded(self):
actual = utils.encode_header('x-key', u'välüe')
expected = email.header.Header('=?utf-8?b?dsOkbMO8ZQ==?=')
@@ -243,10 +245,10 @@ class TestDecodeHeader(unittest.TestCase):
:rtype: str
"""
string = unicode_string.encode(encoding)
- output = '=?' + encoding + '?Q?'
+ output = b'=?' + encoding.encode('ascii') + b'?Q?'
for byte in string:
- output += '=' + byte.encode('hex').upper()
- return output + '?='
+ output += b'=' + codecs.encode(bytes([byte]), 'hex').upper()
+ return (output + b'?=').decode('ascii')
@staticmethod
def _base64(unicode_string, encoding):
@@ -260,8 +262,10 @@ class TestDecodeHeader(unittest.TestCase):
:rtype: str
"""
string = unicode_string.encode(encoding)
- b64 = base64.encodestring(string).strip()
- return '=?' + encoding + '?B?' + b64 + '?='
+ b64 = base64.encodebytes(string).strip()
+ result_bytes = b'=?' + encoding.encode('utf-8') + b'?B?' + b64 + b'?='
+ result = result_bytes.decode('ascii')
+ return result
def _test(self, teststring, expected):
@@ -315,7 +319,11 @@ class TestDecodeHeader(unittest.TestCase):
' again: ' + self._quote(part, 'utf-8') + \
' latin1: ' + self._base64(part, 'iso-8859-1') + \
' and ' + self._quote(part, 'iso-8859-1')
- expected = u'utf-8: ÄÖÜäöü again: ÄÖÜäöü latin1: ÄÖÜäöü and ÄÖÜäöü'
+ expected = (
+ u'utf-8: ÄÖÜäöü '
+ u'again: ÄÖÜäöü '
+ u'latin1: ÄÖÜäöü and ÄÖÜäöü'
+ )
self._test(text, expected)
def test_tabs_are_expanded_to_align_with_eigth_spaces(self):
@@ -377,18 +385,19 @@ class TestAddSignatureHeaders(unittest.TestCase):
self.assertIn((utils.X_SIGNATURE_VALID_HEADER, u'True'), mail.headers)
self.assertIn(
- (utils.X_SIGNATURE_MESSAGE_HEADER, u'Untrusted: mocked'), mail.headers)
+ (utils.X_SIGNATURE_MESSAGE_HEADER, u'Untrusted: mocked'),
+ mail.headers)
def test_unicode_as_bytes(self):
mail = self.FakeMail()
key = make_key()
- key.uids = [make_uid('andreá@example.com',
- uid=u'Andreá'.encode('utf-8'))]
+ key.uids = [make_uid('andreá@example.com', uid=u'Andreá')]
mail = self.check(key, True)
self.assertIn((utils.X_SIGNATURE_VALID_HEADER, u'True'), mail.headers)
self.assertIn(
- (utils.X_SIGNATURE_MESSAGE_HEADER, u'Valid: Andreá'), mail.headers)
+ (utils.X_SIGNATURE_MESSAGE_HEADER, u'Valid: Andreá'),
+ mail.headers)
def test_error_message_unicode(self):
mail = self.check(mock.Mock(), mock.Mock(), u'error message')
@@ -397,13 +406,6 @@ class TestAddSignatureHeaders(unittest.TestCase):
(utils.X_SIGNATURE_MESSAGE_HEADER, u'Invalid: error message'),
mail.headers)
- def test_error_message_bytes(self):
- mail = self.check(mock.Mock(), mock.Mock(), b'error message')
- self.assertIn((utils.X_SIGNATURE_VALID_HEADER, u'False'), mail.headers)
- self.assertIn(
- (utils.X_SIGNATURE_MESSAGE_HEADER, u'Invalid: error message'),
- mail.headers)
-
def test_get_key_fails(self):
mail = self.FakeMail()
with mock.patch('alot.db.utils.crypto.get_key',
@@ -433,7 +435,8 @@ class TestMessageFromFile(TestCaseClassCleanup):
with open(os.path.join(search_dir, each)) as f:
ctx.op_import(f)
- cls.keys = [ctx.get_key("DD19862809A7573A74058FF255937AFBB156245D")]
+ cls.keys = [
+ ctx.get_key("DD19862809A7573A74058FF255937AFBB156245D")]
def test_erase_alot_header_signature_valid(self):
"""Alot uses special headers for passing certain kinds of information,
@@ -442,13 +445,13 @@ class TestMessageFromFile(TestCaseClassCleanup):
"""
m = email.message.Message()
m.add_header(utils.X_SIGNATURE_VALID_HEADER, 'Bad')
- message = utils.message_from_file(io.BytesIO(m.as_string()))
+ message = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIs(message.get(utils.X_SIGNATURE_VALID_HEADER), None)
def test_erase_alot_header_message(self):
m = email.message.Message()
m.add_header(utils.X_SIGNATURE_MESSAGE_HEADER, 'Bad')
- message = utils.message_from_file(io.BytesIO(m.as_string()))
+ message = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIs(message.get(utils.X_SIGNATURE_MESSAGE_HEADER), None)
def test_plain_mail(self):
@@ -456,15 +459,15 @@ class TestMessageFromFile(TestCaseClassCleanup):
m['Subject'] = 'test'
m['From'] = 'me'
m['To'] = 'Nobody'
- message = utils.message_from_file(io.BytesIO(m.as_string()))
+ message = utils.message_from_file(io.StringIO(m.as_string()))
self.assertEqual(message.get_payload(), 'This is some text')
def _make_signed(self):
"""Create a signed message that is multipart/signed."""
- text = 'This is some text'
+ text = b'This is some text'
t = email.mime.text.MIMEText(text, 'plain', 'utf-8')
_, sig = crypto.detached_signature_for(
- helper.email_as_string(t), self.keys)
+ helper.email_as_bytes(t), self.keys)
s = email.mime.application.MIMEApplication(
sig, 'pgp-signature', email.encoders.encode_7or8bit)
m = email.mime.multipart.MIMEMultipart('signed', None, [t, s])
@@ -475,34 +478,35 @@ class TestMessageFromFile(TestCaseClassCleanup):
def test_signed_headers_included(self):
"""Headers are added to the message."""
m = self._make_signed()
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIn(utils.X_SIGNATURE_VALID_HEADER, m)
self.assertIn(utils.X_SIGNATURE_MESSAGE_HEADER, m)
def test_signed_valid(self):
"""Test that the signature is valid."""
m = self._make_signed()
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertEqual(m[utils.X_SIGNATURE_VALID_HEADER], 'True')
def test_signed_correct_from(self):
"""Test that the signature is valid."""
m = self._make_signed()
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
# Don't test for valid/invalid since that might change
- self.assertIn('ambig <ambig@example.com>', m[utils.X_SIGNATURE_MESSAGE_HEADER])
+ self.assertIn(
+ 'ambig <ambig@example.com>', m[utils.X_SIGNATURE_MESSAGE_HEADER])
def test_signed_wrong_mimetype_second_payload(self):
m = self._make_signed()
m.get_payload(1).set_type('text/plain')
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIn('expected Content-Type: ',
m[utils.X_SIGNATURE_MESSAGE_HEADER])
def test_signed_wrong_micalg(self):
m = self._make_signed()
m.set_param('micalg', 'foo')
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIn('expected micalg=pgp-...',
m[utils.X_SIGNATURE_MESSAGE_HEADER])
@@ -524,7 +528,7 @@ class TestMessageFromFile(TestCaseClassCleanup):
"""
m = self._make_signed()
m.set_param('micalg', 'PGP-SHA1')
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIn('expected micalg=pgp-',
m[utils.X_SIGNATURE_MESSAGE_HEADER])
@@ -539,7 +543,7 @@ class TestMessageFromFile(TestCaseClassCleanup):
"""
m = self._make_signed()
m.attach(email.mime.text.MIMEText('foo'))
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIn('expected exactly two messages, got 3',
m[utils.X_SIGNATURE_MESSAGE_HEADER])
@@ -551,9 +555,9 @@ class TestMessageFromFile(TestCaseClassCleanup):
if signed:
t = self._make_signed()
else:
- text = 'This is some text'
+ text = b'This is some text'
t = email.mime.text.MIMEText(text, 'plain', 'utf-8')
- enc = crypto.encrypt(t.as_string(), self.keys)
+ enc = crypto.encrypt(helper.email_as_bytes(t), self.keys)
e = email.mime.application.MIMEApplication(
enc, 'octet-stream', email.encoders.encode_7or8bit)
@@ -570,12 +574,12 @@ class TestMessageFromFile(TestCaseClassCleanup):
# of the mail, rather than replacing the whole encrypted payload with
# it's unencrypted equivalent
m = self._make_encrypted()
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertEqual(len(m.get_payload()), 3)
def test_encrypted_unsigned_is_decrypted(self):
m = self._make_encrypted()
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
# Check using m.walk, since we're not checking for ordering, just
# existence.
self.assertIn('This is some text', [n.get_payload() for n in m.walk()])
@@ -585,13 +589,13 @@ class TestMessageFromFile(TestCaseClassCleanup):
that there is a signature.
"""
m = self._make_encrypted()
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertNotIn(utils.X_SIGNATURE_VALID_HEADER, m)
self.assertNotIn(utils.X_SIGNATURE_MESSAGE_HEADER, m)
def test_encrypted_signed_is_decrypted(self):
m = self._make_encrypted(True)
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIn('This is some text', [n.get_payload() for n in m.walk()])
def test_encrypted_signed_headers(self):
@@ -599,23 +603,24 @@ class TestMessageFromFile(TestCaseClassCleanup):
there is a signature.
"""
m = self._make_encrypted(True)
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIn(utils.X_SIGNATURE_MESSAGE_HEADER, m)
- self.assertIn('ambig <ambig@example.com>', m[utils.X_SIGNATURE_MESSAGE_HEADER])
+ self.assertIn(
+ 'ambig <ambig@example.com>', m[utils.X_SIGNATURE_MESSAGE_HEADER])
# TODO: tests for the RFC 2440 style combined signed/encrypted blob
def test_encrypted_wrong_mimetype_first_payload(self):
m = self._make_encrypted()
m.get_payload(0).set_type('text/plain')
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIn('Malformed OpenPGP message:',
m.get_payload(2).get_payload())
def test_encrypted_wrong_mimetype_second_payload(self):
m = self._make_encrypted()
m.get_payload(1).set_type('text/plain')
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIn('Malformed OpenPGP message:',
m.get_payload(2).get_payload())
@@ -625,7 +630,7 @@ class TestMessageFromFile(TestCaseClassCleanup):
"""
s = self._make_signed()
m = email.mime.multipart.MIMEMultipart('mixed', None, [s])
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIn(utils.X_SIGNATURE_VALID_HEADER, m)
self.assertIn(utils.X_SIGNATURE_MESSAGE_HEADER, m)
@@ -635,7 +640,7 @@ class TestMessageFromFile(TestCaseClassCleanup):
"""
s = self._make_encrypted()
m = email.mime.multipart.MIMEMultipart('mixed', None, [s])
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIn('This is some text', [n.get_payload() for n in m.walk()])
self.assertNotIn(utils.X_SIGNATURE_VALID_HEADER, m)
self.assertNotIn(utils.X_SIGNATURE_MESSAGE_HEADER, m)
@@ -647,7 +652,7 @@ class TestMessageFromFile(TestCaseClassCleanup):
"""
s = self._make_encrypted(True)
m = email.mime.multipart.MIMEMultipart('mixed', None, [s])
- m = utils.message_from_file(io.BytesIO(m.as_string()))
+ m = utils.message_from_file(io.StringIO(m.as_string()))
self.assertIn('This is some text', [n.get_payload() for n in m.walk()])
self.assertIn(utils.X_SIGNATURE_VALID_HEADER, m)
self.assertIn(utils.X_SIGNATURE_MESSAGE_HEADER, m)
@@ -728,7 +733,8 @@ class TestExtractBody(unittest.TestCase):
@mock.patch('alot.db.utils.settings.mailcap_find_match',
mock.Mock(return_value=(None, {'view': 'cat'})))
def test_prefer_html(self):
- expected = '<!DOCTYPE html><html><body>This is an html email</body></html>'
+ expected = (
+ '<!DOCTYPE html><html><body>This is an html email</body></html>')
mail = self._make_mixed_plain_html()
actual = utils.extract_body(mail)
@@ -755,7 +761,8 @@ class TestExtractBody(unittest.TestCase):
'<!DOCTYPE html><html><body>This is an html email</body></html>',
'html'))
actual = utils.extract_body(mail)
- expected = '<!DOCTYPE html><html><body>This is an html email</body></html>'
+ expected = (
+ '<!DOCTYPE html><html><body>This is an html email</body></html>')
self.assertEqual(actual, expected)
@@ -768,7 +775,8 @@ class TestExtractBody(unittest.TestCase):
'<!DOCTYPE html><html><body>This is an html email</body></html>',
'html'))
actual = utils.extract_body(mail)
- expected = '<!DOCTYPE html><html><body>This is an html email</body></html>'
+ expected = (
+ '<!DOCTYPE html><html><body>This is an html email</body></html>')
self.assertEqual(actual, expected)
diff --git a/tests/helper_test.py b/tests/helper_test.py
index 4d003921..1d20caa8 100644
--- a/tests/helper_test.py
+++ b/tests/helper_test.py
@@ -143,13 +143,13 @@ class TestSplitCommandstring(unittest.TestCase):
self.assertListEqual(actual, expected)
def test_bytes(self):
- base = b'echo "foo bar"'
- expected = [b'echo', b'foo bar']
+ base = 'echo "foo bar"'
+ expected = ['echo', 'foo bar']
self._test(base, expected)
def test_unicode(self):
- base = u'echo "foo €"'
- expected = [b'echo', u'foo €'.encode('utf-8')]
+ base = 'echo "foo €"'
+ expected = ['echo', 'foo €']
self._test(base, expected)
@@ -221,20 +221,20 @@ class TestPrettyDatetime(unittest.TestCase):
p.stop()
def test_just_now(self):
- for i in (self.random.randint(0, 60) for _ in xrange(5)):
+ for i in (self.random.randint(0, 60) for _ in range(5)):
test = self.now - datetime.timedelta(seconds=i)
actual = helper.pretty_datetime(test)
self.assertEquals(actual, u'just now')
def test_x_minutes_ago(self):
- for i in (self.random.randint(60, 3600) for _ in xrange(10)):
+ for i in (self.random.randint(60, 3600) for _ in range(10)):
test = self.now - datetime.timedelta(seconds=i)
actual = helper.pretty_datetime(test)
self.assertEquals(
actual, u'{}min ago'.format((self.now - test).seconds // 60))
def test_x_hours_ago(self):
- for i in (self.random.randint(3600, 3600 * 6) for _ in xrange(10)):
+ for i in (self.random.randint(3600, 3600 * 6) for _ in range(10)):
test = self.now - datetime.timedelta(seconds=i)
actual = helper.pretty_datetime(test)
self.assertEquals(
@@ -251,7 +251,7 @@ class TestPrettyDatetime(unittest.TestCase):
expected = test.strftime('%I:%M%p').lower()
else:
expected = test.strftime('%H:%M')
- expected = expected.decode('utf-8')
+ expected = expected
return expected
def test_future_seconds(self):
diff --git a/tests/settings/manager_test.py b/tests/settings/manager_test.py
index 42f944db..d04e244d 100644
--- a/tests/settings/manager_test.py
+++ b/tests/settings/manager_test.py
@@ -22,7 +22,7 @@ from .. import utilities
class TestSettingsManager(unittest.TestCase):
def test_reading_synchronize_flags_from_notmuch_config(self):
- with tempfile.NamedTemporaryFile(delete=False) as f:
+ with tempfile.NamedTemporaryFile(mode='w+', delete=False) as f:
f.write(textwrap.dedent("""\
[maildir]
synchronize_flags = true
@@ -34,7 +34,7 @@ class TestSettingsManager(unittest.TestCase):
self.assertTrue(actual)
def test_parsing_notmuch_config_with_non_bool_synchronize_flag_fails(self):
- with tempfile.NamedTemporaryFile(delete=False) as f:
+ with tempfile.NamedTemporaryFile(mode='w+', delete=False) as f:
f.write(textwrap.dedent("""\
[maildir]
synchronize_flags = not bool
@@ -45,7 +45,7 @@ class TestSettingsManager(unittest.TestCase):
SettingsManager(notmuch_rc=f.name)
def test_reload_notmuch_config(self):
- with tempfile.NamedTemporaryFile(delete=False) as f:
+ with tempfile.NamedTemporaryFile(mode='w+', delete=False) as f:
f.write(textwrap.dedent("""\
[maildir]
synchronize_flags = false
@@ -53,7 +53,7 @@ class TestSettingsManager(unittest.TestCase):
self.addCleanup(os.unlink, f.name)
manager = SettingsManager(notmuch_rc=f.name)
- with tempfile.NamedTemporaryFile(delete=False) as f:
+ with tempfile.NamedTemporaryFile(mode='w+', delete=False) as f:
f.write(textwrap.dedent("""\
[maildir]
synchronize_flags = true
@@ -72,7 +72,7 @@ class TestSettingsManager(unittest.TestCase):
defaults not being loaded if there isn't an alot config files, and thus
calls like `get_theming_attribute` fail with strange exceptions.
"""
- with tempfile.NamedTemporaryFile(delete=False) as f:
+ with tempfile.NamedTemporaryFile(mode='w+', delete=False) as f:
f.write(textwrap.dedent("""\
[maildir]
synchronize_flags = true
@@ -86,7 +86,7 @@ class TestSettingsManager(unittest.TestCase):
# todo: For py3, don't mock the logger, use assertLogs
unknown_settings = ['templates_dir', 'unknown_section', 'unknown_1',
'unknown_2']
- with tempfile.NamedTemporaryFile(delete=False) as f:
+ with tempfile.NamedTemporaryFile(mode='w+', delete=False) as f:
f.write(textwrap.dedent("""\
{x[0]} = /templates/dir
[{x[1]}]
@@ -110,7 +110,7 @@ class TestSettingsManager(unittest.TestCase):
unknown_settings, mock_logger.info.call_args_list))
def test_read_notmuch_config_doesnt_exist(self):
- with tempfile.NamedTemporaryFile(delete=False) as f:
+ with tempfile.NamedTemporaryFile(mode='w+', delete=False) as f:
f.write(textwrap.dedent("""\
[accounts]
[[default]]
@@ -125,7 +125,7 @@ class TestSettingsManager(unittest.TestCase):
def test_dont_choke_on_regex_special_chars_in_tagstring(self):
tag = 'to**do'
- with tempfile.NamedTemporaryFile(delete=False) as f:
+ with tempfile.NamedTemporaryFile(mode='w+', delete=False) as f:
f.write(textwrap.dedent("""\
[tags]
[[{tag}]]
@@ -171,7 +171,7 @@ class TestSettingsManagerExpandEnvironment(unittest.TestCase):
user_setting = '/path/to/template/dir'
with mock.patch.dict('os.environ', {self.xdg_name: self.xdg_custom}):
- with tempfile.NamedTemporaryFile(delete=False) as f:
+ with tempfile.NamedTemporaryFile(mode='w+', delete=False) as f:
f.write('template_dir = {}'.format(user_setting))
self.addCleanup(os.unlink, f.name)
@@ -188,7 +188,7 @@ class TestSettingsManagerExpandEnvironment(unittest.TestCase):
with mock.patch.dict('os.environ', {self.xdg_name: self.xdg_custom,
'foo': foo_env}):
foo_in_config = 'foo_set_in_config'
- with tempfile.NamedTemporaryFile(delete=False) as f:
+ with tempfile.NamedTemporaryFile(mode='w+', delete=False) as f:
f.write(textwrap.dedent("""\
foo = {}
template_dir = ${{XDG_CONFIG_HOME}}/$foo/%(foo)s/${{foo}}
@@ -221,7 +221,7 @@ class TestSettingsManagerGetAccountByAddress(utilities.TestCaseClassCleanup):
""")
# Allow settings.reload to work by not deleting the file until the end
- with tempfile.NamedTemporaryFile(delete=False) as f:
+ with tempfile.NamedTemporaryFile(mode='w+', delete=False) as f:
f.write(config)
cls.addClassCleanup(os.unlink, f.name)
@@ -244,7 +244,7 @@ class TestSettingsManagerGetAccountByAddress(utilities.TestCaseClassCleanup):
def test_doesnt_exist_no_default(self):
with tempfile.NamedTemporaryFile() as f:
- f.write('')
+ f.write(b'')
settings = SettingsManager(alot_rc=f.name)
with self.assertRaises(NoMatchingAccount):
settings.get_account_by_address('that_guy@example.com',