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