/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: 2008-06-29 19:07:23 UTC
  • mto: This revision was merged to the branch mainline in revision 515.
  • Revision ID: jelmer@samba.org-20080629190723-l8mzg9x4oec0lhsl
Return cleartext from seahorse module

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
18
18
 
19
19
import os
20
20
 
21
 
from gi.repository import Gtk
 
21
import gtk
22
22
 
23
23
from bzrlib import (
24
 
    branch,
25
24
    tests,
26
 
    uncommit,
 
25
    revision,
27
26
    )
28
 
try:
29
 
    from bzrlib import bencode
30
 
except ImportError:
31
 
    from bzrlib.util import bencode
 
27
from bzrlib.util import bencode
32
28
 
33
29
from bzrlib.plugins.gtk import commit
34
30
 
90
86
        rev_id4 = tree3.commit('four')
91
87
        rev_id5 = tree3.commit('five')
92
88
        tree.merge_from_branch(tree2.branch)
93
 
        tree.merge_from_branch(tree3.branch, force=True)
 
89
        tree.merge_from_branch(tree3.branch)
94
90
        self.assertEqual([rev_id1, rev_id3, rev_id5], tree.get_parent_ids())
95
91
 
96
92
        pending_revisions = commit.pending_revisions(tree)
270
266
                               committer='Jerry Foo <jerry@foo.com>',
271
267
                               timestamp=1191372278.05,
272
268
                               timezone=+7200)
273
 
        tree.merge_from_branch(tree3.branch, force=True)
 
269
        tree.merge_from_branch(tree3.branch)
274
270
 
275
271
        dlg = commit.CommitDialog(tree)
276
272
        # TODO: assert that the pending box is set to show
413
409
        dlg = commit.CommitDialog(tree)
414
410
        diff_buffer = dlg._diff_view.buffer
415
411
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
416
 
                                    diff_buffer.get_end_iter(),
417
 
                                    True).splitlines(True)
 
412
                                    diff_buffer.get_end_iter()).splitlines(True)
418
413
 
419
414
        self.assertEqual("=== modified file 'a'\n", text[0])
420
415
        self.assertContainsRe(text[1],
468
463
        dlg._treeview_files.set_cursor((1,))
469
464
        self.assertEqual('Diff for a', dlg._diff_label.get_text())
470
465
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
471
 
                                    diff_buffer.get_end_iter(),
472
 
                                    True).splitlines(True)
 
466
                                    diff_buffer.get_end_iter()).splitlines(True)
473
467
        self.assertEqual("=== added file 'a'\n", text[0])
474
468
        self.assertContainsRe(text[1],
475
469
            r"--- a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
486
480
        dlg._treeview_files.set_cursor((2,))
487
481
        self.assertEqual('Diff for b', dlg._diff_label.get_text())
488
482
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
489
 
                                    diff_buffer.get_end_iter(),
490
 
                                    True).splitlines(True)
 
483
                                    diff_buffer.get_end_iter()).splitlines(True)
491
484
        self.assertEqual("=== added file 'b'\n", text[0])
492
485
        self.assertContainsRe(text[1],
493
486
            r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
517
510
 
518
511
        def get_file_text():
519
512
            buf = dlg._file_message_text_view.get_buffer()
520
 
            return buf.get_text(
521
 
                buf.get_start_iter(), buf.get_end_iter(), True)
 
513
            return buf.get_text(buf.get_start_iter(), buf.get_end_iter())
522
514
 
523
515
        def get_saved_text(path):
524
516
            """Get the saved text for a given record."""
652
644
                            'message':'message\nfor b_dir\n'},
653
645
                          ]), dlg._get_specific_files())
654
646
 
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):
 
647
 
 
648
class TestCommitDialog_Commit(tests.TestCaseWithTransport):
 
649
    """Tests on the actual 'commit' button being pushed."""
679
650
 
680
651
    def _set_question_yes(self, dlg):
681
652
        """Set the dialog to answer YES to any questions."""
682
653
        self.questions = []
683
 
        def _question_yes(*args, **kwargs):
 
654
        def _question_yes(*args):
684
655
            self.questions.append(args)
685
656
            self.questions.append('YES')
686
 
            return Gtk.ResponseType.YES
 
657
            return gtk.RESPONSE_YES
687
658
        dlg._question_dialog = _question_yes
688
659
 
689
660
    def _set_question_no(self, dlg):
690
661
        """Set the dialog to answer NO to any questions."""
691
662
        self.questions = []
692
 
        def _question_no(*args, **kwargs):
 
663
        def _question_no(*args):
693
664
            self.questions.append(args)
694
665
            self.questions.append('NO')
695
 
            return Gtk.ResponseType.NO
 
666
            return gtk.RESPONSE_NO
696
667
        dlg._question_dialog = _question_no
697
668
 
698
 
 
699
 
class TestCommitDialog_Commit(tests.TestCaseWithTransport, QuestionHelpers):
700
 
    """Tests on the actual 'commit' button being pushed."""
701
 
 
702
669
    def test_bound_commit_local(self):
703
670
        tree = self.make_branch_and_tree('tree')
704
671
        self.build_tree(['tree/a'])
720
687
        self.assertEqual(last_rev, dlg.committed_revision_id)
721
688
        self.assertEqual(rev_id1, tree.branch.last_revision())
722
689
 
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
 
 
738
690
    def test_bound_commit_both(self):
739
691
        tree = self.make_branch_and_tree('tree')
740
692
        self.build_tree(['tree/a'])
756
708
        self.assertEqual(last_rev, dlg.committed_revision_id)
757
709
        self.assertEqual(last_rev, tree.branch.last_revision())
758
710
 
759
 
    def test_commit_empty_message(self):
 
711
    def test_commit_no_message(self):
760
712
        tree = self.make_branch_and_tree('tree')
761
713
        self.build_tree(['tree/a', 'tree/b'])
762
714
        tree.add(['a'], ['a-id'])
991
943
        rev = tree.branch.repository.get_revision(rev_id2)
992
944
        self.assertEqual('Commit just "a"', rev.message)
993
945
        file_info = rev.properties['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)
 
946
        self.assertEqual('ld7:file_id4:a-id'
 
947
                           '7:message14:Message for A\n'
 
948
                           '4:path1:a'
 
949
                         'ee', file_info)
999
950
        self.assertEqual([{'path':'a', 'file_id':'a-id',
1000
 
                           'message':'Message for A\n'},],
1001
 
                         bencode.bdecode(file_info.encode('UTF-8')))
 
951
                           'message':'Message for A\n'},
 
952
                         ], bencode.bdecode(file_info))
1002
953
 
1003
954
    def test_commit_messages_after_merge(self):
1004
955
        tree = self.make_branch_and_tree('tree')
1025
976
        self.assertEqual('Merging from "tree2"\n', rev.message)
1026
977
        self.assertEqual([rev_id1, rev_id2], rev.parent_ids)
1027
978
        file_info = rev.properties['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)
 
979
        self.assertEqual('ld7:file_id4:a-id'
 
980
                           '7:message14:Message for A\n'
 
981
                           '4:path1:a'
 
982
                         'ee', file_info)
1033
983
        self.assertEqual([{'path':'a', 'file_id':'a-id',
1034
 
                           'message':'Message for A\n'},],
1035
 
                         bencode.bdecode(file_info.encode('UTF-8')))
 
984
                           'message':'Message for A\n'},
 
985
                         ], bencode.bdecode(file_info))
1036
986
 
1037
987
    def test_commit_unicode_messages(self):
1038
988
        self.requireFeature(tests.UnicodeFilenameFeature)
1080
1030
                          {'path':u'\u03a9', 'file_id':'omega-id',
1081
1031
                           'message':u'\u03a9 is the end of all things.\n'},
1082
1032
                         ], 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())