/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: Mikkel Kamstrup Erlandsen
  • Date: 2011-09-28 07:45:39 UTC
  • mto: This revision was merged to the branch mainline in revision 740.
  • Revision ID: mikkel.kamstrup@gmail.com-20110928074539-qxl1yn1bkjel6ir0
Add X-GNOME-Autostart-Delay=30 to bzr-notify.desktop

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
21
21
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
37
from bzrlib.plugins.gtk import commit
30
38
 
86
94
        rev_id4 = tree3.commit('four')
87
95
        rev_id5 = tree3.commit('five')
88
96
        tree.merge_from_branch(tree2.branch)
89
 
        tree.merge_from_branch(tree3.branch)
 
97
        tree.merge_from_branch(tree3.branch, force=True)
90
98
        self.assertEqual([rev_id1, rev_id3, rev_id5], tree.get_parent_ids())
91
99
 
92
100
        pending_revisions = commit.pending_revisions(tree)
266
274
                               committer='Jerry Foo <jerry@foo.com>',
267
275
                               timestamp=1191372278.05,
268
276
                               timezone=+7200)
269
 
        tree.merge_from_branch(tree3.branch)
 
277
        tree.merge_from_branch(tree3.branch, force=True)
270
278
 
271
279
        dlg = commit.CommitDialog(tree)
272
280
        # TODO: assert that the pending box is set to show
644
652
                            'message':'message\nfor b_dir\n'},
645
653
                          ]), dlg._get_specific_files())
646
654
 
647
 
 
648
 
class TestCommitDialog_Commit(tests.TestCaseWithTransport):
649
 
    """Tests on the actual 'commit' button being pushed."""
 
655
    def test_specific_files_sanitizes_messages(self):
 
656
        tree = self.make_branch_and_tree('tree')
 
657
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
 
658
        self.build_tree(['tree/a_file', 'tree/b_dir/'])
 
659
        tree.add(['a_file', 'b_dir'], ['1a-id', '0b-id'])
 
660
 
 
661
        dlg = commit.CommitDialog(tree)
 
662
        dlg._commit_selected_radio.set_active(True)
 
663
        self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
 
664
 
 
665
        dlg._treeview_files.set_cursor((1,))
 
666
        dlg._set_file_commit_message('Test\r\nmessage\rfor a_file\n')
 
667
        dlg._treeview_files.set_cursor((2,))
 
668
        dlg._set_file_commit_message('message\r\nfor\nb_dir\r')
 
669
 
 
670
        self.assertEqual((['a_file', 'b_dir'],
 
671
                          [{'path':'a_file', 'file_id':'1a-id',
 
672
                            'message':'Test\nmessage\nfor a_file\n'},
 
673
                           {'path':'b_dir', 'file_id':'0b-id',
 
674
                            'message':'message\nfor\nb_dir\n'},
 
675
                          ]), dlg._get_specific_files())
 
676
 
 
677
 
 
678
class QuestionHelpers(object):
650
679
 
651
680
    def _set_question_yes(self, dlg):
652
681
        """Set the dialog to answer YES to any questions."""
653
682
        self.questions = []
654
 
        def _question_yes(*args):
 
683
        def _question_yes(*args, **kwargs):
655
684
            self.questions.append(args)
656
685
            self.questions.append('YES')
657
686
            return gtk.RESPONSE_YES
660
689
    def _set_question_no(self, dlg):
661
690
        """Set the dialog to answer NO to any questions."""
662
691
        self.questions = []
663
 
        def _question_no(*args):
 
692
        def _question_no(*args, **kwargs):
664
693
            self.questions.append(args)
665
694
            self.questions.append('NO')
666
695
            return gtk.RESPONSE_NO
667
696
        dlg._question_dialog = _question_no
668
697
 
 
698
 
 
699
class TestCommitDialog_Commit(tests.TestCaseWithTransport, QuestionHelpers):
 
700
    """Tests on the actual 'commit' button being pushed."""
 
701
 
669
702
    def test_bound_commit_local(self):
670
703
        tree = self.make_branch_and_tree('tree')
671
704
        self.build_tree(['tree/a'])
687
720
        self.assertEqual(last_rev, dlg.committed_revision_id)
688
721
        self.assertEqual(rev_id1, tree.branch.last_revision())
689
722
 
 
723
    def test_commit_global_sanitizes_message(self):
 
724
        tree = self.make_branch_and_tree('tree')
 
725
        self.build_tree(['tree/a'])
 
726
        tree.add(['a'], ['a-id'])
 
727
        rev_id1 = tree.commit('one')
 
728
 
 
729
        self.build_tree(['tree/b'])
 
730
        tree.add(['b'], ['b-id'])
 
731
        dlg = commit.CommitDialog(tree)
 
732
        # With the check box set, it should only effect the local branch
 
733
        dlg._set_global_commit_message('Commit\r\nmessage\rfoo\n')
 
734
        dlg._do_commit()
 
735
        rev = tree.branch.repository.get_revision(tree.last_revision())
 
736
        self.assertEqual('Commit\nmessage\nfoo\n', rev.message)
 
737
 
690
738
    def test_bound_commit_both(self):
691
739
        tree = self.make_branch_and_tree('tree')
692
740
        self.build_tree(['tree/a'])
708
756
        self.assertEqual(last_rev, dlg.committed_revision_id)
709
757
        self.assertEqual(last_rev, tree.branch.last_revision())
710
758
 
711
 
    def test_commit_no_message(self):
 
759
    def test_commit_empty_message(self):
712
760
        tree = self.make_branch_and_tree('tree')
713
761
        self.build_tree(['tree/a', 'tree/b'])
714
762
        tree.add(['a'], ['a-id'])
943
991
        rev = tree.branch.repository.get_revision(rev_id2)
944
992
        self.assertEqual('Commit just "a"', rev.message)
945
993
        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)
 
994
        self.assertEqual(u'ld7:file_id4:a-id'
 
995
                         '7:message14:Message for A\n'
 
996
                         '4:path1:a'
 
997
                         'ee',
 
998
                         file_info)
950
999
        self.assertEqual([{'path':'a', 'file_id':'a-id',
951
 
                           'message':'Message for A\n'},
952
 
                         ], bencode.bdecode(file_info))
 
1000
                           'message':'Message for A\n'},],
 
1001
                         bencode.bdecode(file_info.encode('UTF-8')))
953
1002
 
954
1003
    def test_commit_messages_after_merge(self):
955
1004
        tree = self.make_branch_and_tree('tree')
976
1025
        self.assertEqual('Merging from "tree2"\n', rev.message)
977
1026
        self.assertEqual([rev_id1, rev_id2], rev.parent_ids)
978
1027
        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)
 
1028
        self.assertEqual(u'ld7:file_id4:a-id'
 
1029
                         '7:message14:Message for A\n'
 
1030
                         '4:path1:a'
 
1031
                         'ee',
 
1032
                         file_info)
983
1033
        self.assertEqual([{'path':'a', 'file_id':'a-id',
984
 
                           'message':'Message for A\n'},
985
 
                         ], bencode.bdecode(file_info))
 
1034
                           'message':'Message for A\n'},],
 
1035
                         bencode.bdecode(file_info.encode('UTF-8')))
986
1036
 
987
1037
    def test_commit_unicode_messages(self):
988
 
        self.requireFeature(tests.UnicodeFilenameFeature)
 
1038
        self.requireFeature(UnicodeFilenameFeature)
989
1039
 
990
1040
        tree = self.make_branch_and_tree('tree')
991
1041
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
1030
1080
                          {'path':u'\u03a9', 'file_id':'omega-id',
1031
1081
                           'message':u'\u03a9 is the end of all things.\n'},
1032
1082
                         ], file_info_decoded)
 
1083
 
 
1084
 
 
1085
class TestSanitizeMessage(tests.TestCase):
 
1086
 
 
1087
    def assertSanitize(self, expected, original):
 
1088
        self.assertEqual(expected,
 
1089
                         commit._sanitize_and_decode_message(original))
 
1090
 
 
1091
    def test_untouched(self):
 
1092
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\nbar\nbaz\n')
 
1093
 
 
1094
    def test_converts_cr_to_lf(self):
 
1095
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\rbar\rbaz\r')
 
1096
 
 
1097
    def test_converts_crlf_to_lf(self):
 
1098
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\r\nbaz\r\n')
 
1099
 
 
1100
    def test_converts_mixed_to_lf(self):
 
1101
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\rbaz\n')
 
1102
 
 
1103
 
 
1104
class TestSavedCommitMessages(tests.TestCaseWithTransport):
 
1105
 
 
1106
    def setUp(self):
 
1107
        super(TestSavedCommitMessages, self).setUp()
 
1108
        # Install our hook
 
1109
        branch.Branch.hooks.install_named_hook(
 
1110
            'post_uncommit', commit.save_commit_messages, None)
 
1111
 
 
1112
    def _get_file_info_dict(self, rank):
 
1113
        file_info = [dict(path='a', file_id='a-id', message='a msg %d' % rank),
 
1114
                     dict(path='b', file_id='b-id', message='b msg %d' % rank)]
 
1115
        return file_info
 
1116
 
 
1117
    def _get_file_info_revprops(self, rank):
 
1118
        file_info_prop = self._get_file_info_dict(rank)
 
1119
        return {'file-info': bencode.bencode(file_info_prop).decode('UTF-8')}
 
1120
 
 
1121
    def _get_commit_message(self):
 
1122
        return self.config.get_user_option('gtk_global_commit_message')
 
1123
 
 
1124
    def _get_file_commit_messages(self):
 
1125
        return self.config.get_user_option('gtk_file_commit_messages')
 
1126
 
 
1127
 
 
1128
class TestUncommitHook(TestSavedCommitMessages):
 
1129
 
 
1130
    def setUp(self):
 
1131
        super(TestUncommitHook, self).setUp()
 
1132
        self.tree = self.make_branch_and_tree('tree')
 
1133
        self.config = self.tree.branch.get_config()
 
1134
        self.build_tree(['tree/a', 'tree/b'])
 
1135
        self.tree.add(['a'], ['a-id'])
 
1136
        self.tree.add(['b'], ['b-id'])
 
1137
        rev1 = self.tree.commit('one', rev_id='one-id',
 
1138
                                revprops=self._get_file_info_revprops(1))
 
1139
        rev2 = self.tree.commit('two', rev_id='two-id',
 
1140
                                revprops=self._get_file_info_revprops(2))
 
1141
        rev3 = self.tree.commit('three', rev_id='three-id',
 
1142
                                revprops=self._get_file_info_revprops(3))
 
1143
 
 
1144
    def test_uncommit_one_by_one(self):
 
1145
        uncommit.uncommit(self.tree.branch, tree=self.tree)
 
1146
        self.assertEquals(u'three', self._get_commit_message())
 
1147
        self.assertEquals(u'd4:a-id7:a msg 34:b-id7:b msg 3e',
 
1148
                          self._get_file_commit_messages())
 
1149
 
 
1150
        uncommit.uncommit(self.tree.branch, tree=self.tree)
 
1151
        self.assertEquals(u'two\n******\nthree', self._get_commit_message())
 
1152
        self.assertEquals(u'd4:a-id22:a msg 2\n******\na msg 3'
 
1153
                          '4:b-id22:b msg 2\n******\nb msg 3e',
 
1154
                          self._get_file_commit_messages())
 
1155
 
 
1156
        uncommit.uncommit(self.tree.branch, tree=self.tree)
 
1157
        self.assertEquals(u'one\n******\ntwo\n******\nthree',
 
1158
                          self._get_commit_message())
 
1159
        self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
 
1160
                          '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
 
1161
                          self._get_file_commit_messages())
 
1162
 
 
1163
    def test_uncommit_all_at_once(self):
 
1164
        uncommit.uncommit(self.tree.branch, tree=self.tree, revno=1)
 
1165
        self.assertEquals(u'one\n******\ntwo\n******\nthree',
 
1166
                          self._get_commit_message())
 
1167
        self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
 
1168
                          '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
 
1169
                          self._get_file_commit_messages())
 
1170
 
 
1171
 
 
1172
class TestReusingSavedCommitMessages(TestSavedCommitMessages, QuestionHelpers):
 
1173
 
 
1174
    def setUp(self):
 
1175
        super(TestReusingSavedCommitMessages, self).setUp()
 
1176
        self.tree = self.make_branch_and_tree('tree')
 
1177
        self.config = self.tree.branch.get_config()
 
1178
        self.config.set_user_option('per_file_commits', 'true')
 
1179
        self.build_tree(['tree/a', 'tree/b'])
 
1180
        self.tree.add(['a'], ['a-id'])
 
1181
        self.tree.add(['b'], ['b-id'])
 
1182
        rev1 = self.tree.commit('one', revprops=self._get_file_info_revprops(1))
 
1183
        rev2 = self.tree.commit('two', revprops=self._get_file_info_revprops(2))
 
1184
        uncommit.uncommit(self.tree.branch, tree=self.tree)
 
1185
        self.build_tree_contents([('tree/a', 'new a content\n'),
 
1186
                                  ('tree/b', 'new b content'),])
 
1187
 
 
1188
    def _get_commit_dialog(self, tree):
 
1189
        # Ensure we will never use a dialog that can actually prompt the user
 
1190
        # during the test suite. Test *can* and *should* override with the
 
1191
        # correct question dialog type.
 
1192
        dlg = commit.CommitDialog(tree)
 
1193
        self._set_question_no(dlg)
 
1194
        return dlg
 
1195
 
 
1196
    def test_setup_saved_messages(self):
 
1197
        # Check the initial setup
 
1198
        self.assertEquals(u'two', self._get_commit_message())
 
1199
        self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
 
1200
                          self._get_file_commit_messages())
 
1201
 
 
1202
    def test_messages_are_reloaded(self):
 
1203
        dlg = self._get_commit_dialog(self.tree)
 
1204
        self.assertEquals(u'two', dlg._get_global_commit_message())
 
1205
        self.assertEquals(([u'a', u'b'],
 
1206
                           [{ 'path': 'a',
 
1207
                             'file_id': 'a-id', 'message': 'a msg 2',},
 
1208
                           {'path': 'b',
 
1209
                            'file_id': 'b-id', 'message': 'b msg 2',}],),
 
1210
                          dlg._get_specific_files())
 
1211
 
 
1212
    def test_messages_are_consumed(self):
 
1213
        dlg = self._get_commit_dialog(self.tree)
 
1214
        dlg._do_commit()
 
1215
        self.assertEquals(u'', self._get_commit_message())
 
1216
        self.assertEquals(u'de', self._get_file_commit_messages())
 
1217
 
 
1218
    def test_messages_are_saved_on_cancel_if_required(self):
 
1219
        dlg = self._get_commit_dialog(self.tree)
 
1220
        self._set_question_yes(dlg) # Save messages
 
1221
        dlg._do_cancel()
 
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_cleared_on_cancel_if_required(self):
 
1227
        dlg = self._get_commit_dialog(self.tree)
 
1228
        self._set_question_no(dlg) # Don't save messages
 
1229
        dlg._do_cancel()
 
1230
        self.assertEquals(u'', self._get_commit_message())
 
1231
        self.assertEquals(u'de',
 
1232
                          self._get_file_commit_messages())