/brz/remove-bazaar

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/brz/remove-bazaar
5557.1.7 by John Arbash Meinel
Merge in the bzr.dev 5582
1
# Copyright (C) 2005-2011 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
4017.1.1 by John Arbash Meinel
Get a pb.tick() to work after calling pb.update()
20
import time
1185.49.22 by John Arbash Meinel
Added get_password to the UIFactory, using it inside of sftp.py
21
4797.40.2 by Martin Pool
Add missing import
22
from StringIO import StringIO
23
5416.1.11 by Martin Pool
Add ConfirmationUserInterfacePolicy that lets specific confirmations be configured off.
24
from testtools.matchers import *
25
4488.1.1 by Vincent Ladeuil
(vila) Cleanup imports in some test files
26
from bzrlib import (
5230.1.3 by Martin Pool
Use configured output encoding for make_output_stream
27
    config,
4634.144.5 by Martin Pool
Cleaner presentation and tests for warn_cross_format_fetch
28
    remote,
4488.1.1 by Vincent Ladeuil
(vila) Cleanup imports in some test files
29
    tests,
30
    ui as _mod_ui,
4449.3.4 by Martin Pool
ProgressTask now talks to ProgressView; easier to test
31
    )
5230.1.3 by Martin Pool
Use configured output encoding for make_output_stream
32
from bzrlib.tests import (
33
    fixtures,
34
    test_progress,
35
    )
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
36
from bzrlib.ui import text as _mod_ui_text
5422.1.5 by Martin Pool
Move ProgressRecordingUIFactory to bzrlib.tests.testui
37
from bzrlib.tests.testui import (
5422.1.4 by Martin Pool
Rename CapturingUIFactory to ProgressRecordingUIFactory
38
    ProgressRecordingUIFactory,
5422.1.1 by Martin Pool
Move CapturingUIFactory out of per_workingtree tests into somewhere reusable
39
    )
1185.49.22 by John Arbash Meinel
Added get_password to the UIFactory, using it inside of sftp.py
40
1681.1.2 by Robert Collins
* bzrlib.ui.text.TextUIFactory now accepts a bar_type parameter which
41
5230.1.3 by Martin Pool
Use configured output encoding for make_output_stream
42
class TestUIConfiguration(tests.TestCaseWithTransport):
43
44
    def test_output_encoding_configuration(self):
5230.1.5 by Martin Pool
Merge updated test fixtures
45
        enc = fixtures.generate_unicode_encodings().next()
5230.1.3 by Martin Pool
Use configured output encoding for make_output_stream
46
        config.GlobalConfig().set_user_option('output_encoding',
47
            enc)
48
        ui = tests.TestUIFactory(stdin=None,
5230.1.5 by Martin Pool
Merge updated test fixtures
49
            stdout=tests.StringIOWrapper(),
50
            stderr=tests.StringIOWrapper())
5416.1.11 by Martin Pool
Add ConfirmationUserInterfacePolicy that lets specific confirmations be configured off.
51
        output = ui.make_output_stream()
52
        self.assertEquals(output.encoding, enc)
5230.1.3 by Martin Pool
Use configured output encoding for make_output_stream
53
54
4711.1.6 by Martin Pool
Separate TextUIFactory tests
55
class TestTextUIFactory(tests.TestCase):
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
56
5416.1.1 by Martin Pool
Use a structured ui_factory.confirm_action rather than just get_boolean
57
    def make_test_ui_factory(self, stdin_contents):
58
        ui = tests.TestUIFactory(stdin=stdin_contents,
59
                                 stdout=tests.StringIOWrapper(),
60
                                 stderr=tests.StringIOWrapper())
61
        return ui
62
63
    def test_text_factory_confirm(self):
64
        # turns into reading a regular boolean
65
        ui = self.make_test_ui_factory('n\n')
5863.6.1 by Jelmer Vernooij
Require a unicode prompt to be passed into all methods that prompt.
66
        self.assertEquals(ui.confirm_action(u'Should %(thing)s pass?',
5416.1.1 by Martin Pool
Use a structured ui_factory.confirm_action rather than just get_boolean
67
            'bzrlib.tests.test_ui.confirmation',
68
            {'thing': 'this'},),
69
            False)
70
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
71
    def test_text_factory_ascii_password(self):
5416.1.1 by Martin Pool
Use a structured ui_factory.confirm_action rather than just get_boolean
72
        ui = self.make_test_ui_factory('secret\n')
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
73
        pb = ui.nested_progress_bar()
74
        try:
75
            self.assertEqual('secret',
76
                             self.apply_redirected(ui.stdin, ui.stdout,
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
77
                                                   ui.stderr,
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
78
                                                   ui.get_password))
79
            # ': ' is appended to prompt
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
80
            self.assertEqual(': ', ui.stderr.getvalue())
81
            self.assertEqual('', ui.stdout.readline())
2363.4.3 by Vincent Ladeuil
Tidy-up tests.
82
            # stdin should be empty
2363.4.6 by Vincent Ladeuil
Fix tests around stdin emptyness.
83
            self.assertEqual('', ui.stdin.readline())
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
84
        finally:
85
            pb.finished()
86
87
    def test_text_factory_utf8_password(self):
88
        """Test an utf8 password.
89
90
        We can't predict what encoding users will have for stdin, so we force
91
        it to utf8 to test that we transport the password correctly.
92
        """
5416.1.1 by Martin Pool
Use a structured ui_factory.confirm_action rather than just get_boolean
93
        ui = self.make_test_ui_factory(u'baz\u1234'.encode('utf8'))
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
94
        ui.stderr.encoding = ui.stdout.encoding = ui.stdin.encoding = 'utf8'
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
95
        pb = ui.nested_progress_bar()
96
        try:
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
97
            password = self.apply_redirected(ui.stdin, ui.stdout, ui.stderr,
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
98
                                             ui.get_password,
99
                                             u'Hello \u1234 %(user)s',
100
                                             user=u'some\u1234')
101
            # We use StringIO objects, we need to decode them
102
            self.assertEqual(u'baz\u1234', password.decode('utf8'))
103
            self.assertEqual(u'Hello \u1234 some\u1234: ',
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
104
                             ui.stderr.getvalue().decode('utf8'))
105
            # stdin and stdout should be empty
2363.4.6 by Vincent Ladeuil
Fix tests around stdin emptyness.
106
            self.assertEqual('', ui.stdin.readline())
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
107
            self.assertEqual('', ui.stdout.readline())
2294.4.1 by Vincent Ladeuil
Add a UIFactory.get_login method, fix tests.
108
        finally:
109
            pb.finished()
1534.5.6 by Robert Collins
split out converter logic into per-format objects.
110
4449.3.38 by Martin Pool
Cleanup get_boolean tests
111
    def test_text_ui_get_boolean(self):
4773.1.2 by Vincent Ladeuil
Cleanup imports in test_ui
112
        stdin = tests.StringIOWrapper("y\n" # True
113
                                      "n\n" # False
6182.2.4 by Benoît Pierre
Fix ui tests.
114
                                      " \n y \n" # True
115
                                      " no \n" # False
4773.1.2 by Vincent Ladeuil
Cleanup imports in test_ui
116
                                      "yes with garbage\nY\n" # True
117
                                      "not an answer\nno\n" # False
118
                                      "I'm sure!\nyes\n" # True
119
                                      "NO\n" # False
120
                                      "foo\n")
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
121
        stdout = tests.StringIOWrapper()
122
        stderr = tests.StringIOWrapper()
123
        factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
5863.6.1 by Jelmer Vernooij
Require a unicode prompt to be passed into all methods that prompt.
124
        self.assertEqual(True, factory.get_boolean(u""))
125
        self.assertEqual(False, factory.get_boolean(u""))
126
        self.assertEqual(True, factory.get_boolean(u""))
127
        self.assertEqual(False, factory.get_boolean(u""))
128
        self.assertEqual(True, factory.get_boolean(u""))
129
        self.assertEqual(False, factory.get_boolean(u""))
6182.2.4 by Benoît Pierre
Fix ui tests.
130
        self.assertEqual(True, factory.get_boolean(u""))
131
        self.assertEqual(False, factory.get_boolean(u""))
1687.1.4 by Robert Collins
Add bzrlib.ui.ui_factory.get_boolean().
132
        self.assertEqual("foo\n", factory.stdin.read())
2363.4.4 by Vincent Ladeuil
More tidying-up.
133
        # stdin should be empty
2363.4.6 by Vincent Ladeuil
Fix tests around stdin emptyness.
134
        self.assertEqual('', factory.stdin.readline())
6182.2.4 by Benoît Pierre
Fix ui tests.
135
        # return false on EOF
136
        self.assertEqual(False, factory.get_boolean(u""))
1687.1.4 by Robert Collins
Add bzrlib.ui.ui_factory.get_boolean().
137
4597.3.37 by Vincent Ladeuil
Allows ui factories to query users for an integer.
138
    def test_text_ui_get_integer(self):
139
        stdin = tests.StringIOWrapper(
140
            "1\n"
141
            "  -2  \n"
142
            "hmmm\nwhat else ?\nCome on\nok 42\n4.24\n42\n")
143
        stdout = tests.StringIOWrapper()
144
        stderr = tests.StringIOWrapper()
145
        factory = _mod_ui_text.TextUIFactory(stdin, stdout, stderr)
5863.6.1 by Jelmer Vernooij
Require a unicode prompt to be passed into all methods that prompt.
146
        self.assertEqual(1, factory.get_integer(u""))
147
        self.assertEqual(-2, factory.get_integer(u""))
148
        self.assertEqual(42, factory.get_integer(u""))
4597.3.37 by Vincent Ladeuil
Allows ui factories to query users for an integer.
149
4300.3.1 by Martin Pool
Fix string expansion in TextUIFactory.prompt
150
    def test_text_factory_prompt(self):
151
        # see <https://launchpad.net/bugs/365891>
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
152
        StringIO = tests.StringIOWrapper
153
        factory = _mod_ui_text.TextUIFactory(StringIO(), StringIO(), StringIO())
5863.6.1 by Jelmer Vernooij
Require a unicode prompt to be passed into all methods that prompt.
154
        factory.prompt(u'foo %2e')
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
155
        self.assertEqual('', factory.stdout.getvalue())
156
        self.assertEqual('foo %2e', factory.stderr.getvalue())
4300.3.1 by Martin Pool
Fix string expansion in TextUIFactory.prompt
157
1687.1.4 by Robert Collins
Add bzrlib.ui.ui_factory.get_boolean().
158
    def test_text_factory_prompts_and_clears(self):
159
        # a get_boolean call should clear the pb before prompting
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
160
        out = test_progress._TTYStringIO()
5570.3.9 by Vincent Ladeuil
More use cases for overrideEnv, _cleanEnvironment *may* contain too much variables now.
161
        self.overrideEnv('TERM', 'xterm')
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
162
        factory = _mod_ui_text.TextUIFactory(
163
            stdin=tests.StringIOWrapper("yada\ny\n"),
164
            stdout=out, stderr=out)
5339.2.6 by Martin Pool
One more UI test needs updates for spinner being at the front
165
        factory._avail_width = lambda: 79
3882.8.10 by Martin Pool
Fix up test_ui for new progress bars
166
        pb = factory.nested_progress_bar()
167
        pb.show_bar = False
168
        pb.show_spinner = False
169
        pb.show_count = False
170
        pb.update("foo", 0, 1)
2363.4.4 by Vincent Ladeuil
More tidying-up.
171
        self.assertEqual(True,
172
                         self.apply_redirected(None, factory.stdout,
173
                                               factory.stdout,
174
                                               factory.get_boolean,
5863.6.1 by Jelmer Vernooij
Require a unicode prompt to be passed into all methods that prompt.
175
                                               u"what do you want"))
3882.8.10 by Martin Pool
Fix up test_ui for new progress bars
176
        output = out.getvalue()
5339.2.6 by Martin Pool
One more UI test needs updates for spinner being at the front
177
        self.assertContainsRe(output,
178
            "| foo *\r\r  *\r*")
6182.2.4 by Benoît Pierre
Fix ui tests.
179
        self.assertContainsString(output,
180
            r"what do you want? ([y]es, [n]o): what do you want? ([y]es, [n]o): ")
3882.8.10 by Martin Pool
Fix up test_ui for new progress bars
181
        # stdin should have been totally consumed
2363.4.6 by Vincent Ladeuil
Fix tests around stdin emptyness.
182
        self.assertEqual('', factory.stdin.readline())
4017.1.1 by John Arbash Meinel
Get a pb.tick() to work after calling pb.update()
183
184
    def test_text_tick_after_update(self):
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
185
        ui_factory = _mod_ui_text.TextUIFactory(stdout=tests.StringIOWrapper(),
186
                                                stderr=tests.StringIOWrapper())
4017.1.1 by John Arbash Meinel
Get a pb.tick() to work after calling pb.update()
187
        pb = ui_factory.nested_progress_bar()
188
        try:
189
            pb.update('task', 0, 3)
190
            # Reset the clock, so that it actually tries to repaint itself
191
            ui_factory._progress_view._last_repaint = time.time() - 1.0
192
            pb.tick()
193
        finally:
194
            pb.finished()
4110.2.15 by Martin Pool
Fix bug in showing task progress and add a test
195
4222.2.1 by Jelmer Vernooij
Add get_username() call to the UIFactory.
196
    def test_text_ui_getusername(self):
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
197
        factory = _mod_ui_text.TextUIFactory(None, None, None)
198
        factory.stdin = tests.StringIOWrapper("someuser\n\n")
199
        factory.stdout = tests.StringIOWrapper()
200
        factory.stderr = tests.StringIOWrapper()
4222.2.6 by Jelmer Vernooij
Remove use of NotATerminal.
201
        factory.stdout.encoding = "utf8"
4222.2.1 by Jelmer Vernooij
Add get_username() call to the UIFactory.
202
        # there is no output from the base factory
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
203
        self.assertEqual("someuser",
5863.6.1 by Jelmer Vernooij
Require a unicode prompt to be passed into all methods that prompt.
204
                         factory.get_username(u'Hello %(host)s', host='some'))
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
205
        self.assertEquals("Hello some: ", factory.stderr.getvalue())
206
        self.assertEquals('', factory.stdout.getvalue())
5863.6.1 by Jelmer Vernooij
Require a unicode prompt to be passed into all methods that prompt.
207
        self.assertEqual("", factory.get_username(u"Gebruiker"))
4222.2.1 by Jelmer Vernooij
Add get_username() call to the UIFactory.
208
        # stdin should be empty
209
        self.assertEqual('', factory.stdin.readline())
210
4222.2.2 by Jelmer Vernooij
Review from vila: Deal with UTF8 strings in prompts, fix typo.
211
    def test_text_ui_getusername_utf8(self):
4488.1.1 by Vincent Ladeuil
(vila) Cleanup imports in some test files
212
        ui = tests.TestUIFactory(stdin=u'someuser\u1234'.encode('utf8'),
213
                                 stdout=tests.StringIOWrapper(),
214
                                 stderr=tests.StringIOWrapper())
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
215
        ui.stderr.encoding = ui.stdout.encoding = ui.stdin.encoding = "utf8"
4222.2.3 by Jelmer Vernooij
Also check for unicode usernames.
216
        pb = ui.nested_progress_bar()
217
        try:
218
            # there is no output from the base factory
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
219
            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.
220
                ui.get_username, u'Hello\u1234 %(host)s', host=u'some\u1234')
4222.2.8 by Jelmer Vernooij
Fix copy-n-paste error.
221
            self.assertEquals(u"someuser\u1234", username.decode('utf8'))
4368.3.1 by Vincent Ladeuil
Use stderr for UI prompt to address bug #376582.
222
            self.assertEquals(u"Hello\u1234 some\u1234: ",
223
                              ui.stderr.getvalue().decode("utf8"))
224
            self.assertEquals('', ui.stdout.getvalue())
4222.2.3 by Jelmer Vernooij
Also check for unicode usernames.
225
        finally:
226
            pb.finished()
4222.2.2 by Jelmer Vernooij
Review from vila: Deal with UTF8 strings in prompts, fix typo.
227
4961.1.3 by Martin Pool
trace quietness now controls whether the progress bar appears
228
    def test_quietness(self):
5570.3.9 by Vincent Ladeuil
More use cases for overrideEnv, _cleanEnvironment *may* contain too much variables now.
229
        self.overrideEnv('BZR_PROGRESS_BAR', 'text')
4961.1.3 by Martin Pool
trace quietness now controls whether the progress bar appears
230
        ui_factory = _mod_ui_text.TextUIFactory(None,
231
            test_progress._TTYStringIO(),
232
            test_progress._TTYStringIO())
233
        self.assertIsInstance(ui_factory._progress_view,
234
            _mod_ui_text.TextProgressView)
235
        ui_factory.be_quiet(True)
236
        self.assertIsInstance(ui_factory._progress_view,
237
            _mod_ui_text.NullProgressView)
238
4634.144.10 by Martin Pool
Update test_ui for warning suppression
239
    def test_text_ui_show_user_warning(self):
4634.144.5 by Martin Pool
Cleaner presentation and tests for warn_cross_format_fetch
240
        from bzrlib.repofmt.groupcompress_repo import RepositoryFormat2a
5757.1.7 by Jelmer Vernooij
Fix more imports.
241
        from bzrlib.repofmt.knitpack_repo import RepositoryFormatKnitPack5
4634.144.5 by Martin Pool
Cleaner presentation and tests for warn_cross_format_fetch
242
        err = StringIO()
243
        out = StringIO()
244
        ui = tests.TextUIFactory(stdin=None, stdout=out, stderr=err)
245
        remote_fmt = remote.RemoteRepositoryFormat()
246
        remote_fmt._network_name = RepositoryFormatKnitPack5().network_name()
4634.144.10 by Martin Pool
Update test_ui for warning suppression
247
        ui.show_user_warning('cross_format_fetch', from_format=RepositoryFormat2a(),
248
            to_format=remote_fmt)
4634.144.5 by Martin Pool
Cleaner presentation and tests for warn_cross_format_fetch
249
        self.assertEquals('', out.getvalue())
250
        self.assertEquals("Doing on-the-fly conversion from RepositoryFormat2a() to "
251
            "RemoteRepositoryFormat(_network_name='Bazaar RepositoryFormatKnitPack5 "
252
            "(bzr 1.6)\\n').\nThis may take some time. Upgrade the repositories to "
253
            "the same format for better performance.\n",
254
            err.getvalue())
4634.144.10 by Martin Pool
Update test_ui for warning suppression
255
        # and now with it suppressed please
256
        err = StringIO()
257
        out = StringIO()
258
        ui = tests.TextUIFactory(stdin=None, stdout=out, stderr=err)
4634.144.11 by Martin Pool
Rename squelched to suppressed
259
        ui.suppressed_warnings.add('cross_format_fetch')
4634.144.10 by Martin Pool
Update test_ui for warning suppression
260
        ui.show_user_warning('cross_format_fetch', from_format=RepositoryFormat2a(),
261
            to_format=remote_fmt)
262
        self.assertEquals('', out.getvalue())
263
        self.assertEquals('', err.getvalue())
4634.144.5 by Martin Pool
Cleaner presentation and tests for warn_cross_format_fetch
264
4110.2.15 by Martin Pool
Fix bug in showing task progress and add a test
265
4884.1.1 by Vincent Ladeuil
Cleanup some test imports
266
class TestTextUIOutputStream(tests.TestCase):
4792.8.1 by Martin Pool
Add TextUIOutputStream coordinated with progress view
267
    """Tests for output stream that synchronizes with progress bar."""
268
269
    def test_output_clears_terminal(self):
4884.1.1 by Vincent Ladeuil
Cleanup some test imports
270
        stdout = tests.StringIOWrapper()
271
        stderr = tests.StringIOWrapper()
4792.8.1 by Martin Pool
Add TextUIOutputStream coordinated with progress view
272
        clear_calls = []
273
4884.1.1 by Vincent Ladeuil
Cleanup some test imports
274
        uif =  _mod_ui_text.TextUIFactory(None, stdout, stderr)
4792.8.1 by Martin Pool
Add TextUIOutputStream coordinated with progress view
275
        uif.clear_term = lambda: clear_calls.append('clear')
276
4884.1.1 by Vincent Ladeuil
Cleanup some test imports
277
        stream = _mod_ui_text.TextUIOutputStream(uif, uif.stdout)
4792.8.1 by Martin Pool
Add TextUIOutputStream coordinated with progress view
278
        stream.write("Hello world!\n")
279
        stream.write("there's more...\n")
4792.8.3 by Martin Pool
Add TextUIOutputStream.writelines
280
        stream.writelines(["1\n", "2\n", "3\n"])
4884.1.1 by Vincent Ladeuil
Cleanup some test imports
281
4792.8.1 by Martin Pool
Add TextUIOutputStream coordinated with progress view
282
        self.assertEqual(stdout.getvalue(),
283
            "Hello world!\n"
4792.8.3 by Martin Pool
Add TextUIOutputStream.writelines
284
            "there's more...\n"
285
            "1\n2\n3\n")
286
        self.assertEqual(['clear', 'clear', 'clear'],
4792.8.1 by Martin Pool
Add TextUIOutputStream coordinated with progress view
287
            clear_calls)
288
4792.8.8 by Martin Pool
Add TextUIOutputStream.flush
289
        stream.flush()
4792.8.1 by Martin Pool
Add TextUIOutputStream coordinated with progress view
290
291
4711.1.6 by Martin Pool
Separate TextUIFactory tests
292
class UITests(tests.TestCase):
293
294
    def test_progress_construction(self):
295
        """TextUIFactory constructs the right progress view.
296
        """
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
297
        TTYStringIO = test_progress._TTYStringIO
298
        FileStringIO = tests.StringIOWrapper
4711.1.6 by Martin Pool
Separate TextUIFactory tests
299
        for (file_class, term, pb, expected_pb_class) in (
300
            # on an xterm, either use them or not as the user requests,
301
            # otherwise default on
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
302
            (TTYStringIO, 'xterm', 'none', _mod_ui_text.NullProgressView),
303
            (TTYStringIO, 'xterm', 'text', _mod_ui_text.TextProgressView),
304
            (TTYStringIO, 'xterm', None, _mod_ui_text.TextProgressView),
4711.1.6 by Martin Pool
Separate TextUIFactory tests
305
            # on a dumb terminal, again if there's explicit configuration do
306
            # it, otherwise default off
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
307
            (TTYStringIO, 'dumb', 'none', _mod_ui_text.NullProgressView),
308
            (TTYStringIO, 'dumb', 'text', _mod_ui_text.TextProgressView),
309
            (TTYStringIO, 'dumb', None, _mod_ui_text.NullProgressView),
4711.1.6 by Martin Pool
Separate TextUIFactory tests
310
            # 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.
311
            (FileStringIO, 'xterm', None, _mod_ui_text.NullProgressView),
312
            (FileStringIO, 'dumb', None, _mod_ui_text.NullProgressView),
4711.1.6 by Martin Pool
Separate TextUIFactory tests
313
            # however, it can still be forced on
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
314
            (FileStringIO, 'dumb', 'text', _mod_ui_text.TextProgressView),
4711.1.6 by Martin Pool
Separate TextUIFactory tests
315
            ):
5570.3.9 by Vincent Ladeuil
More use cases for overrideEnv, _cleanEnvironment *may* contain too much variables now.
316
            self.overrideEnv('TERM', term)
317
            self.overrideEnv('BZR_PROGRESS_BAR', pb)
4711.1.6 by Martin Pool
Separate TextUIFactory tests
318
            stdin = file_class('')
319
            stderr = file_class()
320
            stdout = file_class()
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
321
            uif = _mod_ui.make_ui_for_terminal(stdin, stdout, stderr)
322
            self.assertIsInstance(uif, _mod_ui_text.TextUIFactory,
4711.1.6 by Martin Pool
Separate TextUIFactory tests
323
                "TERM=%s BZR_PROGRESS_BAR=%s uif=%r" % (term, pb, uif,))
324
            self.assertIsInstance(uif.make_progress_view(),
325
                expected_pb_class,
326
                "TERM=%s BZR_PROGRESS_BAR=%s uif=%r" % (term, pb, uif,))
327
328
    def test_text_ui_non_terminal(self):
329
        """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.
330
        stdin = test_progress._NonTTYStringIO('')
331
        stderr = test_progress._NonTTYStringIO()
332
        stdout = test_progress._NonTTYStringIO()
4711.1.6 by Martin Pool
Separate TextUIFactory tests
333
        for term_type in ['dumb', None, 'xterm']:
5570.3.9 by Vincent Ladeuil
More use cases for overrideEnv, _cleanEnvironment *may* contain too much variables now.
334
            self.overrideEnv('TERM', term_type)
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
335
            uif = _mod_ui.make_ui_for_terminal(stdin, stdout, stderr)
336
            self.assertIsInstance(uif, _mod_ui_text.TextUIFactory,
4711.1.6 by Martin Pool
Separate TextUIFactory tests
337
                'TERM=%r' % (term_type,))
338
339
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
340
class SilentUITests(tests.TestCase):
4449.3.19 by Martin Pool
SilentUIFactory now always errors when asked for input
341
4449.3.36 by Martin Pool
Update tests: SilentUIFactory no longer does get_boolean or get_password
342
    def test_silent_factory_get_password(self):
343
        # A silent factory that can't do user interaction can't get a
344
        # password.  Possibly it should raise a more specific error but it
345
        # can't succeed.
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
346
        ui = _mod_ui.SilentUIFactory()
347
        stdout = tests.StringIOWrapper()
4449.3.19 by Martin Pool
SilentUIFactory now always errors when asked for input
348
        self.assertRaises(
349
            NotImplementedError,
350
            self.apply_redirected,
351
            None, stdout, stdout, ui.get_password)
352
        # and it didn't write anything out either
353
        self.assertEqual('', stdout.getvalue())
354
355
    def test_silent_ui_getbool(self):
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
356
        factory = _mod_ui.SilentUIFactory()
357
        stdout = tests.StringIOWrapper()
4449.3.19 by Martin Pool
SilentUIFactory now always errors when asked for input
358
        self.assertRaises(
359
            NotImplementedError,
360
            self.apply_redirected,
5863.6.1 by Jelmer Vernooij
Require a unicode prompt to be passed into all methods that prompt.
361
            None, stdout, stdout, factory.get_boolean, u"foo")
4449.3.42 by Martin Pool
Add basic test for CannedInputUIFactory
362
363
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
364
class TestUIFactoryTests(tests.TestCase):
4580.2.2 by Martin Pool
Add test for bug 408201
365
366
    def test_test_ui_factory_progress(self):
367
        # there's no output; we just want to make sure this doesn't crash -
5243.1.2 by Martin
Point launchpad links in comments at production server rather than edge
368
        # see https://bugs.launchpad.net/bzr/+bug/408201
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
369
        ui = tests.TestUIFactory()
4580.2.2 by Martin Pool
Add test for bug 408201
370
        pb = ui.nested_progress_bar()
371
        pb.update('hello')
372
        pb.tick()
373
        pb.finished()
374
375
4597.3.36 by Vincent Ladeuil
Fix imports and various cleanups in test_ui.
376
class CannedInputUIFactoryTests(tests.TestCase):
377
4449.3.42 by Martin Pool
Add basic test for CannedInputUIFactory
378
    def test_canned_input_get_input(self):
4597.3.37 by Vincent Ladeuil
Allows ui factories to query users for an integer.
379
        uif = _mod_ui.CannedInputUIFactory([True, 'mbp', 'password', 42])
5863.6.1 by Jelmer Vernooij
Require a unicode prompt to be passed into all methods that prompt.
380
        self.assertEqual(True, uif.get_boolean(u'Extra cheese?'))
381
        self.assertEqual('mbp', uif.get_username(u'Enter your user name'))
4597.3.37 by Vincent Ladeuil
Allows ui factories to query users for an integer.
382
        self.assertEqual('password',
5863.6.1 by Jelmer Vernooij
Require a unicode prompt to be passed into all methods that prompt.
383
                         uif.get_password(u'Password for %(host)s',
4597.3.37 by Vincent Ladeuil
Allows ui factories to query users for an integer.
384
                                          host='example.com'))
5863.6.1 by Jelmer Vernooij
Require a unicode prompt to be passed into all methods that prompt.
385
        self.assertEqual(42, uif.get_integer(u'And all that jazz ?'))
4110.2.17 by Martin Pool
If one ProgressTask has no count, it passes through that of its child
386
4503.2.1 by Vincent Ladeuil
Get a bool from a string.
387
388
class TestBoolFromString(tests.TestCase):
389
390
    def assertIsTrue(self, s, accepted_values=None):
391
        res = _mod_ui.bool_from_string(s, accepted_values=accepted_values)
392
        self.assertEquals(True, res)
393
394
    def assertIsFalse(self, s, accepted_values=None):
395
        res = _mod_ui.bool_from_string(s, accepted_values=accepted_values)
396
        self.assertEquals(False, res)
397
398
    def assertIsNone(self, s, accepted_values=None):
399
        res = _mod_ui.bool_from_string(s, accepted_values=accepted_values)
400
        self.assertIs(None, res)
401
402
    def test_know_valid_values(self):
403
        self.assertIsTrue('true')
404
        self.assertIsFalse('false')
405
        self.assertIsTrue('1')
406
        self.assertIsFalse('0')
407
        self.assertIsTrue('on')
408
        self.assertIsFalse('off')
409
        self.assertIsTrue('yes')
410
        self.assertIsFalse('no')
411
        self.assertIsTrue('y')
412
        self.assertIsFalse('n')
413
        # Also try some case variations
414
        self.assertIsTrue('True')
415
        self.assertIsFalse('False')
416
        self.assertIsTrue('On')
417
        self.assertIsFalse('Off')
418
        self.assertIsTrue('ON')
419
        self.assertIsFalse('OFF')
420
        self.assertIsTrue('oN')
421
        self.assertIsFalse('oFf')
422
423
    def test_invalid_values(self):
424
        self.assertIsNone(None)
425
        self.assertIsNone('doubt')
426
        self.assertIsNone('frue')
427
        self.assertIsNone('talse')
428
        self.assertIsNone('42')
429
430
    def test_provided_values(self):
431
        av = dict(y=True, n=False, yes=True, no=False)
432
        self.assertIsTrue('y', av)
433
        self.assertIsTrue('Y', av)
434
        self.assertIsTrue('Yes', av)
435
        self.assertIsFalse('n', av)
436
        self.assertIsFalse('N', av)
437
        self.assertIsFalse('No', av)
438
        self.assertIsNone('1', av)
439
        self.assertIsNone('0', av)
440
        self.assertIsNone('on', av)
441
        self.assertIsNone('off', av)
5422.1.1 by Martin Pool
Move CapturingUIFactory out of per_workingtree tests into somewhere reusable
442
443
5416.1.11 by Martin Pool
Add ConfirmationUserInterfacePolicy that lets specific confirmations be configured off.
444
class TestConfirmationUserInterfacePolicy(tests.TestCase):
445
446
    def test_confirm_action_default(self):
447
        base_ui = _mod_ui.NoninteractiveUIFactory()
448
        for answer in [True, False]:
449
            self.assertEquals(
450
                _mod_ui.ConfirmationUserInterfacePolicy(base_ui, answer, {})
451
                .confirm_action("Do something?",
452
                    "bzrlib.tests.do_something", {}),
453
                answer)
454
455
    def test_confirm_action_specific(self):
456
        base_ui = _mod_ui.NoninteractiveUIFactory()
457
        for default_answer in [True, False]:
458
            for specific_answer in [True, False]:
459
                for conf_id in ['given_id', 'other_id']:
460
                    wrapper = _mod_ui.ConfirmationUserInterfacePolicy(
461
                        base_ui, default_answer, dict(given_id=specific_answer))
462
                    result = wrapper.confirm_action("Do something?", conf_id, {})
463
                    if conf_id == 'given_id':
464
                        self.assertEquals(result, specific_answer)
465
                    else:
466
                        self.assertEquals(result, default_answer)
467
468
    def test_repr(self):
469
        base_ui = _mod_ui.NoninteractiveUIFactory()
470
        wrapper = _mod_ui.ConfirmationUserInterfacePolicy(
471
            base_ui, True, dict(a=2))
472
        self.assertThat(repr(wrapper),
473
            Equals("ConfirmationUserInterfacePolicy("
474
                "NoninteractiveUIFactory(), True, {'a': 2})"))
5416.2.4 by Martin Pool
resolve against trunk
475
476
5422.1.4 by Martin Pool
Rename CapturingUIFactory to ProgressRecordingUIFactory
477
class TestProgressRecordingUI(tests.TestCase):
5422.1.1 by Martin Pool
Move CapturingUIFactory out of per_workingtree tests into somewhere reusable
478
    """Test test-oriented UIFactory that records progress updates"""
479
480
    def test_nested_ignore_depth_beyond_one(self):
481
        # we only want to capture the first level out progress, not
482
        # want sub-components might do. So we have nested bars ignored.
5422.1.4 by Martin Pool
Rename CapturingUIFactory to ProgressRecordingUIFactory
483
        factory = ProgressRecordingUIFactory()
5422.1.1 by Martin Pool
Move CapturingUIFactory out of per_workingtree tests into somewhere reusable
484
        pb1 = factory.nested_progress_bar()
485
        pb1.update('foo', 0, 1)
486
        pb2 = factory.nested_progress_bar()
487
        pb2.update('foo', 0, 1)
488
        pb2.finished()
489
        pb1.finished()
490
        self.assertEqual([("update", 0, 1, 'foo')], factory._calls)