/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: Curtis Hovey
  • Date: 2011-07-31 15:52:43 UTC
  • mto: This revision was merged to the branch mainline in revision 741.
  • Revision ID: sinzui.is@verizon.net-20110731155243-ln8istmxbryhb4pz
Mechanical changes made by pygi.convert.sh.

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