"""Tests for letsencrypt.cli."""
import itertools
import unittest

import mock


class CLITest(unittest.TestCase):
    """Tests for different commands."""

    @classmethod
    def _call(cls, args):
        from letsencrypt import cli
        args = ['--text'] + args
        with mock.patch('letsencrypt.cli.sys.stdout') as stdout:
            with mock.patch('letsencrypt.cli.sys.stderr') as stderr:
                with mock.patch('letsencrypt.cli.client') as client:
                    ret = cli.main(args)
        return ret, stdout, stderr, client

    def test_no_flags(self):
        self.assertRaises(SystemExit, self._call, [])

    def test_help(self):
        self.assertRaises(SystemExit, self._call, ['--help'])

    def test_rollback(self):
        _, _, _, client = self._call(['rollback'])
        client.rollback.assert_called_once()

        _, _, _, client = self._call(['rollback', '--checkpoints', '123'])
        client.rollback.assert_called_once_with(
            mock.ANY, 123, mock.ANY, mock.ANY)

    def test_config_changes(self):
        _, _, _, client = self._call(['config_changes'])
        client.view_config_changes.assert_called_once()

    def test_plugins(self):
        flags = ['--init', '--prepare', '--authenticators', '--installers']
        for args in itertools.chain(
                *(itertools.combinations(flags, r)
                  for r in xrange(len(flags)))):
            self._call(['plugins',] + list(args))


if __name__ == '__main__':
    unittest.main()  # pragma: no cover
