/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: Jelmer Vernooij
  • Date: 2011-11-17 21:27:30 UTC
  • Revision ID: jelmer@samba.org-20111117212730-j5onzc4tsatiyoqc
Initial work on fixing nautilus-bzr.

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
# Copyright (C) 2007 John Arbash Meinel <john@arbash-meinel.com>
 
1
# Copyright (C) 2007, 2008 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
18
18
 
19
19
import os
20
20
 
21
 
import gtk
 
21
from gi.repository import Gtk
22
22
 
23
23
from bzrlib import (
 
24
    branch,
24
25
    tests,
25
 
    revision,
 
26
    uncommit,
26
27
    )
27
 
from bzrlib.util import bencode
 
28
try:
 
29
    from bzrlib.tests.features import UnicodeFilenameFeature
 
30
except ImportError: # bzr < 2.5
 
31
    from bzrlib.tests import UnicodeFilenameFeature
 
32
try:
 
33
    from bzrlib import bencode
 
34
except ImportError:
 
35
    from bzrlib.util import bencode
28
36
 
29
 
from bzrlib.plugins.gtk import commit
 
37
from bzrlib.plugins.gtk import (
 
38
    commit,
 
39
    commitmsgs,
 
40
    )
30
41
 
31
42
 
32
43
# TODO: All we need is basic ancestry code to test this, we shouldn't need a
86
97
        rev_id4 = tree3.commit('four')
87
98
        rev_id5 = tree3.commit('five')
88
99
        tree.merge_from_branch(tree2.branch)
89
 
        tree.merge_from_branch(tree3.branch)
 
100
        tree.merge_from_branch(tree3.branch, force=True)
90
101
        self.assertEqual([rev_id1, rev_id3, rev_id5], tree.get_parent_ids())
91
102
 
92
103
        pending_revisions = commit.pending_revisions(tree)
207
218
 
208
219
        commit_col = dlg._treeview_files.get_column(0)
209
220
        self.assertEqual('Commit', commit_col.get_title())
210
 
        renderer = commit_col.get_cell_renderers()[0]
 
221
        renderer = commit_col.get_cells()[0]
211
222
        self.assertTrue(renderer.get_property('activatable'))
212
223
 
213
224
        self.assertEqual('Commit all changes',
232
243
 
233
244
        commit_col = dlg._treeview_files.get_column(0)
234
245
        self.assertEqual('Commit*', commit_col.get_title())
235
 
        renderer = commit_col.get_cell_renderers()[0]
 
246
        renderer = commit_col.get_cells()[0]
236
247
        self.assertFalse(renderer.get_property('activatable'))
237
248
 
238
249
        values = [(r[0], r[1], r[2], r[3]) for r in dlg._pending_store]
266
277
                               committer='Jerry Foo <jerry@foo.com>',
267
278
                               timestamp=1191372278.05,
268
279
                               timezone=+7200)
269
 
        tree.merge_from_branch(tree3.branch)
 
280
        tree.merge_from_branch(tree3.branch, force=True)
270
281
 
271
282
        dlg = commit.CommitDialog(tree)
272
283
        # TODO: assert that the pending box is set to show
380
391
                          ('b-id', 'b', True, 'b/', 'removed'),
381
392
                         ], values)
382
393
        # All Files should be selected
383
 
        self.assertEqual(((0,), None), dlg._treeview_files.get_cursor())
 
394
        self.assertEqual(
 
395
            (Gtk.TreePath(path=0), None), dlg._treeview_files.get_cursor())
384
396
 
385
397
    def test_filelist_with_selected(self):
386
398
        tree = self.make_branch_and_tree('tree')
395
407
                         ], values)
396
408
        # This file should also be selected in the file list, rather than the
397
409
        # 'All Files' selection
398
 
        self.assertEqual(((1,), None), dlg._treeview_files.get_cursor())
 
410
        self.assertEqual(
 
411
            (Gtk.TreePath(path=1), None), dlg._treeview_files.get_cursor())
399
412
 
400
413
    def test_diff_view(self):
401
414
        tree = self.make_branch_and_tree('tree')
409
422
        dlg = commit.CommitDialog(tree)
410
423
        diff_buffer = dlg._diff_view.buffer
411
424
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
412
 
                                    diff_buffer.get_end_iter()).splitlines(True)
 
425
                                    diff_buffer.get_end_iter(),
 
426
                                    True).splitlines(True)
413
427
 
414
428
        self.assertEqual("=== modified file 'a'\n", text[0])
415
429
        self.assertContainsRe(text[1],
460
474
        self.assertFalse(dlg._file_message_expander.get_expanded())
461
475
        self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
462
476
 
463
 
        dlg._treeview_files.set_cursor((1,))
 
477
        dlg._treeview_files.set_cursor(
 
478
            Gtk.TreePath(path=1), None, False)
464
479
        self.assertEqual('Diff for a', dlg._diff_label.get_text())
465
480
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
466
 
                                    diff_buffer.get_end_iter()).splitlines(True)
 
481
                                    diff_buffer.get_end_iter(),
 
482
                                    True).splitlines(True)
467
483
        self.assertEqual("=== added file 'a'\n", text[0])
468
484
        self.assertContainsRe(text[1],
469
485
            r"--- a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
477
493
        self.assertTrue(dlg._file_message_expander.get_expanded())
478
494
        self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
479
495
 
480
 
        dlg._treeview_files.set_cursor((2,))
 
496
        dlg._treeview_files.set_cursor(
 
497
            Gtk.TreePath(path=2), None, False)
481
498
        self.assertEqual('Diff for b', dlg._diff_label.get_text())
482
499
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
483
 
                                    diff_buffer.get_end_iter()).splitlines(True)
 
500
                                    diff_buffer.get_end_iter(),
 
501
                                    True).splitlines(True)
484
502
        self.assertEqual("=== added file 'b'\n", text[0])
485
503
        self.assertContainsRe(text[1],
486
504
            r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
494
512
        self.assertTrue(dlg._file_message_expander.get_expanded())
495
513
        self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
496
514
 
497
 
        dlg._treeview_files.set_cursor((0,))
 
515
        dlg._treeview_files.set_cursor(
 
516
            Gtk.TreePath(path=0), None, False)
498
517
        self.assertEqual('Diff for All Files', dlg._diff_label.get_text())
499
518
        self.assertEqual('File commit message',
500
519
                         dlg._file_message_expander.get_label())
510
529
 
511
530
        def get_file_text():
512
531
            buf = dlg._file_message_text_view.get_buffer()
513
 
            return buf.get_text(buf.get_start_iter(), buf.get_end_iter())
 
532
            return buf.get_text(
 
533
                buf.get_start_iter(), buf.get_end_iter(), True)
514
534
 
515
535
        def get_saved_text(path):
516
536
            """Get the saved text for a given record."""
523
543
        self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
524
544
        self.assertEqual('', get_file_text())
525
545
 
526
 
        dlg._treeview_files.set_cursor((1,))
 
546
        dlg._treeview_files.set_cursor(
 
547
            Gtk.TreePath(path=1), None, False)
527
548
        self.assertEqual('Commit message for a',
528
549
                         dlg._file_message_expander.get_label())
529
550
        self.assertTrue(dlg._file_message_expander.get_expanded())
536
557
        # We should have updated the ListStore with the new file commit info
537
558
        self.assertEqual('Some text\nfor a\n', get_saved_text(1))
538
559
 
539
 
        dlg._treeview_files.set_cursor((2,))
 
560
        dlg._treeview_files.set_cursor(
 
561
            Gtk.TreePath(path=2), None, False)
540
562
        self.assertEqual('Commit message for b/',
541
563
                         dlg._file_message_expander.get_label())
542
564
        self.assertTrue(dlg._file_message_expander.get_expanded())
547
569
        dlg._set_file_commit_message('More text\nfor b\n')
548
570
        # Now switch back to 'a'. The message should be saved, and the buffer
549
571
        # should be updated with the other text
550
 
        dlg._treeview_files.set_cursor((1,))
 
572
        dlg._treeview_files.set_cursor(
 
573
            Gtk.TreePath(path=1), None, False)
551
574
        self.assertEqual('More text\nfor b\n', get_saved_text(2))
552
575
        self.assertEqual('Commit message for a',
553
576
                         dlg._file_message_expander.get_label())
573
596
        #       do with. So instead, we just call toggle directly, and assume
574
597
        #       that toggle is hooked in correctly
575
598
        # column = dlg._treeview_files.get_column(0)
576
 
        # renderer = column.get_cell_renderers()[0]
 
599
        # renderer = column.get_cells()[0]
577
600
 
578
601
        # Toggle a single entry should set just that entry to False
579
602
        dlg._toggle_commit(None, 1, dlg._files_store)
626
649
        dlg._commit_selected_radio.set_active(True)
627
650
        self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
628
651
 
629
 
        dlg._treeview_files.set_cursor((1,))
 
652
        dlg._treeview_files.set_cursor(
 
653
            Gtk.TreePath(path=1), None, False)
630
654
        dlg._set_file_commit_message('Test\nmessage\nfor a_file\n')
631
 
        dlg._treeview_files.set_cursor((2,))
 
655
        dlg._treeview_files.set_cursor(
 
656
            Gtk.TreePath(path=2), None, False)
632
657
        dlg._set_file_commit_message('message\nfor b_dir\n')
633
658
 
634
659
        self.assertEqual((['a_file', 'b_dir'],
644
669
                            'message':'message\nfor b_dir\n'},
645
670
                          ]), dlg._get_specific_files())
646
671
 
647
 
 
648
 
class TestCommitDialog_Commit(tests.TestCaseWithTransport):
649
 
    """Tests on the actual 'commit' button being pushed."""
 
672
    def test_specific_files_sanitizes_messages(self):
 
673
        tree = self.make_branch_and_tree('tree')
 
674
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
 
675
        self.build_tree(['tree/a_file', 'tree/b_dir/'])
 
676
        tree.add(['a_file', 'b_dir'], ['1a-id', '0b-id'])
 
677
 
 
678
        dlg = commit.CommitDialog(tree)
 
679
        dlg._commit_selected_radio.set_active(True)
 
680
        self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
 
681
 
 
682
        dlg._treeview_files.set_cursor(
 
683
            Gtk.TreePath(path=1), None, False)
 
684
        dlg._set_file_commit_message('Test\r\nmessage\rfor a_file\n')
 
685
        dlg._treeview_files.set_cursor(
 
686
            Gtk.TreePath(path=2), None, False)
 
687
        dlg._set_file_commit_message('message\r\nfor\nb_dir\r')
 
688
 
 
689
        self.assertEqual((['a_file', 'b_dir'],
 
690
                          [{'path':'a_file', 'file_id':'1a-id',
 
691
                            'message':'Test\nmessage\nfor a_file\n'},
 
692
                           {'path':'b_dir', 'file_id':'0b-id',
 
693
                            'message':'message\nfor\nb_dir\n'},
 
694
                          ]), dlg._get_specific_files())
 
695
 
 
696
 
 
697
class QuestionHelpers(object):
650
698
 
651
699
    def _set_question_yes(self, dlg):
652
700
        """Set the dialog to answer YES to any questions."""
653
701
        self.questions = []
654
 
        def _question_yes(*args):
 
702
        def _question_yes(*args, **kwargs):
655
703
            self.questions.append(args)
656
704
            self.questions.append('YES')
657
 
            return gtk.RESPONSE_YES
 
705
            return Gtk.ResponseType.YES
658
706
        dlg._question_dialog = _question_yes
659
707
 
660
708
    def _set_question_no(self, dlg):
661
709
        """Set the dialog to answer NO to any questions."""
662
710
        self.questions = []
663
 
        def _question_no(*args):
 
711
        def _question_no(*args, **kwargs):
664
712
            self.questions.append(args)
665
713
            self.questions.append('NO')
666
 
            return gtk.RESPONSE_NO
 
714
            return Gtk.ResponseType.NO
667
715
        dlg._question_dialog = _question_no
668
716
 
 
717
 
 
718
class TestCommitDialog_Commit(tests.TestCaseWithTransport, QuestionHelpers):
 
719
    """Tests on the actual 'commit' button being pushed."""
 
720
 
669
721
    def test_bound_commit_local(self):
670
722
        tree = self.make_branch_and_tree('tree')
671
723
        self.build_tree(['tree/a'])
687
739
        self.assertEqual(last_rev, dlg.committed_revision_id)
688
740
        self.assertEqual(rev_id1, tree.branch.last_revision())
689
741
 
 
742
    def test_commit_global_sanitizes_message(self):
 
743
        tree = self.make_branch_and_tree('tree')
 
744
        self.build_tree(['tree/a'])
 
745
        tree.add(['a'], ['a-id'])
 
746
        rev_id1 = tree.commit('one')
 
747
 
 
748
        self.build_tree(['tree/b'])
 
749
        tree.add(['b'], ['b-id'])
 
750
        dlg = commit.CommitDialog(tree)
 
751
        # With the check box set, it should only effect the local branch
 
752
        dlg._set_global_commit_message('Commit\r\nmessage\rfoo\n')
 
753
        dlg._do_commit()
 
754
        rev = tree.branch.repository.get_revision(tree.last_revision())
 
755
        self.assertEqual('Commit\nmessage\nfoo\n', rev.message)
 
756
 
690
757
    def test_bound_commit_both(self):
691
758
        tree = self.make_branch_and_tree('tree')
692
759
        self.build_tree(['tree/a'])
708
775
        self.assertEqual(last_rev, dlg.committed_revision_id)
709
776
        self.assertEqual(last_rev, tree.branch.last_revision())
710
777
 
711
 
    def test_commit_no_message(self):
 
778
    def test_commit_empty_message(self):
712
779
        tree = self.make_branch_and_tree('tree')
713
780
        self.build_tree(['tree/a', 'tree/b'])
714
781
        tree.add(['a'], ['a-id'])
929
996
 
930
997
        dlg = commit.CommitDialog(tree)
931
998
        dlg._commit_selected_radio.set_active(True) # enable partial
932
 
        dlg._treeview_files.set_cursor((1,))
 
999
        dlg._treeview_files.set_cursor(
 
1000
            Gtk.TreePath(path=1), None, False)
933
1001
        dlg._set_file_commit_message('Message for A\n')
934
 
        dlg._treeview_files.set_cursor((2,))
 
1002
        dlg._treeview_files.set_cursor(
 
1003
            Gtk.TreePath(path=2), None, False)
935
1004
        dlg._set_file_commit_message('Message for B\n')
936
1005
        dlg._toggle_commit(None, 2, dlg._files_store) # unset 'b'
937
1006
        dlg._set_global_commit_message('Commit just "a"')
943
1012
        rev = tree.branch.repository.get_revision(rev_id2)
944
1013
        self.assertEqual('Commit just "a"', rev.message)
945
1014
        file_info = rev.properties['file-info']
946
 
        self.assertEqual('ld7:file_id4:a-id'
947
 
                           '7:message14:Message for A\n'
948
 
                           '4:path1:a'
949
 
                         'ee', file_info)
 
1015
        self.assertEqual(u'ld7:file_id4:a-id'
 
1016
                         '7:message14:Message for A\n'
 
1017
                         '4:path1:a'
 
1018
                         'ee',
 
1019
                         file_info)
950
1020
        self.assertEqual([{'path':'a', 'file_id':'a-id',
951
 
                           'message':'Message for A\n'},
952
 
                         ], bencode.bdecode(file_info))
 
1021
                           'message':'Message for A\n'},],
 
1022
                         bencode.bdecode(file_info.encode('UTF-8')))
953
1023
 
954
1024
    def test_commit_messages_after_merge(self):
955
1025
        tree = self.make_branch_and_tree('tree')
963
1033
        tree.merge_from_branch(tree2.branch)
964
1034
 
965
1035
        dlg = commit.CommitDialog(tree)
966
 
        dlg._treeview_files.set_cursor((1,)) # 'a'
 
1036
        dlg._treeview_files.set_cursor(
 
1037
            Gtk.TreePath(path=1), None, False) # 'a'
967
1038
        dlg._set_file_commit_message('Message for A\n')
968
1039
        # No message for 'B'
969
1040
        dlg._set_global_commit_message('Merging from "tree2"\n')
976
1047
        self.assertEqual('Merging from "tree2"\n', rev.message)
977
1048
        self.assertEqual([rev_id1, rev_id2], rev.parent_ids)
978
1049
        file_info = rev.properties['file-info']
979
 
        self.assertEqual('ld7:file_id4:a-id'
980
 
                           '7:message14:Message for A\n'
981
 
                           '4:path1:a'
982
 
                         'ee', file_info)
 
1050
        self.assertEqual(u'ld7:file_id4:a-id'
 
1051
                         '7:message14:Message for A\n'
 
1052
                         '4:path1:a'
 
1053
                         'ee',
 
1054
                         file_info)
983
1055
        self.assertEqual([{'path':'a', 'file_id':'a-id',
984
 
                           'message':'Message for A\n'},
985
 
                         ], bencode.bdecode(file_info))
 
1056
                           'message':'Message for A\n'},],
 
1057
                         bencode.bdecode(file_info.encode('UTF-8')))
986
1058
 
987
1059
    def test_commit_unicode_messages(self):
988
 
        self.requireFeature(tests.UnicodeFilenameFeature)
 
1060
        self.requireFeature(UnicodeFilenameFeature)
989
1061
 
990
1062
        tree = self.make_branch_and_tree('tree')
991
1063
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
993
1065
        tree.add(['a', u'\u03a9'], ['a-id', 'omega-id'])
994
1066
 
995
1067
        dlg = commit.CommitDialog(tree)
996
 
        dlg._treeview_files.set_cursor((1,)) # 'a'
 
1068
        dlg._treeview_files.set_cursor(
 
1069
            Gtk.TreePath(path=1), None, False) # 'a'
997
1070
        dlg._set_file_commit_message(u'Test \xfan\xecc\xf6de\n')
998
 
        dlg._treeview_files.set_cursor((2,)) # omega
 
1071
        dlg._treeview_files.set_cursor(
 
1072
            Gtk.TreePath(path=2), None, False) # omega
999
1073
        dlg._set_file_commit_message(u'\u03a9 is the end of all things.\n')
1000
1074
        dlg._set_global_commit_message(u'\u03a9 and \xfan\xecc\xf6de\n')
1001
1075
 
1030
1104
                          {'path':u'\u03a9', 'file_id':'omega-id',
1031
1105
                           'message':u'\u03a9 is the end of all things.\n'},
1032
1106
                         ], file_info_decoded)
 
1107
 
 
1108
 
 
1109
class TestSanitizeMessage(tests.TestCase):
 
1110
 
 
1111
    def assertSanitize(self, expected, original):
 
1112
        self.assertEqual(expected,
 
1113
                         commit._sanitize_and_decode_message(original))
 
1114
 
 
1115
    def test_untouched(self):
 
1116
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\nbar\nbaz\n')
 
1117
 
 
1118
    def test_converts_cr_to_lf(self):
 
1119
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\rbar\rbaz\r')
 
1120
 
 
1121
    def test_converts_crlf_to_lf(self):
 
1122
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\r\nbaz\r\n')
 
1123
 
 
1124
    def test_converts_mixed_to_lf(self):
 
1125
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\rbaz\n')
 
1126
 
 
1127
 
 
1128
class TestSavedCommitMessages(tests.TestCaseWithTransport):
 
1129
 
 
1130
    def setUp(self):
 
1131
        super(TestSavedCommitMessages, self).setUp()
 
1132
        # Install our hook
 
1133
        branch.Branch.hooks.install_named_hook(
 
1134
            'post_uncommit', commitmsgs.save_commit_messages, None)
 
1135
 
 
1136
    def _get_file_info_dict(self, rank):
 
1137
        file_info = [dict(path='a', file_id='a-id', message='a msg %d' % rank),
 
1138
                     dict(path='b', file_id='b-id', message='b msg %d' % rank)]
 
1139
        return file_info
 
1140
 
 
1141
    def _get_file_info_revprops(self, rank):
 
1142
        file_info_prop = self._get_file_info_dict(rank)
 
1143
        return {'file-info': bencode.bencode(file_info_prop).decode('UTF-8')}
 
1144
 
 
1145
    def _get_commit_message(self):
 
1146
        return self.config.get_user_option('gtk_global_commit_message')
 
1147
 
 
1148
    def _get_file_commit_messages(self):
 
1149
        return self.config.get_user_option('gtk_file_commit_messages')
 
1150
 
 
1151
 
 
1152
class TestUncommitHook(TestSavedCommitMessages):
 
1153
 
 
1154
    def setUp(self):
 
1155
        super(TestUncommitHook, self).setUp()
 
1156
        self.tree = self.make_branch_and_tree('tree')
 
1157
        self.config = self.tree.branch.get_config()
 
1158
        self.build_tree(['tree/a', 'tree/b'])
 
1159
        self.tree.add(['a'], ['a-id'])
 
1160
        self.tree.add(['b'], ['b-id'])
 
1161
        rev1 = self.tree.commit('one', rev_id='one-id',
 
1162
                                revprops=self._get_file_info_revprops(1))
 
1163
        rev2 = self.tree.commit('two', rev_id='two-id',
 
1164
                                revprops=self._get_file_info_revprops(2))
 
1165
        rev3 = self.tree.commit('three', rev_id='three-id',
 
1166
                                revprops=self._get_file_info_revprops(3))
 
1167
 
 
1168
    def test_uncommit_one_by_one(self):
 
1169
        uncommit.uncommit(self.tree.branch, tree=self.tree)
 
1170
        self.assertEquals(u'three', self._get_commit_message())
 
1171
        self.assertEquals(u'd4:a-id7:a msg 34:b-id7:b msg 3e',
 
1172
                          self._get_file_commit_messages())
 
1173
 
 
1174
        uncommit.uncommit(self.tree.branch, tree=self.tree)
 
1175
        self.assertEquals(u'two\n******\nthree', self._get_commit_message())
 
1176
        self.assertEquals(u'd4:a-id22:a msg 2\n******\na msg 3'
 
1177
                          '4:b-id22:b msg 2\n******\nb msg 3e',
 
1178
                          self._get_file_commit_messages())
 
1179
 
 
1180
        uncommit.uncommit(self.tree.branch, tree=self.tree)
 
1181
        self.assertEquals(u'one\n******\ntwo\n******\nthree',
 
1182
                          self._get_commit_message())
 
1183
        self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
 
1184
                          '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
 
1185
                          self._get_file_commit_messages())
 
1186
 
 
1187
    def test_uncommit_all_at_once(self):
 
1188
        uncommit.uncommit(self.tree.branch, tree=self.tree, revno=1)
 
1189
        self.assertEquals(u'one\n******\ntwo\n******\nthree',
 
1190
                          self._get_commit_message())
 
1191
        self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
 
1192
                          '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
 
1193
                          self._get_file_commit_messages())
 
1194
 
 
1195
 
 
1196
class TestReusingSavedCommitMessages(TestSavedCommitMessages, QuestionHelpers):
 
1197
 
 
1198
    def setUp(self):
 
1199
        super(TestReusingSavedCommitMessages, self).setUp()
 
1200
        self.tree = self.make_branch_and_tree('tree')
 
1201
        self.config = self.tree.branch.get_config()
 
1202
        self.config.set_user_option('per_file_commits', 'true')
 
1203
        self.build_tree(['tree/a', 'tree/b'])
 
1204
        self.tree.add(['a'], ['a-id'])
 
1205
        self.tree.add(['b'], ['b-id'])
 
1206
        rev1 = self.tree.commit('one', revprops=self._get_file_info_revprops(1))
 
1207
        rev2 = self.tree.commit('two', revprops=self._get_file_info_revprops(2))
 
1208
        uncommit.uncommit(self.tree.branch, tree=self.tree)
 
1209
        self.build_tree_contents([('tree/a', 'new a content\n'),
 
1210
                                  ('tree/b', 'new b content'),])
 
1211
 
 
1212
    def _get_commit_dialog(self, tree):
 
1213
        # Ensure we will never use a dialog that can actually prompt the user
 
1214
        # during the test suite. Test *can* and *should* override with the
 
1215
        # correct question dialog type.
 
1216
        dlg = commit.CommitDialog(tree)
 
1217
        self._set_question_no(dlg)
 
1218
        return dlg
 
1219
 
 
1220
    def test_setup_saved_messages(self):
 
1221
        # Check the initial setup
 
1222
        self.assertEquals(u'two', self._get_commit_message())
 
1223
        self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
 
1224
                          self._get_file_commit_messages())
 
1225
 
 
1226
    def test_messages_are_reloaded(self):
 
1227
        dlg = self._get_commit_dialog(self.tree)
 
1228
        self.assertEquals(u'two', dlg._get_global_commit_message())
 
1229
        self.assertEquals(([u'a', u'b'],
 
1230
                           [{ 'path': 'a',
 
1231
                             'file_id': 'a-id', 'message': 'a msg 2',},
 
1232
                           {'path': 'b',
 
1233
                            'file_id': 'b-id', 'message': 'b msg 2',}],),
 
1234
                          dlg._get_specific_files())
 
1235
 
 
1236
    def test_messages_are_consumed(self):
 
1237
        dlg = self._get_commit_dialog(self.tree)
 
1238
        dlg._do_commit()
 
1239
        self.assertEquals(u'', self._get_commit_message())
 
1240
        self.assertEquals(u'de', self._get_file_commit_messages())
 
1241
 
 
1242
    def test_messages_are_saved_on_cancel_if_required(self):
 
1243
        dlg = self._get_commit_dialog(self.tree)
 
1244
        self._set_question_yes(dlg) # Save messages
 
1245
        dlg._do_cancel()
 
1246
        self.assertEquals(u'two', self._get_commit_message())
 
1247
        self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
 
1248
                          self._get_file_commit_messages())
 
1249
 
 
1250
    def test_messages_are_cleared_on_cancel_if_required(self):
 
1251
        dlg = self._get_commit_dialog(self.tree)
 
1252
        self._set_question_no(dlg) # Don't save messages
 
1253
        dlg._do_cancel()
 
1254
        self.assertEquals(u'', self._get_commit_message())
 
1255
        self.assertEquals(u'de',
 
1256
                          self._get_file_commit_messages())