/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
3948.2.6 by Martin Pool
ProgressBarStack is deprecated
1
# Copyright (C) 2005, 2008, 2009 Canonical Ltd
1185.49.22 by John Arbash Meinel
Added get_password to the UIFactory, using it inside of sftp.py
2
#
3
# This program is free software; you can redistribute it and/or modify
4
# it under the terms of the GNU General Public License as published by
5
# the Free Software Foundation; either version 2 of the License, or
6
# (at your option) any later version.
7
#
8
# This program is distributed in the hope that it will be useful,
9
# but WITHOUT ANY WARRANTY; without even the implied warranty of
10
# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
11
# GNU General Public License for more details.
12
#
13
# You should have received a copy of the GNU General Public License
14
# along with this program; if not, write to the Free Software
4183.7.1 by Sabin Iacob
update FSF mailing address
15
# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
1185.49.22 by John Arbash Meinel
Added get_password to the UIFactory, using it inside of sftp.py
16
17
"""Tests for the bzrlib ui
18
"""
19
20
import os
1704.2.9 by Martin Pool
Make text_factory test not depend on 80-col terminal
21
import re
4017.1.1 by John Arbash Meinel
Get a pb.tick() to work after calling pb.update()
22
import time
1185.49.22 by John Arbash Meinel
Added get_password to the UIFactory, using it inside of sftp.py
23
4488.1.1 by Vincent Ladeuil
(vila) Cleanup imports in some test files
24
from bzrlib import (
25
    errors,
26
    tests,
27
    ui as _mod_ui,
4449.3.4 by Martin Pool
ProgressTask now talks to ProgressView; easier to test
28
    )
3948.2.6 by Martin Pool
ProgressBarStack is deprecated
29
from bzrlib.symbol_versioning import (
30
    deprecated_in,
31
    )
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
32
from bzrlib.tests import test_progress
33
from bzrlib.ui import text as _mod_ui_text
1185.49.22 by John Arbash Meinel
Added get_password to the UIFactory, using it inside of sftp.py
34
1681.1.2 by Robert Collins
* bzrlib.ui.text.TextUIFactory now accepts a bar_type parameter which
35
4711.1.6 by Martin Pool
Separate TextUIFactory tests
36
class TestTextUIFactory(tests.TestCase):
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
37
38
    def test_text_factory_ascii_password(self):
4488.1.1 by Vincent Ladeuil
(vila) Cleanup imports in some test files
39
        ui = tests.TestUIFactory(stdin='secret\n',
40
                                 stdout=tests.StringIOWrapper(),
41
                                 stderr=tests.StringIOWrapper())
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
42
        pb = ui.nested_progress_bar()
43
        try:
44
            self.assertEqual('secret',
45
                             self.apply_redirected(ui.stdin, ui.stdout,
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
46
                                                   ui.stderr,
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
47
                                                   ui.get_password))
48
            # ': ' is appended to prompt
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
49
            self.assertEqual(': ', ui.stderr.getvalue())
50
            self.assertEqual('', ui.stdout.readline())
2363.4.3 by Vincent Ladeuil
Tidy-up tests.
51
            # stdin should be empty
2363.4.6 by Vincent Ladeuil
Fix tests around stdin emptyness.
52
            self.assertEqual('', ui.stdin.readline())
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
53
        finally:
54
            pb.finished()
55
56
    def test_text_factory_utf8_password(self):
57
        """Test an utf8 password.
58
59
        We can't predict what encoding users will have for stdin, so we force
60
        it to utf8 to test that we transport the password correctly.
61
        """
4488.1.1 by Vincent Ladeuil
(vila) Cleanup imports in some test files
62
        ui = tests.TestUIFactory(stdin=u'baz\u1234'.encode('utf8'),
63
                                 stdout=tests.StringIOWrapper(),
64
                                 stderr=tests.StringIOWrapper())
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
65
        ui.stderr.encoding = ui.stdout.encoding = ui.stdin.encoding = 'utf8'
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
66
        pb = ui.nested_progress_bar()
67
        try:
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
68
            password = self.apply_redirected(ui.stdin, ui.stdout, ui.stderr,
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
69
                                             ui.get_password,
70
                                             u'Hello \u1234 %(user)s',
71
                                             user=u'some\u1234')
72
            # We use StringIO objects, we need to decode them
73
            self.assertEqual(u'baz\u1234', password.decode('utf8'))
74
            self.assertEqual(u'Hello \u1234 some\u1234: ',
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
75
                             ui.stderr.getvalue().decode('utf8'))
76
            # stdin and stdout should be empty
2363.4.6 by Vincent Ladeuil
Fix tests around stdin emptyness.
77
            self.assertEqual('', ui.stdin.readline())
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
78
            self.assertEqual('', ui.stdout.readline())
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
79
        finally:
80
            pb.finished()
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
81
82
    def test_progress_note(self):
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
83
        stderr = tests.StringIOWrapper()
84
        stdout = tests.StringIOWrapper()
85
        ui_factory = _mod_ui_text.TextUIFactory(stdin=tests.StringIOWrapper(''),
86
                                                stderr=stderr,
87
                                                stdout=stdout)
1558.8.5 by Aaron Bentley
Pass note up the stack instead of using bzrlib.ui_factory
88
        pb = ui_factory.nested_progress_bar()
1558.8.4 by Aaron Bentley
Fixed test case for pb.note
89
        try:
4712.1.3 by Martin Pool
Update deprecation version
90
            result = self.applyDeprecated(deprecated_in((2, 1, 0)),
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
91
                pb.note,
92
                't')
1558.8.4 by Aaron Bentley
Fixed test case for pb.note
93
            self.assertEqual(None, result)
94
            self.assertEqual("t\n", stdout.getvalue())
1843.3.2 by John Arbash Meinel
Fix a ui test that depended on clearing
95
            # Since there was no update() call, there should be no clear() call
2363.4.4 by Vincent Ladeuil
More tidying-up.
96
            self.failIf(re.search(r'^\r {10,}\r$',
97
                                  stderr.getvalue()) is not None,
1843.3.2 by John Arbash Meinel
Fix a ui test that depended on clearing
98
                        'We cleared the stderr without anything to put there')
99
        finally:
100
            pb.finished()
101
102
    def test_progress_note_clears(self):
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
103
        stderr = test_progress._TTYStringIO()
104
        stdout = test_progress._TTYStringIO()
4449.3.4 by Martin Pool
ProgressTask now talks to ProgressView; easier to test
105
        # so that we get a TextProgressBar
106
        os.environ['TERM'] = 'xterm'
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
107
        ui_factory = _mod_ui_text.TextUIFactory(
108
            stdin=tests.StringIOWrapper(''),
3882.8.4 by Martin Pool
All UI factories should support note()
109
            stdout=stdout, stderr=stderr)
4449.3.4 by Martin Pool
ProgressTask now talks to ProgressView; easier to test
110
        self.assertIsInstance(ui_factory._progress_view,
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
111
                              _mod_ui_text.TextProgressView)
1843.3.2 by John Arbash Meinel
Fix a ui test that depended on clearing
112
        pb = ui_factory.nested_progress_bar()
113
        try:
114
            # Create a progress update that isn't throttled
115
            pb.update('x', 1, 1)
4712.1.4 by Martin Pool
One more deprecation
116
            result = self.applyDeprecated(deprecated_in((2, 1, 0)),
4471.2.2 by Martin Pool
Deprecate ProgressTask.note
117
                pb.note, 't')
1843.3.2 by John Arbash Meinel
Fix a ui test that depended on clearing
118
            self.assertEqual(None, result)
119
            self.assertEqual("t\n", stdout.getvalue())
1558.8.4 by Aaron Bentley
Fixed test case for pb.note
120
            # the exact contents will depend on the terminal width and we don't
121
            # care about that right now - but you're probably running it on at
122
            # least a 10-character wide terminal :)
1843.3.2 by John Arbash Meinel
Fix a ui test that depended on clearing
123
            self.assertContainsRe(stderr.getvalue(), r'\r {10,}\r$')
1558.8.4 by Aaron Bentley
Fixed test case for pb.note
124
        finally:
1558.8.5 by Aaron Bentley
Pass note up the stack instead of using bzrlib.ui_factory
125
            pb.finished()
1594.1.1 by Robert Collins
Introduce new bzr progress bar api. ui_factory.nested_progress_bar.
126
127
    def test_progress_nested(self):
128
        # test factory based nested and popping.
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
129
        ui = _mod_ui_text.TextUIFactory(None, None, None)
1594.1.1 by Robert Collins
Introduce new bzr progress bar api. ui_factory.nested_progress_bar.
130
        pb1 = ui.nested_progress_bar()
131
        pb2 = ui.nested_progress_bar()
3948.2.2 by Martin Pool
Corrections to finishing progress bars
132
        # You do get a warning if the outermost progress bar wasn't finished
133
        # first - it's not clear if this is really useful or if it should just
134
        # become orphaned -- mbp 20090120
3882.8.12 by Martin Pool
Give a warning, not an error, if a progress bar is not finished in order
135
        warnings, _ = self.callCatchWarnings(pb1.finished)
3948.2.2 by Martin Pool
Corrections to finishing progress bars
136
        if len(warnings) != 1:
137
            self.fail("unexpected warnings: %r" % (warnings,))
1594.1.1 by Robert Collins
Introduce new bzr progress bar api. ui_factory.nested_progress_bar.
138
        pb2.finished()
139
        pb1.finished()
140
4449.3.38 by Martin Pool
Cleanup get_boolean tests
141
    def test_text_ui_get_boolean(self):
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
142
        stdin = tests.StringIOWrapper(
143
            "y\n" # True
144
            "n\n" # False
145
            "yes with garbage\nY\n" # True
146
            "not an answer\nno\n" # False
147
            "I'm sure!\nyes\n" # True
148
            "NO\n" # False
149
            "foo\n")
150
        stdout = tests.StringIOWrapper()
151
        stderr = tests.StringIOWrapper()
152
        factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
1687.1.4 by Robert Collins
Add bzrlib.ui.ui_factory.get_boolean().
153
        self.assertEqual(True, factory.get_boolean(""))
4503.2.5 by Vincent Ladeuil
ui.get_boolean can also use bool_from_string.
154
        self.assertEqual(False, factory.get_boolean(""))
155
        self.assertEqual(True, factory.get_boolean(""))
156
        self.assertEqual(False, factory.get_boolean(""))
157
        self.assertEqual(True, factory.get_boolean(""))
158
        self.assertEqual(False, factory.get_boolean(""))
1687.1.4 by Robert Collins
Add bzrlib.ui.ui_factory.get_boolean().
159
        self.assertEqual("foo\n", factory.stdin.read())
2363.4.4 by Vincent Ladeuil
More tidying-up.
160
        # stdin should be empty
2363.4.6 by Vincent Ladeuil
Fix tests around stdin emptyness.
161
        self.assertEqual('', factory.stdin.readline())
1687.1.4 by Robert Collins
Add bzrlib.ui.ui_factory.get_boolean().
162
4597.3.37 by Vincent Ladeuil
Allows ui factories to query users for an integer.
163
    def test_text_ui_get_integer(self):
164
        stdin = tests.StringIOWrapper(
165
            "1\n"
166
            "  -2  \n"
167
            "hmmm\nwhat else ?\nCome on\nok 42\n4.24\n42\n")
168
        stdout = tests.StringIOWrapper()
169
        stderr = tests.StringIOWrapper()
170
        factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
171
        self.assertEqual(1, factory.get_integer(""))
172
        self.assertEqual(-2, factory.get_integer(""))
173
        self.assertEqual(42, factory.get_integer(""))
174
4300.3.1 by Martin Pool
Fix string expansion in TextUIFactory.prompt
175
    def test_text_factory_prompt(self):
176
        # see <https://launchpad.net/bugs/365891>
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
177
        StringIO = tests.StringIOWrapper
178
        factory = _mod_ui_text.TextUIFactory(StringIO(), StringIO(), StringIO())
4300.3.1 by Martin Pool
Fix string expansion in TextUIFactory.prompt
179
        factory.prompt('foo %2e')
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
180
        self.assertEqual('', factory.stdout.getvalue())
181
        self.assertEqual('foo %2e', factory.stderr.getvalue())
4300.3.1 by Martin Pool
Fix string expansion in TextUIFactory.prompt
182
1687.1.4 by Robert Collins
Add bzrlib.ui.ui_factory.get_boolean().
183
    def test_text_factory_prompts_and_clears(self):
184
        # a get_boolean call should clear the pb before prompting
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
185
        out = test_progress._TTYStringIO()
4449.3.4 by Martin Pool
ProgressTask now talks to ProgressView; easier to test
186
        os.environ['TERM'] = 'xterm'
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
187
        factory = _mod_ui_text.TextUIFactory(
188
            stdin=tests.StringIOWrapper("yada\ny\n"),
189
            stdout=out, stderr=out)
3882.8.10 by Martin Pool
Fix up test_ui for new progress bars
190
        pb = factory.nested_progress_bar()
191
        pb.show_bar = False
192
        pb.show_spinner = False
193
        pb.show_count = False
194
        pb.update("foo", 0, 1)
2363.4.4 by Vincent Ladeuil
More tidying-up.
195
        self.assertEqual(True,
196
                         self.apply_redirected(None, factory.stdout,
197
                                               factory.stdout,
198
                                               factory.get_boolean,
199
                                               "what do you want"))
3882.8.10 by Martin Pool
Fix up test_ui for new progress bars
200
        output = out.getvalue()
201
        self.assertContainsRe(factory.stdout.getvalue(),
202
            "foo *\r\r  *\r*")
203
        self.assertContainsRe(factory.stdout.getvalue(),
204
            r"what do you want\? \[y/n\]: what do you want\? \[y/n\]: ")
205
        # stdin should have been totally consumed
2363.4.6 by Vincent Ladeuil
Fix tests around stdin emptyness.
206
        self.assertEqual('', factory.stdin.readline())
4017.1.1 by John Arbash Meinel
Get a pb.tick() to work after calling pb.update()
207
208
    def test_text_tick_after_update(self):
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
209
        ui_factory = _mod_ui_text.TextUIFactory(stdout=tests.StringIOWrapper(),
210
                                                stderr=tests.StringIOWrapper())
4017.1.1 by John Arbash Meinel
Get a pb.tick() to work after calling pb.update()
211
        pb = ui_factory.nested_progress_bar()
212
        try:
213
            pb.update('task', 0, 3)
214
            # Reset the clock, so that it actually tries to repaint itself
215
            ui_factory._progress_view._last_repaint = time.time() - 1.0
216
            pb.tick()
217
        finally:
218
            pb.finished()
4110.2.15 by Martin Pool
Fix bug in showing task progress and add a test
219
4222.2.1 by Jelmer Vernooij
Add get_username() call to the UIFactory.
220
    def test_text_ui_getusername(self):
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
221
        factory = _mod_ui_text.TextUIFactory(None, None, None)
222
        factory.stdin = tests.StringIOWrapper("someuser\n\n")
223
        factory.stdout = tests.StringIOWrapper()
224
        factory.stderr = tests.StringIOWrapper()
4222.2.6 by Jelmer Vernooij
Remove use of NotATerminal.
225
        factory.stdout.encoding = "utf8"
4222.2.1 by Jelmer Vernooij
Add get_username() call to the UIFactory.
226
        # there is no output from the base factory
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
227
        self.assertEqual("someuser",
228
                         factory.get_username('Hello %(host)s', host='some'))
229
        self.assertEquals("Hello some: ", factory.stderr.getvalue())
230
        self.assertEquals('', factory.stdout.getvalue())
4222.2.1 by Jelmer Vernooij
Add get_username() call to the UIFactory.
231
        self.assertEqual("", factory.get_username("Gebruiker"))
232
        # stdin should be empty
233
        self.assertEqual('', factory.stdin.readline())
234
4222.2.2 by Jelmer Vernooij
Review from vila: Deal with UTF8 strings in prompts, fix typo.
235
    def test_text_ui_getusername_utf8(self):
4488.1.1 by Vincent Ladeuil
(vila) Cleanup imports in some test files
236
        ui = tests.TestUIFactory(stdin=u'someuser\u1234'.encode('utf8'),
237
                                 stdout=tests.StringIOWrapper(),
238
                                 stderr=tests.StringIOWrapper())
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
239
        ui.stderr.encoding = ui.stdout.encoding = ui.stdin.encoding = "utf8"
4222.2.3 by Jelmer Vernooij
Also check for unicode usernames.
240
        pb = ui.nested_progress_bar()
241
        try:
242
            # there is no output from the base factory
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
243
            username = self.apply_redirected(ui.stdin, ui.stdout, ui.stderr,
4222.2.12 by Jelmer Vernooij
Redirect to fix utf8 test with LC_ALL=C.
244
                ui.get_username, u'Hello\u1234 %(host)s', host=u'some\u1234')
4222.2.8 by Jelmer Vernooij
Fix copy-n-paste error.
245
            self.assertEquals(u"someuser\u1234", username.decode('utf8'))
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
246
            self.assertEquals(u"Hello\u1234 some\u1234: ",
247
                              ui.stderr.getvalue().decode("utf8"))
248
            self.assertEquals('', ui.stdout.getvalue())
4222.2.3 by Jelmer Vernooij
Also check for unicode usernames.
249
        finally:
250
            pb.finished()
4222.2.2 by Jelmer Vernooij
Review from vila: Deal with UTF8 strings in prompts, fix typo.
251
4110.2.15 by Martin Pool
Fix bug in showing task progress and add a test
252
4711.1.6 by Martin Pool
Separate TextUIFactory tests
253
class UITests(tests.TestCase):
254
255
    def test_progress_construction(self):
256
        """TextUIFactory constructs the right progress view.
257
        """
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
258
        TTYStringIO = test_progress._TTYStringIO
259
        FileStringIO = tests.StringIOWrapper
4711.1.6 by Martin Pool
Separate TextUIFactory tests
260
        for (file_class, term, pb, expected_pb_class) in (
261
            # on an xterm, either use them or not as the user requests,
262
            # otherwise default on
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
263
            (TTYStringIO, 'xterm', 'none', _mod_ui_text.NullProgressView),
264
            (TTYStringIO, 'xterm', 'text', _mod_ui_text.TextProgressView),
265
            (TTYStringIO, 'xterm', None, _mod_ui_text.TextProgressView),
4711.1.6 by Martin Pool
Separate TextUIFactory tests
266
            # on a dumb terminal, again if there's explicit configuration do
267
            # it, otherwise default off
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
268
            (TTYStringIO, 'dumb', 'none', _mod_ui_text.NullProgressView),
269
            (TTYStringIO, 'dumb', 'text', _mod_ui_text.TextProgressView),
270
            (TTYStringIO, 'dumb', None, _mod_ui_text.NullProgressView),
4711.1.6 by Martin Pool
Separate TextUIFactory tests
271
            # on a non-tty terminal, it's null regardless of $TERM
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
272
            (FileStringIO, 'xterm', None, _mod_ui_text.NullProgressView),
273
            (FileStringIO, 'dumb', None, _mod_ui_text.NullProgressView),
4711.1.6 by Martin Pool
Separate TextUIFactory tests
274
            # however, it can still be forced on
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
275
            (FileStringIO, 'dumb', 'text', _mod_ui_text.TextProgressView),
4711.1.6 by Martin Pool
Separate TextUIFactory tests
276
            ):
277
            os.environ['TERM'] = term
278
            if pb is None:
279
                if 'BZR_PROGRESS_BAR' in os.environ:
280
                    del os.environ['BZR_PROGRESS_BAR']
281
            else:
282
                os.environ['BZR_PROGRESS_BAR'] = pb
283
            stdin = file_class('')
284
            stderr = file_class()
285
            stdout = file_class()
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
286
            uif = _mod_ui.make_ui_for_terminal(stdin, stdout, stderr)
287
            self.assertIsInstance(uif, _mod_ui_text.TextUIFactory,
4711.1.6 by Martin Pool
Separate TextUIFactory tests
288
                "TERM=%s BZR_PROGRESS_BAR=%s uif=%r" % (term, pb, uif,))
289
            self.assertIsInstance(uif.make_progress_view(),
290
                expected_pb_class,
291
                "TERM=%s BZR_PROGRESS_BAR=%s uif=%r" % (term, pb, uif,))
292
293
    def test_text_ui_non_terminal(self):
294
        """Even on non-ttys, make_ui_for_terminal gives a text ui."""
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
295
        stdin = test_progress._NonTTYStringIO('')
296
        stderr = test_progress._NonTTYStringIO()
297
        stdout = test_progress._NonTTYStringIO()
4711.1.6 by Martin Pool
Separate TextUIFactory tests
298
        for term_type in ['dumb', None, 'xterm']:
299
            if term_type is None:
300
                del os.environ['TERM']
301
            else:
302
                os.environ['TERM'] = term_type
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
303
            uif = _mod_ui.make_ui_for_terminal(stdin, stdout, stderr)
304
            self.assertIsInstance(uif, _mod_ui_text.TextUIFactory,
4711.1.6 by Martin Pool
Separate TextUIFactory tests
305
                'TERM=%r' % (term_type,))
306
307
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
308
class SilentUITests(tests.TestCase):
4449.3.19 by Martin Pool
SilentUIFactory now always errors when asked for input
309
4449.3.36 by Martin Pool
Update tests: SilentUIFactory no longer does get_boolean or get_password
310
    def test_silent_factory_get_password(self):
311
        # A silent factory that can't do user interaction can't get a
312
        # password.  Possibly it should raise a more specific error but it
313
        # can't succeed.
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
314
        ui = _mod_ui.SilentUIFactory()
315
        stdout = tests.StringIOWrapper()
4449.3.19 by Martin Pool
SilentUIFactory now always errors when asked for input
316
        self.assertRaises(
317
            NotImplementedError,
318
            self.apply_redirected,
319
            None, stdout, stdout, ui.get_password)
320
        # and it didn't write anything out either
321
        self.assertEqual('', stdout.getvalue())
322
323
    def test_silent_ui_getbool(self):
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
324
        factory = _mod_ui.SilentUIFactory()
325
        stdout = tests.StringIOWrapper()
4449.3.19 by Martin Pool
SilentUIFactory now always errors when asked for input
326
        self.assertRaises(
327
            NotImplementedError,
328
            self.apply_redirected,
329
            None, stdout, stdout, factory.get_boolean, "foo")
4449.3.42 by Martin Pool
Add basic test for CannedInputUIFactory
330
331
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
332
class TestUIFactoryTests(tests.TestCase):
4580.2.2 by Martin Pool
Add test for bug 408201
333
334
    def test_test_ui_factory_progress(self):
335
        # there's no output; we just want to make sure this doesn't crash -
336
        # see https://bugs.edge.launchpad.net/bzr/+bug/408201
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
337
        ui = tests.TestUIFactory()
4580.2.2 by Martin Pool
Add test for bug 408201
338
        pb = ui.nested_progress_bar()
339
        pb.update('hello')
340
        pb.tick()
341
        pb.finished()
342
343
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
344
class CannedInputUIFactoryTests(tests.TestCase):
345
4449.3.42 by Martin Pool
Add basic test for CannedInputUIFactory
346
    def test_canned_input_get_input(self):
4597.3.37 by Vincent Ladeuil
Allows ui factories to query users for an integer.
347
        uif = _mod_ui.CannedInputUIFactory([True, 'mbp', 'password', 42])
348
        self.assertEqual(True, uif.get_boolean('Extra cheese?'))
349
        self.assertEqual('mbp', uif.get_username('Enter your user name'))
350
        self.assertEqual('password',
351
                         uif.get_password('Password for %(host)s',
352
                                          host='example.com'))
353
        self.assertEqual(42, uif.get_integer('And all that jazz ?'))
4110.2.17 by Martin Pool
If one ProgressTask has no count, it passes through that of its child
354
4503.2.1 by Vincent Ladeuil
Get a bool from a string.
355
356
class TestBoolFromString(tests.TestCase):
357
358
    def assertIsTrue(self, s, accepted_values=None):
359
        res = _mod_ui.bool_from_string(s, accepted_values=accepted_values)
360
        self.assertEquals(True, res)
361
362
    def assertIsFalse(self, s, accepted_values=None):
363
        res = _mod_ui.bool_from_string(s, accepted_values=accepted_values)
364
        self.assertEquals(False, res)
365
366
    def assertIsNone(self, s, accepted_values=None):
367
        res = _mod_ui.bool_from_string(s, accepted_values=accepted_values)
368
        self.assertIs(None, res)
369
370
    def test_know_valid_values(self):
371
        self.assertIsTrue('true')
372
        self.assertIsFalse('false')
373
        self.assertIsTrue('1')
374
        self.assertIsFalse('0')
375
        self.assertIsTrue('on')
376
        self.assertIsFalse('off')
377
        self.assertIsTrue('yes')
378
        self.assertIsFalse('no')
379
        self.assertIsTrue('y')
380
        self.assertIsFalse('n')
381
        # Also try some case variations
382
        self.assertIsTrue('True')
383
        self.assertIsFalse('False')
384
        self.assertIsTrue('On')
385
        self.assertIsFalse('Off')
386
        self.assertIsTrue('ON')
387
        self.assertIsFalse('OFF')
388
        self.assertIsTrue('oN')
389
        self.assertIsFalse('oFf')
390
391
    def test_invalid_values(self):
392
        self.assertIsNone(None)
393
        self.assertIsNone('doubt')
394
        self.assertIsNone('frue')
395
        self.assertIsNone('talse')
396
        self.assertIsNone('42')
397
398
    def test_provided_values(self):
399
        av = dict(y=True, n=False, yes=True, no=False)
400
        self.assertIsTrue('y', av)
401
        self.assertIsTrue('Y', av)
402
        self.assertIsTrue('Yes', av)
403
        self.assertIsFalse('n', av)
404
        self.assertIsFalse('N', av)
405
        self.assertIsFalse('No', av)
406
        self.assertIsNone('1', av)
407
        self.assertIsNone('0', av)
408
        self.assertIsNone('on', av)
409
        self.assertIsNone('off', av)