# encoding=utf-8
# Copyright © 2017 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 .
"""Tests for global commands."""
from __future__ import absolute_import
from twisted.trial import unittest
from twisted.internet.defer import inlineCallbacks
import mock
from alot.commands import globals as g_commands
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 '}
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
@inlineCallbacks
def test_apply_sign_by_default_okay(self):
envelope = self._make_envelope_mock()
account = self._make_account_mock()
cmd = g_commands.ComposeCommand(envelope=envelope)
# This whole mess is required becasue ComposeCommand.apply is waaaaay
# too complicated, it needs to be split into more manageable segments.
with mock.patch('alot.commands.globals.settings.get_account_by_address',
mock.Mock(return_value=account)):
with mock.patch('alot.commands.globals.settings.get_accounts',
mock.Mock(return_value=[account])):
with mock.patch('alot.commands.globals.settings.get_addressbooks',
mock.Mock(side_effect=Stop)):
try:
yield cmd.apply(mock.Mock())
except Stop:
pass
self.assertTrue(envelope.sign)
self.assertIs(envelope.sign_key, mock.sentinel.gpg_key)
@inlineCallbacks
def test_apply_sign_by_default_false_doesnt_set_key(self):
envelope = self._make_envelope_mock()
account = self._make_account_mock(sign_by_default=False)
cmd = g_commands.ComposeCommand(envelope=envelope)
# This whole mess is required becasue ComposeCommand.apply is waaaaay
# too complicated, it needs to be split into more manageable segments.
with mock.patch('alot.commands.globals.settings.get_account_by_address',
mock.Mock(return_value=account)):
with mock.patch('alot.commands.globals.settings.get_accounts',
mock.Mock(return_value=[account])):
with mock.patch('alot.commands.globals.settings.get_addressbooks',
mock.Mock(side_effect=Stop)):
try:
yield cmd.apply(mock.Mock())
except Stop:
pass
self.assertFalse(envelope.sign)
self.assertIs(envelope.sign_key, None)
@inlineCallbacks
def test_apply_sign_by_default_but_no_key(self):
envelope = self._make_envelope_mock()
account = self._make_account_mock(gpg_key=None)
cmd = g_commands.ComposeCommand(envelope=envelope)
# This whole mess is required becasue ComposeCommand.apply is waaaaay
# too complicated, it needs to be split into more manageable segments.
with mock.patch('alot.commands.globals.settings.get_account_by_address',
mock.Mock(return_value=account)):
with mock.patch('alot.commands.globals.settings.get_accounts',
mock.Mock(return_value=[account])):
with mock.patch('alot.commands.globals.settings.get_addressbooks',
mock.Mock(side_effect=Stop)):
try:
yield cmd.apply(mock.Mock())
except Stop:
pass
self.assertFalse(envelope.sign)
self.assertIs(envelope.sign_key, None)