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