/b-gtk/fix-viz

To get this branch, use:
bzr branch http://gegoxaren.bato24.eu/bzr/b-gtk/fix-viz

« back to all changes in this revision

Viewing changes to tests/test_commit.py

  • Committer: John Arbash Meinel
  • Date: 2007-10-02 23:08:12 UTC
  • mto: (322.1.1 trunk) (330.3.3 trunk)
  • mto: This revision was merged to the branch mainline in revision 368.
  • Revision ID: john@arbash-meinel.com-20071002230812-h8i6pq8fwvodute4
Start testing with Unicode data.
It seems there is some brokenness with serializing Unicode messages.
But otherwise everything seems to be working.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007, 2008 John Arbash Meinel <john@arbash-meinel.com>
 
1
# Copyright (C) 2007 John Arbash Meinel <john@arbash-meinel.com>
2
2
#
3
3
# This program is free software; you can redistribute it and/or modify
4
4
# it under the terms of the GNU General Public License as published by
17
17
"""Test the Commit functionality."""
18
18
 
19
19
import os
20
 
import subprocess
21
 
from tempfile import NamedTemporaryFile
22
20
 
23
 
from gi.repository import Gtk
 
21
import gtk
24
22
 
25
23
from bzrlib import (
26
 
    branch,
27
24
    tests,
28
 
    uncommit,
 
25
    revision,
29
26
    )
30
 
try:
31
 
    from bzrlib.tests.features import UnicodeFilenameFeature
32
 
except ImportError: # bzr < 2.5
33
 
    from bzrlib.tests import UnicodeFilenameFeature
34
 
from bzrlib import bencode
 
27
from bzrlib.util import bencode
35
28
 
36
 
from bzrlib.plugins.gtk import (
37
 
    commit,
38
 
    commitmsgs,
39
 
    )
40
 
from bzrlib.plugins.gtk.commitmsgs import SavedCommitMessagesManager
41
 
from bzrlib.plugins.gtk.tests import MockMethod
 
29
from bzrlib.plugins.gtk import commit
42
30
 
43
31
 
44
32
# TODO: All we need is basic ancestry code to test this, we shouldn't need a
50
38
        tree = self.make_branch_and_tree('.')
51
39
        tree.commit('one')
52
40
 
53
 
        self.addCleanup(tree.lock_read().unlock)
54
 
        self.assertEquals([], list(commit.pending_revisions(tree)))
 
41
        self.assertIs(None, commit.pending_revisions(tree))
55
42
 
56
43
    def test_pending_revisions_simple(self):
57
44
        tree = self.make_branch_and_tree('tree')
61
48
        tree.merge_from_branch(tree2.branch)
62
49
        self.assertEqual([rev_id1, rev_id2], tree.get_parent_ids())
63
50
 
64
 
        self.addCleanup(tree.lock_read().unlock)
65
 
        pending_revisions = list(commit.pending_revisions(tree))
 
51
        pending_revisions = commit.pending_revisions(tree)
66
52
        # One primary merge
67
53
        self.assertEqual(1, len(pending_revisions))
68
54
        # Revision == rev_id2
80
66
        tree.merge_from_branch(tree2.branch)
81
67
        self.assertEqual([rev_id1, rev_id4], tree.get_parent_ids())
82
68
 
83
 
        self.addCleanup(tree.lock_read().unlock)
84
 
        pending_revisions = list(commit.pending_revisions(tree))
 
69
        pending_revisions = commit.pending_revisions(tree)
85
70
        # One primary merge
86
71
        self.assertEqual(1, len(pending_revisions))
87
72
        # Revision == rev_id2
96
81
        rev_id1 = tree.commit('one')
97
82
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
98
83
        rev_id2 = tree2.commit('two')
 
84
        rev_id3 = tree2.commit('three')
99
85
        tree3 = tree2.bzrdir.sprout('tree3').open_workingtree()
100
 
        rev_id3 = tree2.commit('three')
101
86
        rev_id4 = tree3.commit('four')
102
87
        rev_id5 = tree3.commit('five')
103
88
        tree.merge_from_branch(tree2.branch)
104
 
        tree.merge_from_branch(tree3.branch, force=True)
 
89
        tree.merge_from_branch(tree3.branch)
105
90
        self.assertEqual([rev_id1, rev_id3, rev_id5], tree.get_parent_ids())
106
91
 
107
 
        self.addCleanup(tree.lock_read().unlock)
108
 
        pending_revisions = list(commit.pending_revisions(tree))
 
92
        pending_revisions = commit.pending_revisions(tree)
109
93
        # Two primary merges
110
94
        self.assertEqual(2, len(pending_revisions))
111
95
        # Revision == rev_id2
148
132
 
149
133
class TestCommitDialogSimple(tests.TestCaseWithTransport):
150
134
 
151
 
    def test_init(self):
152
 
        MockMethod.bind(self, CommitDialogNoWidgets, 'setup_params')
153
 
        MockMethod.bind(self, CommitDialogNoWidgets, 'construct')
154
 
        MockMethod.bind(self, CommitDialogNoWidgets, 'fill_in_data')
155
 
 
156
 
        tree = self.make_branch_and_tree('tree')
157
 
        rev_id = tree.commit('first')
158
 
        dlg = CommitDialogNoWidgets(tree)
159
 
        self.assertIs(tree, dlg._wt)
160
 
        self.assertIs(None, dlg._selected)
161
 
        self.assertTrue(dlg._enable_per_file_commits)
162
 
        self.assertTrue(dlg._commit_all_changes)
163
 
        self.assertIs(None, dlg.committed_revision_id)
164
 
        self.assertIs(None, dlg._last_selected_file)
165
 
        self.assertIsInstance(
166
 
            dlg._saved_commit_messages_manager, SavedCommitMessagesManager)
167
 
        self.assertTrue(CommitDialogNoWidgets.setup_params.called)
168
 
        self.assertTrue(CommitDialogNoWidgets.construct.called)
169
 
        self.assertTrue(CommitDialogNoWidgets.fill_in_data.called)
170
 
 
171
135
    def test_setup_parameters_no_pending(self):
172
136
        tree = self.make_branch_and_tree('tree')
173
137
        rev_id = tree.commit('first')
174
138
 
175
139
        dlg = CommitDialogNoWidgets(tree)
176
140
        self.assertEqual(rev_id, dlg._basis_tree.get_revision_id())
177
 
        self.assertEquals([], dlg._pending)
 
141
        self.assertIs(None, dlg._pending)
178
142
        self.assertFalse(dlg._is_checkout)
179
143
 
180
144
    def test_setup_parameters_checkout(self):
185
149
 
186
150
        dlg = CommitDialogNoWidgets(tree2)
187
151
        self.assertEqual(rev_id, dlg._basis_tree.get_revision_id())
188
 
        self.assertEquals([], dlg._pending)
 
152
        self.assertIs(None, dlg._pending)
189
153
        self.assertTrue(dlg._is_checkout)
190
154
 
191
155
    def test_setup_parameters_pending(self):
216
180
        self.assertEqual([], delta.removed)
217
181
        self.assertEqual([(u'a', 'a-id', 'file')], delta.added)
218
182
 
219
 
    def test_on_treeview_files_cursor_changed_no_selection(self):
220
 
        MockMethod.bind(self, CommitDialogNoWidgets, '_update_per_file_info')
221
 
        tree = self.make_branch_and_tree('tree')
222
 
        rev_id = tree.commit('first')
223
 
        dlg = CommitDialogNoWidgets(tree)
224
 
        treeview = Gtk.TreeView()
225
 
        dlg._on_treeview_files_cursor_changed(treeview)
226
 
        self.assertFalse(CommitDialogNoWidgets._update_per_file_info.called)
227
 
 
228
 
    def test_on_treeview_files_cursor_changed_with_destroyed_treeview(self):
229
 
        MockMethod.bind(self, CommitDialogNoWidgets, '_update_per_file_info')
230
 
        tree = self.make_branch_and_tree('tree')
231
 
        rev_id = tree.commit('first')
232
 
        dlg = CommitDialogNoWidgets(tree)
233
 
        treeview = Gtk.TreeView()
234
 
        treeview.destroy()
235
 
        dlg._on_treeview_files_cursor_changed(treeview)
236
 
        self.assertFalse(CommitDialogNoWidgets._update_per_file_info.called)
237
 
 
238
 
    def test_get_line_height(self):
239
 
        tree = self.make_branch_and_tree('tree')
240
 
        dlg = CommitDialogNoWidgets(tree)
241
 
        textview = Gtk.TextView()
242
 
        line_height = dlg.get_line_height(textview)
243
 
        self.assertIsInstance(line_height, int)
244
 
 
245
183
 
246
184
class TestCommitDialog(tests.TestCaseWithTransport):
247
185
 
269
207
 
270
208
        commit_col = dlg._treeview_files.get_column(0)
271
209
        self.assertEqual('Commit', commit_col.get_title())
272
 
        renderer = commit_col.get_cells()[0]
273
 
        self.assertTrue(renderer.get_property('activatable'))
274
 
 
275
 
        self.assertEqual('Commit all changes',
276
 
                         dlg._commit_all_files_radio.get_label())
277
 
        self.assertTrue(dlg._commit_all_files_radio.get_property('sensitive'))
278
 
        self.assertTrue(dlg._commit_selected_radio.get_property('sensitive'))
 
210
        renderer = commit_col.get_cell_renderers()[0]
 
211
        self.assertTrue(renderer.get_active())
279
212
 
280
213
    def test_pending(self):
281
214
        tree = self.make_branch_and_tree('tree')
294
227
 
295
228
        commit_col = dlg._treeview_files.get_column(0)
296
229
        self.assertEqual('Commit*', commit_col.get_title())
297
 
        renderer = commit_col.get_cells()[0]
298
 
        self.assertFalse(renderer.get_property('activatable'))
 
230
        renderer = commit_col.get_cell_renderers()[0]
 
231
        self.assertFalse(renderer.get_active())
299
232
 
300
233
        values = [(r[0], r[1], r[2], r[3]) for r in dlg._pending_store]
301
234
        self.assertEqual([(rev_id2, '2007-10-01', 'Joe Foo', 'two')], values)
302
235
 
303
 
        self.assertEqual('Commit all changes*',
304
 
                         dlg._commit_all_files_radio.get_label())
305
 
        self.assertFalse(dlg._commit_all_files_radio.get_property('sensitive'))
306
 
        self.assertFalse(dlg._commit_selected_radio.get_property('sensitive'))
307
 
 
308
236
    def test_pending_multiple(self):
309
237
        tree = self.make_branch_and_tree('tree')
310
238
        rev_id1 = tree.commit('one')
328
256
                               committer='Jerry Foo <jerry@foo.com>',
329
257
                               timestamp=1191372278.05,
330
258
                               timezone=+7200)
331
 
        tree.merge_from_branch(tree3.branch, force=True)
 
259
        tree.merge_from_branch(tree3.branch)
332
260
 
333
261
        dlg = commit.CommitDialog(tree)
334
262
        # TODO: assert that the pending box is set to show
346
274
 
347
275
        dlg = commit.CommitDialog(tree)
348
276
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
349
 
        self.assertEqual([("", "", True, 'All Files', ''),
 
277
        self.assertEqual([(None, None, True, 'All Files', ''),
350
278
                          ('a-id', 'a', True, 'a', 'added'),
351
279
                          ('b-id', 'b', True, 'b/', 'added'),
352
280
                          ('c-id', 'b/c', True, 'b/c', 'added'),
363
291
 
364
292
        dlg = commit.CommitDialog(tree)
365
293
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
366
 
        self.assertEqual([("", "", True, 'All Files', ''),
 
294
        self.assertEqual([(None, None, True, 'All Files', ''),
367
295
                          ('b-id', 'd', True, 'b/ => d/', 'renamed'),
368
296
                          ('a-id', 'd/a', True, 'a => d/a', 'renamed'),
369
297
                         ], values)
378
306
 
379
307
        dlg = commit.CommitDialog(tree)
380
308
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
381
 
        self.assertEqual([("", "", True, 'All Files', ''),
 
309
        self.assertEqual([(None, None, True, 'All Files', ''),
382
310
                          ('a-id', 'a', True, 'a', 'modified'),
383
311
                         ], values)
384
312
 
398
326
 
399
327
        dlg = commit.CommitDialog(tree)
400
328
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
401
 
        self.assertEqual([("", "", True, 'All Files', ''),
 
329
        self.assertEqual([(None, None, True, 'All Files', ''),
402
330
                          ('b-id', 'd', True, 'b/ => d/', 'renamed'),
403
331
                          ('a-id', 'd/a', True, 'a => d/a', 'renamed and modified'),
404
332
                          ('c-id', 'd/c', True, 'd/c', 'modified'),
421
349
 
422
350
        dlg = commit.CommitDialog(tree)
423
351
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
424
 
        self.assertEqual([("", "", True, 'All Files', ''),
 
352
        self.assertEqual([(None, None, True, 'All Files', ''),
425
353
                          ('a-id', 'a', True, 'a => a/', 'kind changed'),
426
354
                          # ('b-id', 'c', True, 'b => c/', 'renamed and modified'),
427
355
                         ], values)
437
365
 
438
366
        dlg = commit.CommitDialog(tree)
439
367
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
440
 
        self.assertEqual([("", "", True, 'All Files', ''),
 
368
        self.assertEqual([(None, None, True, 'All Files', ''),
441
369
                          ('a-id', 'a', True, 'a', 'removed'),
442
370
                          ('b-id', 'b', True, 'b/', 'removed'),
443
371
                         ], values)
444
 
        # All Files should be selected
445
 
        self.assertEqual(
446
 
            (Gtk.TreePath(path=0), None), dlg._treeview_files.get_cursor())
447
 
 
448
 
    def test_filelist_with_selected(self):
449
 
        tree = self.make_branch_and_tree('tree')
450
 
        self.build_tree(['tree/a', 'tree/b/'])
451
 
        tree.add(['a', 'b'], ['a-id', 'b-id'])
452
 
 
453
 
        dlg = commit.CommitDialog(tree, selected='a')
454
 
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
455
 
        self.assertEqual([("", "", False, 'All Files', ''),
456
 
                          ('a-id', 'a', True, 'a', 'added'),
457
 
                          ('b-id', 'b', False, 'b/', 'added'),
458
 
                         ], values)
459
 
        # This file should also be selected in the file list, rather than the
460
 
        # 'All Files' selection
461
 
        self.assertEqual(
462
 
            (Gtk.TreePath(path=1), None), dlg._treeview_files.get_cursor())
463
372
 
464
373
    def test_diff_view(self):
465
374
        tree = self.make_branch_and_tree('tree')
473
382
        dlg = commit.CommitDialog(tree)
474
383
        diff_buffer = dlg._diff_view.buffer
475
384
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
476
 
                                    diff_buffer.get_end_iter(),
477
 
                                    True).splitlines(True)
 
385
                                    diff_buffer.get_end_iter()).splitlines(True)
478
386
 
479
 
        self.assertEqual("=== modified file 'a'\n", text[0])
 
387
        self.assertEqual("=== removed file 'b'\n", text[0])
480
388
        self.assertContainsRe(text[1],
 
389
            r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
 
390
        self.assertEqual('+++ b\t1970-01-01 00:00:00 +0000\n', text[2])
 
391
        self.assertEqual('@@ -1,1 +0,0 @@\n', text[3])
 
392
        self.assertEqual('-contents of tree/b\n', text[4])
 
393
        self.assertEqual('\n', text[5])
 
394
 
 
395
        self.assertEqual("=== modified file 'a'\n", text[6])
 
396
        self.assertContainsRe(text[7],
481
397
            r"--- a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
482
 
        self.assertContainsRe(text[2],
483
 
            r"\+\+\+ a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
484
 
        self.assertEqual('@@ -1,1 +1,1 @@\n', text[3])
485
 
        self.assertEqual('-contents of tree/a\n', text[4])
486
 
        self.assertEqual('+new contents for a\n', text[5])
487
 
        self.assertEqual('\n', text[6])
488
 
 
489
 
        self.assertEqual("=== removed file 'b'\n", text[7])
490
398
        self.assertContainsRe(text[8],
491
 
            r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
492
 
        self.assertEqual('+++ b\t1970-01-01 00:00:00 +0000\n', text[9])
493
 
        self.assertEqual('@@ -1,1 +0,0 @@\n', text[10])
494
 
        self.assertEqual('-contents of tree/b\n', text[11])
 
399
            r"\+\+\+ a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
 
400
        self.assertEqual('@@ -1,1 +1,1 @@\n', text[9])
 
401
        self.assertEqual('-contents of tree/a\n', text[10])
 
402
        self.assertEqual('+new contents for a\n', text[11])
495
403
        self.assertEqual('\n', text[12])
496
404
 
497
405
        self.assertEqual('Diff for All Files', dlg._diff_label.get_text())
498
406
 
499
 
    def test_commit_partial_toggle(self):
500
 
        tree = self.make_branch_and_tree('tree')
501
 
        self.build_tree(['tree/a', 'tree/b'])
502
 
        tree.add(['a', 'b'], ['a-id', 'b-id'])
503
 
 
504
 
        dlg = commit.CommitDialog(tree)
505
 
        checked_col = dlg._treeview_files.get_column(0)
506
 
        self.assertFalse(checked_col.get_property('visible'))
507
 
        self.assertTrue(dlg._commit_all_changes)
508
 
 
509
 
        dlg._commit_selected_radio.set_active(True)
510
 
        self.assertTrue(checked_col.get_property('visible'))
511
 
        self.assertFalse(dlg._commit_all_changes)
512
 
 
513
407
    def test_file_selection(self):
514
408
        """Several things should happen when a file has been selected."""
515
409
        tree = self.make_branch_and_tree('tree')
516
 
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
517
410
        self.build_tree(['tree/a', 'tree/b'])
518
411
        tree.add(['a', 'b'], ['a-id', 'b-id'])
519
412
 
525
418
        self.assertFalse(dlg._file_message_expander.get_expanded())
526
419
        self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
527
420
 
528
 
        dlg._treeview_files.set_cursor(
529
 
            Gtk.TreePath(path=1), None, False)
 
421
        dlg._treeview_files.set_cursor((1,))
530
422
        self.assertEqual('Diff for a', dlg._diff_label.get_text())
531
423
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
532
 
                                    diff_buffer.get_end_iter(),
533
 
                                    True).splitlines(True)
 
424
                                    diff_buffer.get_end_iter()).splitlines(True)
534
425
        self.assertEqual("=== added file 'a'\n", text[0])
535
426
        self.assertContainsRe(text[1],
536
427
            r"--- a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
544
435
        self.assertTrue(dlg._file_message_expander.get_expanded())
545
436
        self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
546
437
 
547
 
        dlg._treeview_files.set_cursor(
548
 
            Gtk.TreePath(path=2), None, False)
 
438
        dlg._treeview_files.set_cursor((2,))
549
439
        self.assertEqual('Diff for b', dlg._diff_label.get_text())
550
440
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
551
 
                                    diff_buffer.get_end_iter(),
552
 
                                    True).splitlines(True)
 
441
                                    diff_buffer.get_end_iter()).splitlines(True)
553
442
        self.assertEqual("=== added file 'b'\n", text[0])
554
443
        self.assertContainsRe(text[1],
555
444
            r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
563
452
        self.assertTrue(dlg._file_message_expander.get_expanded())
564
453
        self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
565
454
 
566
 
        dlg._treeview_files.set_cursor(
567
 
            Gtk.TreePath(path=0), None, False)
 
455
        dlg._treeview_files.set_cursor((0,))
568
456
        self.assertEqual('Diff for All Files', dlg._diff_label.get_text())
569
457
        self.assertEqual('File commit message',
570
458
                         dlg._file_message_expander.get_label())
574
462
    def test_file_selection_message(self):
575
463
        """Selecting a file should bring up its commit message."""
576
464
        tree = self.make_branch_and_tree('tree')
577
 
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
578
465
        self.build_tree(['tree/a', 'tree/b/'])
579
466
        tree.add(['a', 'b'], ['a-id', 'b-id'])
580
467
 
581
468
        def get_file_text():
582
469
            buf = dlg._file_message_text_view.get_buffer()
583
 
            return buf.get_text(
584
 
                buf.get_start_iter(), buf.get_end_iter(), True)
 
470
            return buf.get_text(buf.get_start_iter(), buf.get_end_iter())
585
471
 
586
472
        def get_saved_text(path):
587
473
            """Get the saved text for a given record."""
594
480
        self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
595
481
        self.assertEqual('', get_file_text())
596
482
 
597
 
        dlg._treeview_files.set_cursor(
598
 
            Gtk.TreePath(path=1), None, False)
 
483
        dlg._treeview_files.set_cursor((1,))
599
484
        self.assertEqual('Commit message for a',
600
485
                         dlg._file_message_expander.get_label())
601
486
        self.assertTrue(dlg._file_message_expander.get_expanded())
608
493
        # We should have updated the ListStore with the new file commit info
609
494
        self.assertEqual('Some text\nfor a\n', get_saved_text(1))
610
495
 
611
 
        dlg._treeview_files.set_cursor(
612
 
            Gtk.TreePath(path=2), None, False)
 
496
        dlg._treeview_files.set_cursor((2,))
613
497
        self.assertEqual('Commit message for b/',
614
498
                         dlg._file_message_expander.get_label())
615
499
        self.assertTrue(dlg._file_message_expander.get_expanded())
620
504
        dlg._set_file_commit_message('More text\nfor b\n')
621
505
        # Now switch back to 'a'. The message should be saved, and the buffer
622
506
        # should be updated with the other text
623
 
        dlg._treeview_files.set_cursor(
624
 
            Gtk.TreePath(path=1), None, False)
 
507
        dlg._treeview_files.set_cursor((1,))
625
508
        self.assertEqual('More text\nfor b\n', get_saved_text(2))
626
509
        self.assertEqual('Commit message for a',
627
510
                         dlg._file_message_expander.get_label())
636
519
        tree.add(['a', 'b'], ['a-id', 'b-id'])
637
520
 
638
521
        dlg = commit.CommitDialog(tree)
639
 
        self.assertEqual([("", "", True),
 
522
        self.assertEqual([(None, None, True),
640
523
                          ('a-id', 'a', True),
641
524
                          ('b-id', 'b', True),
642
525
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
647
530
        #       do with. So instead, we just call toggle directly, and assume
648
531
        #       that toggle is hooked in correctly
649
532
        # column = dlg._treeview_files.get_column(0)
650
 
        # renderer = column.get_cells()[0]
 
533
        # renderer = column.get_cell_renderers()[0]
651
534
 
652
535
        # Toggle a single entry should set just that entry to False
653
536
        dlg._toggle_commit(None, 1, dlg._files_store)
654
 
        self.assertEqual([("", "", True),
 
537
        self.assertEqual([(None, None, True),
655
538
                          ('a-id', 'a', False),
656
539
                          ('b-id', 'b', True),
657
540
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
658
541
 
659
542
        # Toggling the main entry should set all entries
660
543
        dlg._toggle_commit(None, 0, dlg._files_store)
661
 
        self.assertEqual([("", "", False),
 
544
        self.assertEqual([(None, None, False),
662
545
                          ('a-id', 'a', False),
663
546
                          ('b-id', 'b', False),
664
547
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
665
548
 
666
549
        dlg._toggle_commit(None, 2, dlg._files_store)
667
 
        self.assertEqual([("", "", False),
 
550
        self.assertEqual([(None, None, False),
668
551
                          ('a-id', 'a', False),
669
552
                          ('b-id', 'b', True),
670
553
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
671
554
 
672
555
        dlg._toggle_commit(None, 0, dlg._files_store)
673
 
        self.assertEqual([("", "", True),
 
556
        self.assertEqual([(None, None, True),
674
557
                          ('a-id', 'a', True),
675
558
                          ('b-id', 'b', True),
676
559
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
683
566
        dlg = commit.CommitDialog(tree)
684
567
        self.assertEqual((['a', 'b'], []), dlg._get_specific_files())
685
568
 
686
 
        dlg._commit_selected_radio.set_active(True)
687
569
        dlg._toggle_commit(None, 0, dlg._files_store)
688
570
        self.assertEqual(([], []), dlg._get_specific_files())
689
571
 
692
574
 
693
575
    def test_specific_files_with_messages(self):
694
576
        tree = self.make_branch_and_tree('tree')
695
 
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
696
577
        self.build_tree(['tree/a_file', 'tree/b_dir/'])
697
578
        tree.add(['a_file', 'b_dir'], ['1a-id', '0b-id'])
698
579
 
699
580
        dlg = commit.CommitDialog(tree)
700
 
        dlg._commit_selected_radio.set_active(True)
701
581
        self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
702
582
 
703
 
        dlg._treeview_files.set_cursor(
704
 
            Gtk.TreePath(path=1), None, False)
 
583
        dlg._treeview_files.set_cursor((1,))
705
584
        dlg._set_file_commit_message('Test\nmessage\nfor a_file\n')
706
 
        dlg._treeview_files.set_cursor(
707
 
            Gtk.TreePath(path=2), None, False)
 
585
        dlg._treeview_files.set_cursor((2,))
708
586
        dlg._set_file_commit_message('message\nfor b_dir\n')
709
587
 
710
588
        self.assertEqual((['a_file', 'b_dir'],
720
598
                            'message':'message\nfor b_dir\n'},
721
599
                          ]), dlg._get_specific_files())
722
600
 
723
 
    def test_specific_files_sanitizes_messages(self):
724
 
        tree = self.make_branch_and_tree('tree')
725
 
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
726
 
        self.build_tree(['tree/a_file', 'tree/b_dir/'])
727
 
        tree.add(['a_file', 'b_dir'], ['1a-id', '0b-id'])
728
 
 
729
 
        dlg = commit.CommitDialog(tree)
730
 
        dlg._commit_selected_radio.set_active(True)
731
 
        self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
732
 
 
733
 
        dlg._treeview_files.set_cursor(
734
 
            Gtk.TreePath(path=1), None, False)
735
 
        dlg._set_file_commit_message('Test\r\nmessage\rfor a_file\n')
736
 
        dlg._treeview_files.set_cursor(
737
 
            Gtk.TreePath(path=2), None, False)
738
 
        dlg._set_file_commit_message('message\r\nfor\nb_dir\r')
739
 
 
740
 
        self.assertEqual((['a_file', 'b_dir'],
741
 
                          [{'path':'a_file', 'file_id':'1a-id',
742
 
                            'message':'Test\nmessage\nfor a_file\n'},
743
 
                           {'path':'b_dir', 'file_id':'0b-id',
744
 
                            'message':'message\nfor\nb_dir\n'},
745
 
                          ]), dlg._get_specific_files())
746
 
 
747
 
 
748
 
class QuestionHelpers(object):
 
601
 
 
602
class TestCommitDialog_Commit(tests.TestCaseWithTransport):
 
603
    """Tests on the actual 'commit' button being pushed."""
749
604
 
750
605
    def _set_question_yes(self, dlg):
751
606
        """Set the dialog to answer YES to any questions."""
752
607
        self.questions = []
753
 
        def _question_yes(*args, **kwargs):
 
608
        def _question_yes(*args):
754
609
            self.questions.append(args)
755
610
            self.questions.append('YES')
756
 
            return Gtk.ResponseType.YES
 
611
            return gtk.RESPONSE_YES
757
612
        dlg._question_dialog = _question_yes
758
613
 
759
614
    def _set_question_no(self, dlg):
760
615
        """Set the dialog to answer NO to any questions."""
761
616
        self.questions = []
762
 
        def _question_no(*args, **kwargs):
 
617
        def _question_no(*args):
763
618
            self.questions.append(args)
764
619
            self.questions.append('NO')
765
 
            return Gtk.ResponseType.NO
 
620
            return gtk.RESPONSE_NO
766
621
        dlg._question_dialog = _question_no
767
622
 
768
 
 
769
 
class TestCommitDialog_Commit(tests.TestCaseWithTransport, QuestionHelpers):
770
 
    """Tests on the actual 'commit' button being pushed."""
771
 
 
772
623
    def test_bound_commit_local(self):
773
624
        tree = self.make_branch_and_tree('tree')
774
625
        self.build_tree(['tree/a'])
790
641
        self.assertEqual(last_rev, dlg.committed_revision_id)
791
642
        self.assertEqual(rev_id1, tree.branch.last_revision())
792
643
 
793
 
    def test_commit_global_sanitizes_message(self):
794
 
        tree = self.make_branch_and_tree('tree')
795
 
        self.build_tree(['tree/a'])
796
 
        tree.add(['a'], ['a-id'])
797
 
        rev_id1 = tree.commit('one')
798
 
 
799
 
        self.build_tree(['tree/b'])
800
 
        tree.add(['b'], ['b-id'])
801
 
        dlg = commit.CommitDialog(tree)
802
 
        # With the check box set, it should only effect the local branch
803
 
        dlg._set_global_commit_message('Commit\r\nmessage\rfoo\n')
804
 
        dlg._do_commit()
805
 
        rev = tree.branch.repository.get_revision(tree.last_revision())
806
 
        self.assertEqual('Commit\nmessage\nfoo\n', rev.message)
807
 
 
808
644
    def test_bound_commit_both(self):
809
645
        tree = self.make_branch_and_tree('tree')
810
646
        self.build_tree(['tree/a'])
826
662
        self.assertEqual(last_rev, dlg.committed_revision_id)
827
663
        self.assertEqual(last_rev, tree.branch.last_revision())
828
664
 
829
 
    def test_commit_empty_message(self):
 
665
    def test_commit_no_message(self):
830
666
        tree = self.make_branch_and_tree('tree')
831
667
        self.build_tree(['tree/a', 'tree/b'])
832
668
        tree.add(['a'], ['a-id'])
948
784
        tree.add(['a', 'b'], ['a-id', 'b-id'])
949
785
 
950
786
        dlg = commit.CommitDialog(tree)
951
 
        dlg._commit_selected_radio.set_active(True) # enable partial
952
787
        dlg._toggle_commit(None, 2, dlg._files_store) # unset 'b'
953
788
 
954
789
        dlg._set_global_commit_message('Committing just "a"\n')
963
798
                                       if path] # Ignore the root entry
964
799
        self.assertEqual([('a', 'a-id')], entries)
965
800
 
966
 
    def test_commit_partial_no_partial(self):
967
 
        """Ignore the checkboxes if committing all files."""
968
 
        tree = self.make_branch_and_tree('tree')
969
 
        rev_id1 = tree.commit('one')
970
 
        self.build_tree(['tree/a', 'tree/b'])
971
 
        tree.add(['a', 'b'], ['a-id', 'b-id'])
972
 
 
973
 
        dlg = commit.CommitDialog(tree)
974
 
        dlg._commit_selected_radio.set_active(True) # enable partial
975
 
        dlg._toggle_commit(None, 2, dlg._files_store) # unset 'b'
976
 
 
977
 
        # Switch back to committing all changes
978
 
        dlg._commit_all_files_radio.set_active(True)
979
 
 
980
 
        dlg._set_global_commit_message('Committing everything\n')
981
 
        dlg._do_commit()
982
 
 
983
 
        rev_id2 = dlg.committed_revision_id
984
 
        self.assertIsNot(None, rev_id2)
985
 
        self.assertEqual(rev_id2, tree.last_revision())
986
 
 
987
 
        rt = tree.branch.repository.revision_tree(rev_id2)
988
 
        entries = [(path, ie.file_id) for path, ie in rt.iter_entries_by_dir()
989
 
                                       if path] # Ignore the root entry
990
 
        self.assertEqual([('a', 'a-id'), ('b', 'b-id')], entries)
991
 
 
992
801
    def test_commit_no_messages(self):
993
802
        tree = self.make_branch_and_tree('tree')
994
803
        rev_id1 = tree.commit('one')
1002
811
        rev = tree.branch.repository.get_revision(dlg.committed_revision_id)
1003
812
        self.failIf('file-info' in rev.properties)
1004
813
 
1005
 
    def test_commit_disabled_messages(self):
1006
 
        tree = self.make_branch_and_tree('tree')
1007
 
        rev_id1 = tree.commit('one')
1008
 
 
1009
 
        self.build_tree(['tree/a', 'tree/b'])
1010
 
        tree.add(['a', 'b'], ['a-id', 'b-id'])
1011
 
 
1012
 
        dlg = commit.CommitDialog(tree)
1013
 
        self.assertFalse(dlg._file_message_expander.get_property('visible'))
1014
 
        self.assertEqual('Commit Message',
1015
 
                         dlg._global_message_label.get_text())
1016
 
 
1017
 
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
1018
 
        dlg = commit.CommitDialog(tree)
1019
 
        self.assertTrue(dlg._file_message_expander.get_property('visible'))
1020
 
        self.assertEqual('Global Commit Message',
1021
 
                         dlg._global_message_label.get_text())
1022
 
 
1023
 
        tree.branch.get_config().set_user_option('per_file_commits', 'on')
1024
 
        dlg = commit.CommitDialog(tree)
1025
 
        self.assertTrue(dlg._file_message_expander.get_property('visible'))
1026
 
        self.assertEqual('Global Commit Message',
1027
 
                         dlg._global_message_label.get_text())
1028
 
 
1029
 
        tree.branch.get_config().set_user_option('per_file_commits', 'y')
1030
 
        dlg = commit.CommitDialog(tree)
1031
 
        self.assertTrue(dlg._file_message_expander.get_property('visible'))
1032
 
        self.assertEqual('Global Commit Message',
1033
 
                         dlg._global_message_label.get_text())
1034
 
 
1035
 
        tree.branch.get_config().set_user_option('per_file_commits', 'n')
1036
 
        dlg = commit.CommitDialog(tree)
1037
 
        self.assertFalse(dlg._file_message_expander.get_property('visible'))
1038
 
        self.assertEqual('Commit Message',
1039
 
                         dlg._global_message_label.get_text())
1040
 
 
1041
814
    def test_commit_specific_files_with_messages(self):
1042
815
        tree = self.make_branch_and_tree('tree')
1043
 
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
1044
816
        rev_id1 = tree.commit('one')
1045
817
        self.build_tree(['tree/a', 'tree/b'])
1046
818
        tree.add(['a', 'b'], ['a-id', 'b-id'])
1047
819
 
1048
820
        dlg = commit.CommitDialog(tree)
1049
 
        dlg._commit_selected_radio.set_active(True) # enable partial
1050
 
        dlg._treeview_files.set_cursor(
1051
 
            Gtk.TreePath(path=1), None, False)
 
821
        dlg._treeview_files.set_cursor((1,))
1052
822
        dlg._set_file_commit_message('Message for A\n')
1053
 
        dlg._treeview_files.set_cursor(
1054
 
            Gtk.TreePath(path=2), None, False)
 
823
        dlg._treeview_files.set_cursor((2,))
1055
824
        dlg._set_file_commit_message('Message for B\n')
1056
825
        dlg._toggle_commit(None, 2, dlg._files_store) # unset 'b'
1057
826
        dlg._set_global_commit_message('Commit just "a"')
1063
832
        rev = tree.branch.repository.get_revision(rev_id2)
1064
833
        self.assertEqual('Commit just "a"', rev.message)
1065
834
        file_info = rev.properties['file-info']
1066
 
        self.assertEqual(u'ld7:file_id4:a-id'
1067
 
                         '7:message14:Message for A\n'
1068
 
                         '4:path1:a'
1069
 
                         'ee',
1070
 
                         file_info)
 
835
        self.assertEqual('ld7:file_id4:a-id'
 
836
                           '7:message14:Message for A\n'
 
837
                           '4:path1:a'
 
838
                         'ee', file_info)
1071
839
        self.assertEqual([{'path':'a', 'file_id':'a-id',
1072
 
                           'message':'Message for A\n'},],
1073
 
                         bencode.bdecode(file_info.encode('UTF-8')))
 
840
                           'message':'Message for A\n'},
 
841
                         ], bencode.bdecode(file_info))
1074
842
 
1075
843
    def test_commit_messages_after_merge(self):
1076
844
        tree = self.make_branch_and_tree('tree')
1077
 
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
1078
845
        rev_id1 = tree.commit('one')
1079
846
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
1080
847
        self.build_tree(['tree2/a', 'tree2/b'])
1084
851
        tree.merge_from_branch(tree2.branch)
1085
852
 
1086
853
        dlg = commit.CommitDialog(tree)
1087
 
        dlg._treeview_files.set_cursor(
1088
 
            Gtk.TreePath(path=1), None, False) # 'a'
 
854
        dlg._treeview_files.set_cursor((1,)) # 'a'
1089
855
        dlg._set_file_commit_message('Message for A\n')
1090
856
        # No message for 'B'
1091
857
        dlg._set_global_commit_message('Merging from "tree2"\n')
1098
864
        self.assertEqual('Merging from "tree2"\n', rev.message)
1099
865
        self.assertEqual([rev_id1, rev_id2], rev.parent_ids)
1100
866
        file_info = rev.properties['file-info']
1101
 
        self.assertEqual(u'ld7:file_id4:a-id'
1102
 
                         '7:message14:Message for A\n'
1103
 
                         '4:path1:a'
1104
 
                         'ee',
1105
 
                         file_info)
 
867
        self.assertEqual('ld7:file_id4:a-id'
 
868
                           '7:message14:Message for A\n'
 
869
                           '4:path1:a'
 
870
                         'ee', file_info)
1106
871
        self.assertEqual([{'path':'a', 'file_id':'a-id',
1107
 
                           'message':'Message for A\n'},],
1108
 
                         bencode.bdecode(file_info.encode('UTF-8')))
 
872
                           'message':'Message for A\n'},
 
873
                         ], bencode.bdecode(file_info))
1109
874
 
1110
875
    def test_commit_unicode_messages(self):
1111
 
        self.requireFeature(UnicodeFilenameFeature)
 
876
        from bzrlib.tests.test_diff import UnicodeFilename
 
877
        self.requireFeature(UnicodeFilename)
1112
878
 
1113
879
        tree = self.make_branch_and_tree('tree')
1114
 
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
1115
880
        self.build_tree(['tree/a', u'tree/\u03a9'])
1116
881
        tree.add(['a', u'\u03a9'], ['a-id', 'omega-id'])
1117
882
 
1118
883
        dlg = commit.CommitDialog(tree)
1119
 
        dlg._treeview_files.set_cursor(
1120
 
            Gtk.TreePath(path=1), None, False) # 'a'
 
884
        dlg._treeview_files.set_cursor((1,)) # 'a'
1121
885
        dlg._set_file_commit_message(u'Test \xfan\xecc\xf6de\n')
1122
 
        dlg._treeview_files.set_cursor(
1123
 
            Gtk.TreePath(path=2), None, False) # omega
 
886
        dlg._treeview_files.set_cursor((2,)) # omega
1124
887
        dlg._set_file_commit_message(u'\u03a9 is the end of all things.\n')
1125
888
        dlg._set_global_commit_message(u'\u03a9 and \xfan\xecc\xf6de\n')
1126
889
 
1134
897
        dlg._do_commit()
1135
898
 
1136
899
        rev = tree.branch.repository.get_revision(dlg.committed_revision_id)
1137
 
        file_info = rev.properties['file-info'].encode('UTF-8')
 
900
        file_info = rev.properties['file-info']
1138
901
        value = ('ld7:file_id4:a-id'
1139
902
                   '7:message16:Test \xc3\xban\xc3\xacc\xc3\xb6de\n'
1140
903
                   '4:path1:a'
1144
907
                   '4:path2:\xce\xa9'
1145
908
                  'e'
1146
909
                 'e')
 
910
        self.expectFailure('bencode and unicode does not mix properly with'
 
911
                           ' Revision XML serialization.',
 
912
                           self.assertEqual, value, file_info)
1147
913
        self.assertEqual(value, file_info)
1148
914
        file_info_decoded = bencode.bdecode(file_info)
1149
915
        for d in file_info_decoded:
1150
 
            d['path'] = d['path'].decode('UTF-8')
1151
 
            d['message'] = d['message'].decode('UTF-8')
 
916
            d['path'] = d['path'].decode('utf8')
 
917
            d['message'] = d['message'].decode('utf8')
1152
918
 
1153
919
        self.assertEqual([{'path':u'a', 'file_id':'a-id',
1154
920
                           'message':u'Test \xfan\xecc\xf6de\n'},
1155
921
                          {'path':u'\u03a9', 'file_id':'omega-id',
1156
922
                           'message':u'\u03a9 is the end of all things.\n'},
1157
923
                         ], file_info_decoded)
1158
 
 
1159
 
 
1160
 
class TestSanitizeMessage(tests.TestCase):
1161
 
 
1162
 
    def assertSanitize(self, expected, original):
1163
 
        self.assertEqual(expected,
1164
 
                         commit._sanitize_and_decode_message(original))
1165
 
 
1166
 
    def test_untouched(self):
1167
 
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\nbar\nbaz\n')
1168
 
 
1169
 
    def test_converts_cr_to_lf(self):
1170
 
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\rbar\rbaz\r')
1171
 
 
1172
 
    def test_converts_crlf_to_lf(self):
1173
 
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\r\nbaz\r\n')
1174
 
 
1175
 
    def test_converts_mixed_to_lf(self):
1176
 
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\rbaz\n')
1177
 
 
1178
 
 
1179
 
class TestSavedCommitMessages(tests.TestCaseWithTransport):
1180
 
 
1181
 
    def setUp(self):
1182
 
        super(TestSavedCommitMessages, self).setUp()
1183
 
        # Install our hook
1184
 
        branch.Branch.hooks.install_named_hook(
1185
 
            'post_uncommit', commitmsgs.save_commit_messages, None)
1186
 
 
1187
 
    def _get_file_info_dict(self, rank):
1188
 
        file_info = [dict(path='a', file_id='a-id', message='a msg %d' % rank),
1189
 
                     dict(path='b', file_id='b-id', message='b msg %d' % rank)]
1190
 
        return file_info
1191
 
 
1192
 
    def _get_file_info_revprops(self, rank):
1193
 
        file_info_prop = self._get_file_info_dict(rank)
1194
 
        return {'file-info': bencode.bencode(file_info_prop).decode('UTF-8')}
1195
 
 
1196
 
    def _get_commit_message(self):
1197
 
        return self.config.get_user_option('gtk_global_commit_message')
1198
 
 
1199
 
    def _get_file_commit_messages(self):
1200
 
        return self.config.get_user_option('gtk_file_commit_messages')
1201
 
 
1202
 
 
1203
 
class TestUncommitHook(TestSavedCommitMessages):
1204
 
 
1205
 
    def setUp(self):
1206
 
        super(TestUncommitHook, self).setUp()
1207
 
        self.tree = self.make_branch_and_tree('tree')
1208
 
        self.config = self.tree.branch.get_config()
1209
 
        self.build_tree(['tree/a', 'tree/b'])
1210
 
        self.tree.add(['a'], ['a-id'])
1211
 
        self.tree.add(['b'], ['b-id'])
1212
 
        rev1 = self.tree.commit('one', rev_id='one-id',
1213
 
                                revprops=self._get_file_info_revprops(1))
1214
 
        rev2 = self.tree.commit('two', rev_id='two-id',
1215
 
                                revprops=self._get_file_info_revprops(2))
1216
 
        rev3 = self.tree.commit('three', rev_id='three-id',
1217
 
                                revprops=self._get_file_info_revprops(3))
1218
 
 
1219
 
    def test_uncommit_one_by_one(self):
1220
 
        uncommit.uncommit(self.tree.branch, tree=self.tree)
1221
 
        self.assertEquals(u'three', self._get_commit_message())
1222
 
        self.assertEquals(u'd4:a-id7:a msg 34:b-id7:b msg 3e',
1223
 
                          self._get_file_commit_messages())
1224
 
 
1225
 
        uncommit.uncommit(self.tree.branch, tree=self.tree)
1226
 
        self.assertEquals(u'two\n******\nthree', self._get_commit_message())
1227
 
        self.assertEquals(u'd4:a-id22:a msg 2\n******\na msg 3'
1228
 
                          '4:b-id22:b msg 2\n******\nb msg 3e',
1229
 
                          self._get_file_commit_messages())
1230
 
 
1231
 
        uncommit.uncommit(self.tree.branch, tree=self.tree)
1232
 
        self.assertEquals(u'one\n******\ntwo\n******\nthree',
1233
 
                          self._get_commit_message())
1234
 
        self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
1235
 
                          '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
1236
 
                          self._get_file_commit_messages())
1237
 
 
1238
 
    def test_uncommit_all_at_once(self):
1239
 
        uncommit.uncommit(self.tree.branch, tree=self.tree, revno=1)
1240
 
        self.assertEquals(u'one\n******\ntwo\n******\nthree',
1241
 
                          self._get_commit_message())
1242
 
        self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
1243
 
                          '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
1244
 
                          self._get_file_commit_messages())
1245
 
 
1246
 
 
1247
 
class TestReusingSavedCommitMessages(TestSavedCommitMessages, QuestionHelpers):
1248
 
 
1249
 
    def setUp(self):
1250
 
        super(TestReusingSavedCommitMessages, self).setUp()
1251
 
        self.tree = self.make_branch_and_tree('tree')
1252
 
        self.config = self.tree.branch.get_config()
1253
 
        self.config.set_user_option('per_file_commits', 'true')
1254
 
        self.build_tree(['tree/a', 'tree/b'])
1255
 
        self.tree.add(['a'], ['a-id'])
1256
 
        self.tree.add(['b'], ['b-id'])
1257
 
        rev1 = self.tree.commit('one', revprops=self._get_file_info_revprops(1))
1258
 
        rev2 = self.tree.commit('two', revprops=self._get_file_info_revprops(2))
1259
 
        uncommit.uncommit(self.tree.branch, tree=self.tree)
1260
 
        self.build_tree_contents([('tree/a', 'new a content\n'),
1261
 
                                  ('tree/b', 'new b content'),])
1262
 
 
1263
 
    def _get_commit_dialog(self, tree):
1264
 
        # Ensure we will never use a dialog that can actually prompt the user
1265
 
        # during the test suite. Test *can* and *should* override with the
1266
 
        # correct question dialog type.
1267
 
        dlg = commit.CommitDialog(tree)
1268
 
        self._set_question_no(dlg)
1269
 
        return dlg
1270
 
 
1271
 
    def test_setup_saved_messages(self):
1272
 
        # Check the initial setup
1273
 
        self.assertEquals(u'two', self._get_commit_message())
1274
 
        self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
1275
 
                          self._get_file_commit_messages())
1276
 
 
1277
 
    def test_messages_are_reloaded(self):
1278
 
        dlg = self._get_commit_dialog(self.tree)
1279
 
        self.assertEquals(u'two', dlg._get_global_commit_message())
1280
 
        self.assertEquals(([u'a', u'b'],
1281
 
                           [{ 'path': 'a',
1282
 
                             'file_id': 'a-id', 'message': 'a msg 2',},
1283
 
                           {'path': 'b',
1284
 
                            'file_id': 'b-id', 'message': 'b msg 2',}],),
1285
 
                          dlg._get_specific_files())
1286
 
 
1287
 
    def test_messages_are_consumed(self):
1288
 
        dlg = self._get_commit_dialog(self.tree)
1289
 
        dlg._do_commit()
1290
 
        self.assertEquals(u'', self._get_commit_message())
1291
 
        self.assertEquals(u'de', self._get_file_commit_messages())
1292
 
 
1293
 
    def test_messages_are_saved_on_cancel_if_required(self):
1294
 
        dlg = self._get_commit_dialog(self.tree)
1295
 
        self._set_question_yes(dlg) # Save messages
1296
 
        dlg._do_cancel()
1297
 
        self.assertEquals(u'two', self._get_commit_message())
1298
 
        self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
1299
 
                          self._get_file_commit_messages())
1300
 
 
1301
 
    def test_messages_are_cleared_on_cancel_if_required(self):
1302
 
        dlg = self._get_commit_dialog(self.tree)
1303
 
        self._set_question_no(dlg) # Don't save messages
1304
 
        dlg._do_cancel()
1305
 
        self.assertEquals(u'', self._get_commit_message())
1306
 
        self.assertEquals(u'de',
1307
 
                          self._get_file_commit_messages())
1308
 
 
1309
 
 
1310
 
class BzrHandlePatchTestCase(tests.TestCase):
1311
 
 
1312
 
    def setUp(self):
1313
 
        top = os.path.abspath(os.path.join(
1314
 
            os.path.dirname(__file__), os.pardir))
1315
 
        self.script = os.path.join(top, 'bzr-handle-patch')
1316
 
        self.env = dict(os.environ)
1317
 
        self.env['BZR_PLUGINS_AT'] = 'gtk@%s' % top
1318
 
        self.patch = NamedTemporaryFile()
1319
 
        self.patch.write('\n'.join([
1320
 
            "=== added file '_test.txt'",
1321
 
            "--- _test.txt      1970-01-01 00:00:00 +0000",
1322
 
            "+++ _test.txt      2012-02-03 20:00:34 +0000",
1323
 
            "@@ -0,0 +1,1 @@",
1324
 
            "+hello",
1325
 
            ]))
1326
 
        self.patch.flush()
1327
 
        super(BzrHandlePatchTestCase, self).setUp()
1328
 
 
1329
 
    def test_smoketest(self):
1330
 
        # This is a smoke test to verify the process starts.
1331
 
        bzr_notify = subprocess.Popen(
1332
 
            [self.script, self.patch.name, 'test'],
1333
 
            stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=self.env)
1334
 
        stdout, stderr = bzr_notify.communicate()
1335
 
        self.assertEqual('', stdout)
1336
 
        self.assertEqual('', stderr)