# Copyright 2012 Red Hat, Inc.
#
#    Licensed under the Apache License, Version 2.0 (the "License"); you may
#    not use this file except in compliance with the License. You may obtain
#    a copy of the License at
#
#         http://www.apache.org/licenses/LICENSE-2.0
#
#    Unless required by applicable law or agreed to in writing, software
#    distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
#    WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
#    License for the specific language governing permissions and limitations
#    under the License.
import json
import sys
import fixtures
import mock
from oslotest import base as test_base
import six
from ironicclient.common import cliutils
[docs]class ValidateArgsTest(test_base.BaseTestCase):
[docs]    def test_lambda_no_args(self):
        cliutils.validate_args(lambda: None) 
    def _test_lambda_with_args(self, *args, **kwargs):
        cliutils.validate_args(lambda x, y: None, *args, **kwargs)
[docs]    def test_lambda_positional_args(self):
        self._test_lambda_with_args(1, 2) 
[docs]    def test_lambda_kwargs(self):
        self._test_lambda_with_args(x=1, y=2) 
[docs]    def test_lambda_mixed_kwargs(self):
        self._test_lambda_with_args(1, y=2) 
[docs]    def test_lambda_missing_args1(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_lambda_with_args) 
[docs]    def test_lambda_missing_args2(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_lambda_with_args, 1) 
[docs]    def test_lambda_missing_args3(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_lambda_with_args, y=2) 
    def _test_lambda_with_default(self, *args, **kwargs):
        cliutils.validate_args(lambda x, y, z=3: None, *args, **kwargs)
[docs]    def test_lambda_positional_args_with_default(self):
        self._test_lambda_with_default(1, 2) 
[docs]    def test_lambda_kwargs_with_default(self):
        self._test_lambda_with_default(x=1, y=2) 
[docs]    def test_lambda_mixed_kwargs_with_default(self):
        self._test_lambda_with_default(1, y=2) 
[docs]    def test_lambda_positional_args_all_with_default(self):
        self._test_lambda_with_default(1, 2, 3) 
[docs]    def test_lambda_kwargs_all_with_default(self):
        self._test_lambda_with_default(x=1, y=2, z=3) 
[docs]    def test_lambda_mixed_kwargs_all_with_default(self):
        self._test_lambda_with_default(1, y=2, z=3) 
[docs]    def test_lambda_with_default_missing_args1(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_lambda_with_default) 
[docs]    def test_lambda_with_default_missing_args2(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_lambda_with_default, 1) 
[docs]    def test_lambda_with_default_missing_args3(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_lambda_with_default, y=2) 
[docs]    def test_lambda_with_default_missing_args4(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_lambda_with_default, y=2, z=3) 
[docs]    def test_function_no_args(self):
        def func():
            pass
        cliutils.validate_args(func) 
    def _test_function_with_args(self, *args, **kwargs):
        def func(x, y):
            pass
        cliutils.validate_args(func, *args, **kwargs)
[docs]    def test_function_positional_args(self):
        self._test_function_with_args(1, 2) 
[docs]    def test_function_kwargs(self):
        self._test_function_with_args(x=1, y=2) 
[docs]    def test_function_mixed_kwargs(self):
        self._test_function_with_args(1, y=2) 
[docs]    def test_function_missing_args1(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_function_with_args) 
[docs]    def test_function_missing_args2(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_function_with_args, 1) 
[docs]    def test_function_missing_args3(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_function_with_args, y=2) 
    def _test_function_with_default(self, *args, **kwargs):
        def func(x, y, z=3):
            pass
        cliutils.validate_args(func, *args, **kwargs)
[docs]    def test_function_positional_args_with_default(self):
        self._test_function_with_default(1, 2) 
[docs]    def test_function_kwargs_with_default(self):
        self._test_function_with_default(x=1, y=2) 
[docs]    def test_function_mixed_kwargs_with_default(self):
        self._test_function_with_default(1, y=2) 
[docs]    def test_function_positional_args_all_with_default(self):
        self._test_function_with_default(1, 2, 3) 
[docs]    def test_function_kwargs_all_with_default(self):
        self._test_function_with_default(x=1, y=2, z=3) 
[docs]    def test_function_mixed_kwargs_all_with_default(self):
        self._test_function_with_default(1, y=2, z=3) 
[docs]    def test_function_with_default_missing_args1(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_function_with_default) 
[docs]    def test_function_with_default_missing_args2(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_function_with_default, 1) 
[docs]    def test_function_with_default_missing_args3(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_function_with_default, y=2) 
[docs]    def test_function_with_default_missing_args4(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_function_with_default, y=2, z=3) 
[docs]    def test_bound_method_no_args(self):
        class Foo(object):
            def bar(self):
                pass
        cliutils.validate_args(Foo().bar) 
    def _test_bound_method_with_args(self, *args, **kwargs):
        class Foo(object):
            def bar(self, x, y):
                pass
        cliutils.validate_args(Foo().bar, *args, **kwargs)
[docs]    def test_bound_method_positional_args(self):
        self._test_bound_method_with_args(1, 2) 
[docs]    def test_bound_method_kwargs(self):
        self._test_bound_method_with_args(x=1, y=2) 
[docs]    def test_bound_method_mixed_kwargs(self):
        self._test_bound_method_with_args(1, y=2) 
[docs]    def test_bound_method_missing_args1(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_bound_method_with_args) 
[docs]    def test_bound_method_missing_args2(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_bound_method_with_args, 1) 
[docs]    def test_bound_method_missing_args3(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_bound_method_with_args, y=2) 
    def _test_bound_method_with_default(self, *args, **kwargs):
        class Foo(object):
            def bar(self, x, y, z=3):
                pass
        cliutils.validate_args(Foo().bar, *args, **kwargs)
[docs]    def test_bound_method_positional_args_with_default(self):
        self._test_bound_method_with_default(1, 2) 
[docs]    def test_bound_method_kwargs_with_default(self):
        self._test_bound_method_with_default(x=1, y=2) 
[docs]    def test_bound_method_mixed_kwargs_with_default(self):
        self._test_bound_method_with_default(1, y=2) 
[docs]    def test_bound_method_positional_args_all_with_default(self):
        self._test_bound_method_with_default(1, 2, 3) 
[docs]    def test_bound_method_kwargs_all_with_default(self):
        self._test_bound_method_with_default(x=1, y=2, z=3) 
[docs]    def test_bound_method_mixed_kwargs_all_with_default(self):
        self._test_bound_method_with_default(1, y=2, z=3) 
[docs]    def test_bound_method_with_default_missing_args1(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_bound_method_with_default) 
[docs]    def test_bound_method_with_default_missing_args2(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_bound_method_with_default, 1) 
[docs]    def test_bound_method_with_default_missing_args3(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_bound_method_with_default, y=2) 
[docs]    def test_bound_method_with_default_missing_args4(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_bound_method_with_default, y=2, z=3) 
[docs]    def test_unbound_method_no_args(self):
        class Foo(object):
            def bar(self):
                pass
        cliutils.validate_args(Foo.bar, Foo()) 
    def _test_unbound_method_with_args(self, *args, **kwargs):
        class Foo(object):
            def bar(self, x, y):
                pass
        cliutils.validate_args(Foo.bar, Foo(), *args, **kwargs)
[docs]    def test_unbound_method_positional_args(self):
        self._test_unbound_method_with_args(1, 2) 
[docs]    def test_unbound_method_kwargs(self):
        self._test_unbound_method_with_args(x=1, y=2) 
[docs]    def test_unbound_method_mixed_kwargs(self):
        self._test_unbound_method_with_args(1, y=2) 
[docs]    def test_unbound_method_missing_args1(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_unbound_method_with_args) 
[docs]    def test_unbound_method_missing_args2(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_unbound_method_with_args, 1) 
[docs]    def test_unbound_method_missing_args3(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_unbound_method_with_args, y=2) 
    def _test_unbound_method_with_default(self, *args, **kwargs):
        class Foo(object):
            def bar(self, x, y, z=3):
                pass
        cliutils.validate_args(Foo.bar, Foo(), *args, **kwargs)
[docs]    def test_unbound_method_positional_args_with_default(self):
        self._test_unbound_method_with_default(1, 2) 
[docs]    def test_unbound_method_kwargs_with_default(self):
        self._test_unbound_method_with_default(x=1, y=2) 
[docs]    def test_unbound_method_mixed_kwargs_with_default(self):
        self._test_unbound_method_with_default(1, y=2) 
[docs]    def test_unbound_method_with_default_missing_args1(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_unbound_method_with_default) 
[docs]    def test_unbound_method_with_default_missing_args2(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_unbound_method_with_default, 1) 
[docs]    def test_unbound_method_with_default_missing_args3(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_unbound_method_with_default, y=2) 
[docs]    def test_unbound_method_with_default_missing_args4(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_unbound_method_with_default, y=2, z=3) 
[docs]    def test_class_method_no_args(self):
        class Foo(object):
            @classmethod
            def bar(cls):
                pass
        cliutils.validate_args(Foo.bar) 
    def _test_class_method_with_args(self, *args, **kwargs):
        class Foo(object):
            @classmethod
            def bar(cls, x, y):
                pass
        cliutils.validate_args(Foo.bar, *args, **kwargs)
[docs]    def test_class_method_positional_args(self):
        self._test_class_method_with_args(1, 2) 
[docs]    def test_class_method_kwargs(self):
        self._test_class_method_with_args(x=1, y=2) 
[docs]    def test_class_method_mixed_kwargs(self):
        self._test_class_method_with_args(1, y=2) 
[docs]    def test_class_method_missing_args1(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_class_method_with_args) 
[docs]    def test_class_method_missing_args2(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_class_method_with_args, 1) 
[docs]    def test_class_method_missing_args3(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_class_method_with_args, y=2) 
    def _test_class_method_with_default(self, *args, **kwargs):
        class Foo(object):
            @classmethod
            def bar(cls, x, y, z=3):
                pass
        cliutils.validate_args(Foo.bar, *args, **kwargs)
[docs]    def test_class_method_positional_args_with_default(self):
        self._test_class_method_with_default(1, 2) 
[docs]    def test_class_method_kwargs_with_default(self):
        self._test_class_method_with_default(x=1, y=2) 
[docs]    def test_class_method_mixed_kwargs_with_default(self):
        self._test_class_method_with_default(1, y=2) 
[docs]    def test_class_method_with_default_missing_args1(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_class_method_with_default) 
[docs]    def test_class_method_with_default_missing_args2(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_class_method_with_default, 1) 
[docs]    def test_class_method_with_default_missing_args3(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_class_method_with_default, y=2) 
[docs]    def test_class_method_with_default_missing_args4(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_class_method_with_default, y=2, z=3) 
[docs]    def test_static_method_no_args(self):
        class Foo(object):
            @staticmethod
            def bar():
                pass
        cliutils.validate_args(Foo.bar) 
    def _test_static_method_with_args(self, *args, **kwargs):
        class Foo(object):
            @staticmethod
            def bar(x, y):
                pass
        cliutils.validate_args(Foo.bar, *args, **kwargs)
[docs]    def test_static_method_positional_args(self):
        self._test_static_method_with_args(1, 2) 
[docs]    def test_static_method_kwargs(self):
        self._test_static_method_with_args(x=1, y=2) 
[docs]    def test_static_method_mixed_kwargs(self):
        self._test_static_method_with_args(1, y=2) 
[docs]    def test_static_method_missing_args1(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_static_method_with_args) 
[docs]    def test_static_method_missing_args2(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_static_method_with_args, 1) 
[docs]    def test_static_method_missing_args3(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_static_method_with_args, y=2) 
    def _test_static_method_with_default(self, *args, **kwargs):
        class Foo(object):
            @staticmethod
            def bar(x, y, z=3):
                pass
        cliutils.validate_args(Foo.bar, *args, **kwargs)
[docs]    def test_static_method_positional_args_with_default(self):
        self._test_static_method_with_default(1, 2) 
[docs]    def test_static_method_kwargs_with_default(self):
        self._test_static_method_with_default(x=1, y=2) 
[docs]    def test_static_method_mixed_kwargs_with_default(self):
        self._test_static_method_with_default(1, y=2) 
[docs]    def test_static_method_with_default_missing_args1(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_static_method_with_default) 
[docs]    def test_static_method_with_default_missing_args2(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_static_method_with_default, 1) 
[docs]    def test_static_method_with_default_missing_args3(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_static_method_with_default, y=2) 
[docs]    def test_static_method_with_default_missing_args4(self):
        self.assertRaises(cliutils.MissingArgs,
                          self._test_static_method_with_default, y=2, z=3)  
class _FakeResult(object):
    def __init__(self, name, value):
        self.name = name
        self.value = value
[docs]class PrintResultTestCase(test_base.BaseTestCase):
[docs]    def setUp(self):
        super(PrintResultTestCase, self).setUp()
        self.mock_add_row = mock.MagicMock()
        self.useFixture(fixtures.MonkeyPatch(
            "prettytable.PrettyTable.add_row",
            self.mock_add_row))
        self.mock_get_string = mock.MagicMock(return_value="")
        self.useFixture(fixtures.MonkeyPatch(
            "prettytable.PrettyTable.get_string",
            self.mock_get_string))
        self.mock_init = mock.MagicMock(return_value=None)
        self.useFixture(fixtures.MonkeyPatch(
            "prettytable.PrettyTable.__init__",
            self.mock_init))
        # NOTE(dtantsur): won't work with mocked __init__
        self.useFixture(fixtures.MonkeyPatch(
            "prettytable.PrettyTable.align",
            mock.MagicMock())) 
[docs]    def test_print_list_sort_by_str(self):
        objs = [_FakeResult("k1", 1),
                _FakeResult("k3", 2),
                _FakeResult("k2", 3)]
        cliutils.print_list(objs, ["Name", "Value"], sortby_index=0)
        self.assertEqual(self.mock_add_row.call_args_list,
                         [mock.call(["k1", 1]),
                          mock.call(["k3", 2]),
                          mock.call(["k2", 3])])
        self.mock_get_string.assert_called_with(sortby="Name")
        self.mock_init.assert_called_once_with(["Name", "Value"]) 
[docs]    def test_print_list_sort_by_integer(self):
        objs = [_FakeResult("k1", 1),
                _FakeResult("k2", 3),
                _FakeResult("k3", 2)]
        cliutils.print_list(objs, ["Name", "Value"], sortby_index=1)
        self.assertEqual(self.mock_add_row.call_args_list,
                         [mock.call(["k1", 1]),
                          mock.call(["k2", 3]),
                          mock.call(["k3", 2])])
        self.mock_get_string.assert_called_with(sortby="Value")
        self.mock_init.assert_called_once_with(["Name", "Value"]) 
[docs]    def test_print_list_sort_by_none(self):
        objs = [_FakeResult("k1", 1),
                _FakeResult("k3", 3),
                _FakeResult("k2", 2)]
        cliutils.print_list(objs, ["Name", "Value"], sortby_index=None)
        self.assertEqual(self.mock_add_row.call_args_list,
                         [mock.call(["k1", 1]),
                          mock.call(["k3", 3]),
                          mock.call(["k2", 2])])
        self.mock_get_string.assert_called_with()
        self.mock_init.assert_called_once_with(["Name", "Value"]) 
[docs]    def test_print_list_dict(self):
        objs = [{'name': 'k1', 'value': 1},
                {'name': 'k2', 'value': 2}]
        cliutils.print_list(objs, ["Name", "Value"], sortby_index=None)
        self.assertEqual(self.mock_add_row.call_args_list,
                         [mock.call(["k1", 1]),
                          mock.call(["k2", 2])])
        self.mock_get_string.assert_called_with()
        self.mock_init.assert_called_once_with(["Name", "Value"]) 
[docs]    def test_print_dict(self):
        cliutils.print_dict({"K": "k", "Key": "Value"})
        cliutils.print_dict({"K": "k", "Key": "Long\\nValue"})
        self.mock_add_row.assert_has_calls([
            mock.call(["K", "k"]),
            mock.call(["Key", "Value"]),
            mock.call(["K", "k"]),
            mock.call(["Key", "Long"]),
            mock.call(["", "Value"])],
            any_order=True) 
[docs]    def test_print_list_field_labels(self):
        objs = [_FakeResult("k1", 1),
                _FakeResult("k3", 3),
                _FakeResult("k2", 2)]
        field_labels = ["Another Name", "Another Value"]
        cliutils.print_list(objs, ["Name", "Value"], sortby_index=None,
                            field_labels=field_labels)
        self.assertEqual(self.mock_add_row.call_args_list,
                         [mock.call(["k1", 1]),
                          mock.call(["k3", 3]),
                          mock.call(["k2", 2])])
        self.mock_init.assert_called_once_with(field_labels) 
[docs]    def test_print_list_field_labels_sort(self):
        objs = [_FakeResult("k1", 1),
                _FakeResult("k3", 3),
                _FakeResult("k2", 2)]
        field_labels = ["Another Name", "Another Value"]
        cliutils.print_list(objs, ["Name", "Value"], sortby_index=0,
                            field_labels=field_labels)
        self.assertEqual(self.mock_add_row.call_args_list,
                         [mock.call(["k1", 1]),
                          mock.call(["k3", 3]),
                          mock.call(["k2", 2])])
        self.mock_init.assert_called_once_with(field_labels)
        self.mock_get_string.assert_called_with(sortby="Another Name") 
[docs]    def test_print_list_field_labels_too_many(self):
        objs = [_FakeResult("k1", 1),
                _FakeResult("k3", 3),
                _FakeResult("k2", 2)]
        field_labels = ["Another Name", "Another Value", "Redundant"]
        self.assertRaises(ValueError, cliutils.print_list,
                          objs, ["Name", "Value"], sortby_index=None,
                          field_labels=field_labels)  
[docs]class PrintResultStringTestCase(test_base.BaseTestCase):
[docs]    def test_print_list_string(self):
        objs = [_FakeResult("k1", 1)]
        field_labels = ["Another Name", "Another Value"]
        orig = sys.stdout
        sys.stdout = six.StringIO()
        cliutils.print_list(objs, ["Name", "Value"], sortby_index=0,
                            field_labels=field_labels)
        out = sys.stdout.getvalue()
        sys.stdout.close()
        sys.stdout = orig
        expected = '''\
+--------------+---------------+
| Another Name | Another Value |
+--------------+---------------+
| k1           | 1             |
+--------------+---------------+
'''
        self.assertEqual(expected, out) 
[docs]    def test_print_list_string_json(self):
        objs = [_FakeResult("k1", 1)]
        field_labels = ["Another Name", "Another Value"]
        orig = sys.stdout
        sys.stdout = six.StringIO()
        cliutils.print_list(objs, ["Name", "Value"], sortby_index=0,
                            field_labels=field_labels, json_flag=True)
        out = sys.stdout.getvalue()
        sys.stdout.close()
        sys.stdout = orig
        expected = [{"name": "k1", "value": 1}]
        self.assertEqual(expected, json.loads(out)) 
[docs]    def test_print_dict_string(self):
        orig = sys.stdout
        sys.stdout = six.StringIO()
        cliutils.print_dict({"K": "k", "Key": "Value"})
        out = sys.stdout.getvalue()
        sys.stdout.close()
        sys.stdout = orig
        expected = '''\
+----------+-------+
| Property | Value |
+----------+-------+
| K        | k     |
| Key      | Value |
+----------+-------+
'''
        self.assertEqual(expected, out) 
[docs]    def test_print_dict_string_json(self):
        orig = sys.stdout
        sys.stdout = six.StringIO()
        cliutils.print_dict({"K": "k", "Key": "Value"}, json_flag=True)
        out = sys.stdout.getvalue()
        sys.stdout.close()
        sys.stdout = orig
        expected = {"K": "k", "Key": "Value"}
        self.assertEqual(expected, json.loads(out)) 
[docs]    def test_print_dict_string_sorted(self):
        orig = sys.stdout
        sys.stdout = six.StringIO()
        cliutils.print_dict({"Foo": "k", "Bar": "Value"})
        out = sys.stdout.getvalue()
        sys.stdout.close()
        sys.stdout = orig
        expected = '''\
+----------+-------+
| Property | Value |
+----------+-------+
| Bar      | Value |
| Foo      | k     |
+----------+-------+
'''
        self.assertEqual(expected, out)  
[docs]class DecoratorsTestCase(test_base.BaseTestCase):
[docs]    def test_arg(self):
        func_args = [("--image", ), ("--flavor", )]
        func_kwargs = [dict(default=None,
                            metavar="<image>"),
                       dict(default=None,
                            metavar="<flavor>")]
        @cliutils.arg(*func_args[1], **func_kwargs[1])
        @cliutils.arg(*func_args[0], **func_kwargs[0])
        def dummy_func():
            pass
        self.assertTrue(hasattr(dummy_func, "arguments"))
        self.assertEqual(len(dummy_func.arguments), 2)
        for args_kwargs in zip(func_args, func_kwargs):
            self.assertIn(args_kwargs, dummy_func.arguments) 
[docs]    def test_unauthenticated(self):
        def dummy_func():
            pass
        self.assertFalse(cliutils.isunauthenticated(dummy_func))
        dummy_func = cliutils.unauthenticated(dummy_func)
        self.assertTrue(cliutils.isunauthenticated(dummy_func))  
[docs]class EnvTestCase(test_base.BaseTestCase):
[docs]    def test_env(self):
        env = {"alpha": "a", "beta": "b"}
        self.useFixture(fixtures.MonkeyPatch("os.environ", env))
        self.assertEqual(env["beta"], cliutils.env("beta"))
        self.assertEqual(env["beta"], cliutils.env("beta", "alpha"))
        self.assertEqual(env["alpha"], cliutils.env("alpha", "beta"))
        self.assertEqual(env["beta"], cliutils.env("gamma", "beta"))
        self.assertEqual("", cliutils.env("gamma"))
        self.assertEqual("c", cliutils.env("gamma", default="c"))  
[docs]class GetPasswordTestCase(test_base.BaseTestCase):
[docs]    def setUp(self):
        super(GetPasswordTestCase, self).setUp()
        class FakeFile(object):
            def isatty(self):
                return True
        self.useFixture(fixtures.MonkeyPatch("sys.stdin", FakeFile())) 
[docs]    def test_get_password(self):
        self.useFixture(fixtures.MonkeyPatch("getpass.getpass",
                                             lambda prompt: "mellon"))
        self.assertEqual("mellon", cliutils.get_password()) 
[docs]    def test_get_password_verify(self):
        env = {"OS_VERIFY_PASSWORD": "True"}
        self.useFixture(fixtures.MonkeyPatch("os.environ", env))
        self.useFixture(fixtures.MonkeyPatch("getpass.getpass",
                                             lambda prompt: "mellon"))
        self.assertEqual("mellon", cliutils.get_password()) 
[docs]    def test_get_password_verify_failure(self):
        env = {"OS_VERIFY_PASSWORD": "True"}
        self.useFixture(fixtures.MonkeyPatch("os.environ", env))
        self.useFixture(fixtures.MonkeyPatch("getpass.getpass",
                                             lambda prompt: prompt))
        self.assertIsNone(cliutils.get_password())