/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-08-13 01:12:20 UTC
  • mto: This revision was merged to the branch mainline in revision 741.
  • Revision ID: sinzui.is@verizon.net-20110813011220-qj1u0dvft7jk0x6m
Updated gpush to gtk3.

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
409
413
        dlg = commit.CommitDialog(tree)
410
414
        diff_buffer = dlg._diff_view.buffer
411
415
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
412
 
                                    diff_buffer.get_end_iter()).splitlines(True)
 
416
                                    diff_buffer.get_end_iter(),
 
417
                                    True).splitlines(True)
413
418
 
414
419
        self.assertEqual("=== modified file 'a'\n", text[0])
415
420
        self.assertContainsRe(text[1],
463
468
        dlg._treeview_files.set_cursor((1,))
464
469
        self.assertEqual('Diff for a', dlg._diff_label.get_text())
465
470
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
466
 
                                    diff_buffer.get_end_iter()).splitlines(True)
 
471
                                    diff_buffer.get_end_iter(),
 
472
                                    True).splitlines(True)
467
473
        self.assertEqual("=== added file 'a'\n", text[0])
468
474
        self.assertContainsRe(text[1],
469
475
            r"--- a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
480
486
        dlg._treeview_files.set_cursor((2,))
481
487
        self.assertEqual('Diff for b', dlg._diff_label.get_text())
482
488
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
483
 
                                    diff_buffer.get_end_iter()).splitlines(True)
 
489
                                    diff_buffer.get_end_iter(),
 
490
                                    True).splitlines(True)
484
491
        self.assertEqual("=== added file 'b'\n", text[0])
485
492
        self.assertContainsRe(text[1],
486
493
            r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
510
517
 
511
518
        def get_file_text():
512
519
            buf = dlg._file_message_text_view.get_buffer()
513
 
            return buf.get_text(buf.get_start_iter(), buf.get_end_iter())
 
520
            return buf.get_text(
 
521
                buf.get_start_iter(), buf.get_end_iter(), True)
514
522
 
515
523
        def get_saved_text(path):
516
524
            """Get the saved text for a given record."""
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
 
            return gtk.RESPONSE_YES
 
686
            return Gtk.ResponseType.YES
658
687
        dlg._question_dialog = _question_yes
659
688
 
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
 
            return gtk.RESPONSE_NO
 
695
            return Gtk.ResponseType.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
1038
        self.requireFeature(tests.UnicodeFilenameFeature)
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())