/brz/remove-bazaar

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