# encoding=utf-8

"""Test suite for alot.commands.__init__ module."""

import argparse
import unittest
from unittest import mock

from alot import commands
from alot.commands import thread

# Good descriptive test names often don't fit PEP8, which is meant to cover
# functions meant to be called by humans.
# pylint: disable=invalid-name

# These are tests, don't worry about names like "foo" and "bar"
# pylint: disable=blacklisted-name


class TestLookupCommand(unittest.TestCase):

    def test_look_up_save_attachment_command_in_thread_mode(self):
        cmd, parser, kwargs = commands.lookup_command('save', 'thread')
        # TODO do some more tests with these return values
        self.assertEqual(cmd, thread.SaveAttachmentCommand)
        self.assertIsInstance(parser, argparse.ArgumentParser)
        self.assertDictEqual(kwargs, {})


class TestCommandFactory(unittest.TestCase):

    def test_create_save_attachment_command_with_arguments(self):
        cmd = commands.commandfactory('save --all /foo', mode='thread')
        self.assertIsInstance(cmd, thread.SaveAttachmentCommand)
        self.assertTrue(cmd.all)
        self.assertEqual(cmd.path, '/foo')


class TestRegisterCommand(unittest.TestCase):
    """Tests for the registerCommand class."""

    def test_registered(self):
        """using registerCommand adds to the COMMANDS dict."""
        with mock.patch('alot.commands.COMMANDS', {'foo': {}}):
            @commands.registerCommand('foo', 'test')
            def foo():  # pylint: disable=unused-variable
                pass

            self.assertIn('test', commands.COMMANDS['foo'])
