summaryrefslogtreecommitdiff
path: root/tests/commands/test_global.py
diff options
context:
space:
mode:
Diffstat (limited to 'tests/commands/test_global.py')
-rw-r--r--tests/commands/test_global.py246
1 files changed, 246 insertions, 0 deletions
diff --git a/tests/commands/test_global.py b/tests/commands/test_global.py
new file mode 100644
index 00000000..9b026e6a
--- /dev/null
+++ b/tests/commands/test_global.py
@@ -0,0 +1,246 @@
+# encoding=utf-8
+# Copyright © 2017-2018 Dylan Baker
+#
+# This program is free software: you can redistribute it and/or modify
+# it under the terms of the GNU General Public License as published by
+# the Free Software Foundation, either version 3 of the License, or
+# (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+"""Tests for global commands."""
+
+import logging
+import os
+import tempfile
+import unittest
+
+import mock
+
+from alot.commands import globals as g_commands
+
+from .. import utilities
+
+
+class Stop(Exception):
+ """exception for stopping testing of giant unmanagable functions."""
+ pass
+
+
+class TestComposeCommand(unittest.TestCase):
+
+ """Tests for the compose command."""
+
+ @staticmethod
+ def _make_envelope_mock():
+ envelope = mock.Mock()
+ envelope.headers = {'From': 'foo <foo@example.com>'}
+ envelope.get = envelope.headers.get
+ envelope.sign_key = None
+ envelope.sign = False
+ return envelope
+
+ @staticmethod
+ 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
+ account.signature = None
+ return account
+
+ @utilities.async_test
+ async def test_apply_sign_by_default_okay(self):
+ envelope = self._make_envelope_mock()
+ envelope.account = self._make_account_mock()
+ cmd = g_commands.ComposeCommand(envelope=envelope)
+
+ with mock.patch('alot.commands.globals.settings.get_addressbooks',
+ mock.Mock(side_effect=Stop)):
+ try:
+ await cmd.apply(mock.Mock())
+ except Stop:
+ pass
+
+ self.assertTrue(envelope.sign)
+ self.assertIs(envelope.sign_key, mock.sentinel.gpg_key)
+
+ @utilities.async_test
+ async def test_apply_sign_by_default_false_doesnt_set_key(self):
+ envelope = self._make_envelope_mock()
+ envelope.account = self._make_account_mock(sign_by_default=False)
+ cmd = g_commands.ComposeCommand(envelope=envelope)
+
+ with mock.patch('alot.commands.globals.settings.get_addressbooks',
+ mock.Mock(side_effect=Stop)):
+ try:
+ await cmd.apply(mock.Mock())
+ except Stop:
+ pass
+
+ self.assertFalse(envelope.sign)
+ self.assertIs(envelope.sign_key, None)
+
+ @utilities.async_test
+ async def test_apply_sign_by_default_but_no_key(self):
+ envelope = self._make_envelope_mock()
+ envelope.account = self._make_account_mock(gpg_key=None)
+ cmd = g_commands.ComposeCommand(envelope=envelope)
+
+ with mock.patch('alot.commands.globals.settings.get_addressbooks',
+ mock.Mock(side_effect=Stop)):
+ try:
+ await cmd.apply(mock.Mock())
+ except Stop:
+ pass
+
+ self.assertFalse(envelope.sign)
+ self.assertIs(envelope.sign_key, None)
+
+ @utilities.async_test
+ async def test_decode_template_on_loading(self):
+ subject = u'This is a täßϑ subject.'
+ to = u'recipient@mail.com'
+ _from = u'foo.bar@mail.fr'
+ body = u'Body\n地初店会継思識棋御招告外児山望掲領環。\n€mail body €nd.'
+ with tempfile.NamedTemporaryFile('wb', delete=False) as f:
+ txt = u'Subject: {}\nTo: {}\nFrom: {}\n{}'.format(subject, to,
+ _from, body)
+ f.write(txt.encode('utf-8'))
+ self.addCleanup(os.unlink, f.name)
+
+ cmd = g_commands.ComposeCommand(template=f.name)
+
+ # Crutch to exit the giant `apply` method early.
+ with mock.patch(
+ 'alot.commands.globals.settings.get_accounts',
+ mock.Mock(side_effect=Stop)):
+ try:
+ await cmd.apply(mock.Mock())
+ except Stop:
+ pass
+
+ self.assertEqual({'To': [to],
+ 'From': [_from],
+ 'Subject': [subject]}, cmd.envelope.headers)
+ self.assertEqual(body, cmd.envelope.body)
+
+ @utilities.async_test
+ async def test_single_account_no_from(self):
+ # issue #1277
+ envelope = self._make_envelope_mock()
+ del envelope.headers['From']
+ envelope.account = self._make_account_mock()
+ envelope.account.realname = "foo"
+ envelope.account.address = 1 # maybe this should be a real Address?
+ cmd = g_commands.ComposeCommand(envelope=envelope)
+
+ with mock.patch('alot.commands.globals.settings.get_addressbooks',
+ mock.Mock(side_effect=Stop)):
+ try:
+ await cmd.apply(mock.Mock())
+ except Stop:
+ pass
+
+
+class TestExternalCommand(unittest.TestCase):
+
+ @utilities.async_test
+ async def test_no_spawn_no_stdin_success(self):
+ ui = utilities.make_ui()
+ cmd = g_commands.ExternalCommand(u'true', refocus=False)
+ await cmd.apply(ui)
+ ui.notify.assert_not_called()
+
+ @utilities.async_test
+ async def test_no_spawn_stdin_success(self):
+ ui = utilities.make_ui()
+ cmd = g_commands.ExternalCommand(u"awk '{ exit $0 }'", stdin=u'0',
+ refocus=False)
+ await cmd.apply(ui)
+ ui.notify.assert_not_called()
+
+ @utilities.async_test
+ async def test_no_spawn_no_stdin_attached(self):
+ ui = utilities.make_ui()
+ cmd = g_commands.ExternalCommand(u'test -t 0', refocus=False)
+ await cmd.apply(ui)
+ ui.notify.assert_not_called()
+
+ @utilities.async_test
+ async def test_no_spawn_stdin_attached(self):
+ ui = utilities.make_ui()
+ cmd = g_commands.ExternalCommand(
+ u"test -t 0", stdin=u'0', refocus=False)
+ await cmd.apply(ui)
+ ui.notify.assert_called_once_with('', priority='error')
+
+ @utilities.async_test
+ async def test_no_spawn_failure(self):
+ ui = utilities.make_ui()
+ cmd = g_commands.ExternalCommand(u'false', refocus=False)
+ await cmd.apply(ui)
+ ui.notify.assert_called_once_with('', priority='error')
+
+ @utilities.async_test
+ @mock.patch(
+ 'alot.commands.globals.settings.get', mock.Mock(return_value=''))
+ @mock.patch.dict(os.environ, {'DISPLAY': ':0'})
+ async def test_spawn_no_stdin_success(self):
+ ui = utilities.make_ui()
+ cmd = g_commands.ExternalCommand(u'true', refocus=False, spawn=True)
+ await cmd.apply(ui)
+ ui.notify.assert_not_called()
+
+ @utilities.async_test
+ @mock.patch(
+ 'alot.commands.globals.settings.get', mock.Mock(return_value=''))
+ @mock.patch.dict(os.environ, {'DISPLAY': ':0'})
+ async def test_spawn_stdin_success(self):
+ ui = utilities.make_ui()
+ cmd = g_commands.ExternalCommand(
+ u"awk '{ exit $0 }'",
+ stdin=u'0', refocus=False, spawn=True)
+ await cmd.apply(ui)
+ ui.notify.assert_not_called()
+
+ @utilities.async_test
+ @mock.patch(
+ 'alot.commands.globals.settings.get', mock.Mock(return_value=''))
+ @mock.patch.dict(os.environ, {'DISPLAY': ':0'})
+ async def test_spawn_failure(self):
+ ui = utilities.make_ui()
+ cmd = g_commands.ExternalCommand(u'false', refocus=False, spawn=True)
+ await cmd.apply(ui)
+ ui.notify.assert_called_once_with('', priority='error')
+
+
+class TestCallCommand(unittest.TestCase):
+
+ @utilities.async_test
+ async def test_synchronous_call(self):
+ ui = mock.Mock()
+ cmd = g_commands.CallCommand('ui()')
+ await cmd.apply(ui)
+ ui.assert_called_once()
+
+ @utilities.async_test
+ async def test_async_call(self):
+ async def func(obj):
+ obj()
+
+ ui = mock.Mock()
+ hooks = mock.Mock()
+ hooks.ui = None
+ hooks.func = func
+
+ with mock.patch('alot.commands.globals.settings.hooks', hooks):
+ cmd = g_commands.CallCommand('hooks.func(ui)')
+ await cmd.apply(ui)
+ ui.assert_called_once()