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