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