/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: John Arbash Meinel
  • Date: 2007-10-30 21:15:13 UTC
  • mfrom: (326 trunk)
  • mto: (330.3.3 trunk)
  • mto: This revision was merged to the branch mainline in revision 368.
  • Revision ID: john@arbash-meinel.com-20071030211513-l8ukdfa81g1y74mi
Merge the latest trunk 326

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
17
17
"""Test the Commit functionality."""
18
18
 
19
19
import os
20
 
import subprocess
21
 
from tempfile import NamedTemporaryFile
22
20
 
23
 
from gi.repository import Gtk
 
21
import gtk
24
22
 
25
23
from bzrlib import (
26
 
    branch,
27
24
    tests,
28
 
    uncommit,
 
25
    revision,
29
26
    )
30
 
try:
31
 
    from bzrlib.tests.features import UnicodeFilenameFeature
32
 
except ImportError: # bzr < 2.5
33
 
    from bzrlib.tests import UnicodeFilenameFeature
34
 
from bzrlib import bencode
 
27
from bzrlib.util import bencode
35
28
 
36
 
from bzrlib.plugins.gtk import (
37
 
    commit,
38
 
    commitmsgs,
39
 
    )
40
 
from bzrlib.plugins.gtk.commitmsgs import SavedCommitMessagesManager
41
 
from bzrlib.plugins.gtk.tests import MockMethod
 
29
from bzrlib.plugins.gtk import commit
42
30
 
43
31
 
44
32
# TODO: All we need is basic ancestry code to test this, we shouldn't need a
50
38
        tree = self.make_branch_and_tree('.')
51
39
        tree.commit('one')
52
40
 
53
 
        self.addCleanup(tree.lock_read().unlock)
54
 
        self.assertEquals([], list(commit.pending_revisions(tree)))
 
41
        self.assertIs(None, commit.pending_revisions(tree))
55
42
 
56
43
    def test_pending_revisions_simple(self):
57
44
        tree = self.make_branch_and_tree('tree')
61
48
        tree.merge_from_branch(tree2.branch)
62
49
        self.assertEqual([rev_id1, rev_id2], tree.get_parent_ids())
63
50
 
64
 
        self.addCleanup(tree.lock_read().unlock)
65
 
        pending_revisions = list(commit.pending_revisions(tree))
 
51
        pending_revisions = commit.pending_revisions(tree)
66
52
        # One primary merge
67
53
        self.assertEqual(1, len(pending_revisions))
68
54
        # Revision == rev_id2
80
66
        tree.merge_from_branch(tree2.branch)
81
67
        self.assertEqual([rev_id1, rev_id4], tree.get_parent_ids())
82
68
 
83
 
        self.addCleanup(tree.lock_read().unlock)
84
 
        pending_revisions = list(commit.pending_revisions(tree))
 
69
        pending_revisions = commit.pending_revisions(tree)
85
70
        # One primary merge
86
71
        self.assertEqual(1, len(pending_revisions))
87
72
        # Revision == rev_id2
96
81
        rev_id1 = tree.commit('one')
97
82
        tree2 = tree.bzrdir.sprout('tree2').open_workingtree()
98
83
        rev_id2 = tree2.commit('two')
 
84
        rev_id3 = tree2.commit('three')
99
85
        tree3 = tree2.bzrdir.sprout('tree3').open_workingtree()
100
 
        rev_id3 = tree2.commit('three')
101
86
        rev_id4 = tree3.commit('four')
102
87
        rev_id5 = tree3.commit('five')
103
88
        tree.merge_from_branch(tree2.branch)
104
 
        tree.merge_from_branch(tree3.branch, force=True)
 
89
        tree.merge_from_branch(tree3.branch)
105
90
        self.assertEqual([rev_id1, rev_id3, rev_id5], tree.get_parent_ids())
106
91
 
107
 
        self.addCleanup(tree.lock_read().unlock)
108
 
        pending_revisions = list(commit.pending_revisions(tree))
 
92
        pending_revisions = commit.pending_revisions(tree)
109
93
        # Two primary merges
110
94
        self.assertEqual(2, len(pending_revisions))
111
95
        # Revision == rev_id2
148
132
 
149
133
class TestCommitDialogSimple(tests.TestCaseWithTransport):
150
134
 
151
 
    def test_init(self):
152
 
        MockMethod.bind(self, CommitDialogNoWidgets, 'setup_params')
153
 
        MockMethod.bind(self, CommitDialogNoWidgets, 'construct')
154
 
        MockMethod.bind(self, CommitDialogNoWidgets, 'fill_in_data')
155
 
 
156
 
        tree = self.make_branch_and_tree('tree')
157
 
        rev_id = tree.commit('first')
158
 
        dlg = CommitDialogNoWidgets(tree)
159
 
        self.assertIs(tree, dlg._wt)
160
 
        self.assertIs(None, dlg._selected)
161
 
        self.assertTrue(dlg._enable_per_file_commits)
162
 
        self.assertTrue(dlg._commit_all_changes)
163
 
        self.assertIs(None, dlg.committed_revision_id)
164
 
        self.assertIs(None, dlg._last_selected_file)
165
 
        self.assertIsInstance(
166
 
            dlg._saved_commit_messages_manager, SavedCommitMessagesManager)
167
 
        self.assertTrue(CommitDialogNoWidgets.setup_params.called)
168
 
        self.assertTrue(CommitDialogNoWidgets.construct.called)
169
 
        self.assertTrue(CommitDialogNoWidgets.fill_in_data.called)
170
 
 
171
135
    def test_setup_parameters_no_pending(self):
172
136
        tree = self.make_branch_and_tree('tree')
173
137
        rev_id = tree.commit('first')
174
138
 
175
139
        dlg = CommitDialogNoWidgets(tree)
176
140
        self.assertEqual(rev_id, dlg._basis_tree.get_revision_id())
177
 
        self.assertEquals([], dlg._pending)
 
141
        self.assertIs(None, dlg._pending)
178
142
        self.assertFalse(dlg._is_checkout)
179
143
 
180
144
    def test_setup_parameters_checkout(self):
185
149
 
186
150
        dlg = CommitDialogNoWidgets(tree2)
187
151
        self.assertEqual(rev_id, dlg._basis_tree.get_revision_id())
188
 
        self.assertEquals([], dlg._pending)
 
152
        self.assertIs(None, dlg._pending)
189
153
        self.assertTrue(dlg._is_checkout)
190
154
 
191
155
    def test_setup_parameters_pending(self):
216
180
        self.assertEqual([], delta.removed)
217
181
        self.assertEqual([(u'a', 'a-id', 'file')], delta.added)
218
182
 
219
 
    def test_on_treeview_files_cursor_changed_no_selection(self):
220
 
        MockMethod.bind(self, CommitDialogNoWidgets, '_update_per_file_info')
221
 
        tree = self.make_branch_and_tree('tree')
222
 
        rev_id = tree.commit('first')
223
 
        dlg = CommitDialogNoWidgets(tree)
224
 
        treeview = Gtk.TreeView()
225
 
        dlg._on_treeview_files_cursor_changed(treeview)
226
 
        self.assertFalse(CommitDialogNoWidgets._update_per_file_info.called)
227
 
 
228
 
    def test_on_treeview_files_cursor_changed_with_destroyed_treeview(self):
229
 
        MockMethod.bind(self, CommitDialogNoWidgets, '_update_per_file_info')
230
 
        tree = self.make_branch_and_tree('tree')
231
 
        rev_id = tree.commit('first')
232
 
        dlg = CommitDialogNoWidgets(tree)
233
 
        treeview = Gtk.TreeView()
234
 
        treeview.destroy()
235
 
        dlg._on_treeview_files_cursor_changed(treeview)
236
 
        self.assertFalse(CommitDialogNoWidgets._update_per_file_info.called)
237
 
 
238
 
    def test_get_line_height(self):
239
 
        tree = self.make_branch_and_tree('tree')
240
 
        dlg = CommitDialogNoWidgets(tree)
241
 
        textview = Gtk.TextView()
242
 
        line_height = dlg.get_line_height(textview)
243
 
        self.assertIsInstance(line_height, int)
244
 
 
245
183
 
246
184
class TestCommitDialog(tests.TestCaseWithTransport):
247
185
 
269
207
 
270
208
        commit_col = dlg._treeview_files.get_column(0)
271
209
        self.assertEqual('Commit', commit_col.get_title())
272
 
        renderer = commit_col.get_cells()[0]
273
 
        self.assertTrue(renderer.get_property('activatable'))
274
 
 
275
 
        self.assertEqual('Commit all changes',
276
 
                         dlg._commit_all_files_radio.get_label())
277
 
        self.assertTrue(dlg._commit_all_files_radio.get_property('sensitive'))
278
 
        self.assertTrue(dlg._commit_selected_radio.get_property('sensitive'))
 
210
        renderer = commit_col.get_cell_renderers()[0]
 
211
        self.assertTrue(renderer.get_active())
279
212
 
280
213
    def test_pending(self):
281
214
        tree = self.make_branch_and_tree('tree')
294
227
 
295
228
        commit_col = dlg._treeview_files.get_column(0)
296
229
        self.assertEqual('Commit*', commit_col.get_title())
297
 
        renderer = commit_col.get_cells()[0]
298
 
        self.assertFalse(renderer.get_property('activatable'))
 
230
        renderer = commit_col.get_cell_renderers()[0]
 
231
        self.assertFalse(renderer.get_active())
299
232
 
300
233
        values = [(r[0], r[1], r[2], r[3]) for r in dlg._pending_store]
301
234
        self.assertEqual([(rev_id2, '2007-10-01', 'Joe Foo', 'two')], values)
302
235
 
303
 
        self.assertEqual('Commit all changes*',
304
 
                         dlg._commit_all_files_radio.get_label())
305
 
        self.assertFalse(dlg._commit_all_files_radio.get_property('sensitive'))
306
 
        self.assertFalse(dlg._commit_selected_radio.get_property('sensitive'))
307
 
 
308
236
    def test_pending_multiple(self):
309
237
        tree = self.make_branch_and_tree('tree')
310
238
        rev_id1 = tree.commit('one')
328
256
                               committer='Jerry Foo <jerry@foo.com>',
329
257
                               timestamp=1191372278.05,
330
258
                               timezone=+7200)
331
 
        tree.merge_from_branch(tree3.branch, force=True)
 
259
        tree.merge_from_branch(tree3.branch)
332
260
 
333
261
        dlg = commit.CommitDialog(tree)
334
262
        # TODO: assert that the pending box is set to show
346
274
 
347
275
        dlg = commit.CommitDialog(tree)
348
276
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
349
 
        self.assertEqual([("", "", True, 'All Files', ''),
 
277
        self.assertEqual([(None, None, True, 'All Files', ''),
350
278
                          ('a-id', 'a', True, 'a', 'added'),
351
279
                          ('b-id', 'b', True, 'b/', 'added'),
352
280
                          ('c-id', 'b/c', True, 'b/c', 'added'),
363
291
 
364
292
        dlg = commit.CommitDialog(tree)
365
293
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
366
 
        self.assertEqual([("", "", True, 'All Files', ''),
 
294
        self.assertEqual([(None, None, True, 'All Files', ''),
367
295
                          ('b-id', 'd', True, 'b/ => d/', 'renamed'),
368
296
                          ('a-id', 'd/a', True, 'a => d/a', 'renamed'),
369
297
                         ], values)
378
306
 
379
307
        dlg = commit.CommitDialog(tree)
380
308
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
381
 
        self.assertEqual([("", "", True, 'All Files', ''),
 
309
        self.assertEqual([(None, None, True, 'All Files', ''),
382
310
                          ('a-id', 'a', True, 'a', 'modified'),
383
311
                         ], values)
384
312
 
398
326
 
399
327
        dlg = commit.CommitDialog(tree)
400
328
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
401
 
        self.assertEqual([("", "", True, 'All Files', ''),
 
329
        self.assertEqual([(None, None, True, 'All Files', ''),
402
330
                          ('b-id', 'd', True, 'b/ => d/', 'renamed'),
403
331
                          ('a-id', 'd/a', True, 'a => d/a', 'renamed and modified'),
404
332
                          ('c-id', 'd/c', True, 'd/c', 'modified'),
421
349
 
422
350
        dlg = commit.CommitDialog(tree)
423
351
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
424
 
        self.assertEqual([("", "", True, 'All Files', ''),
 
352
        self.assertEqual([(None, None, True, 'All Files', ''),
425
353
                          ('a-id', 'a', True, 'a => a/', 'kind changed'),
426
354
                          # ('b-id', 'c', True, 'b => c/', 'renamed and modified'),
427
355
                         ], values)
437
365
 
438
366
        dlg = commit.CommitDialog(tree)
439
367
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
440
 
        self.assertEqual([("", "", True, 'All Files', ''),
 
368
        self.assertEqual([(None, None, True, 'All Files', ''),
441
369
                          ('a-id', 'a', True, 'a', 'removed'),
442
370
                          ('b-id', 'b', True, 'b/', 'removed'),
443
371
                         ], values)
444
372
        # All Files should be selected
445
 
        self.assertEqual(
446
 
            (Gtk.TreePath(path=0), None), dlg._treeview_files.get_cursor())
 
373
        self.assertEqual(((0,), None), dlg._treeview_files.get_cursor())
447
374
 
448
375
    def test_filelist_with_selected(self):
449
376
        tree = self.make_branch_and_tree('tree')
452
379
 
453
380
        dlg = commit.CommitDialog(tree, selected='a')
454
381
        values = [(r[0], r[1], r[2], r[3], r[4]) for r in dlg._files_store]
455
 
        self.assertEqual([("", "", False, 'All Files', ''),
 
382
        self.assertEqual([(None, None, False, 'All Files', ''),
456
383
                          ('a-id', 'a', True, 'a', 'added'),
457
384
                          ('b-id', 'b', False, 'b/', 'added'),
458
385
                         ], values)
459
386
        # This file should also be selected in the file list, rather than the
460
387
        # 'All Files' selection
461
 
        self.assertEqual(
462
 
            (Gtk.TreePath(path=1), None), dlg._treeview_files.get_cursor())
 
388
        self.assertEqual(((1,), None), dlg._treeview_files.get_cursor())
463
389
 
464
390
    def test_diff_view(self):
465
391
        tree = self.make_branch_and_tree('tree')
473
399
        dlg = commit.CommitDialog(tree)
474
400
        diff_buffer = dlg._diff_view.buffer
475
401
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
476
 
                                    diff_buffer.get_end_iter(),
477
 
                                    True).splitlines(True)
 
402
                                    diff_buffer.get_end_iter()).splitlines(True)
478
403
 
479
 
        self.assertEqual("=== modified file 'a'\n", text[0])
 
404
        self.assertEqual("=== removed file 'b'\n", text[0])
480
405
        self.assertContainsRe(text[1],
 
406
            r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
 
407
        self.assertEqual('+++ b\t1970-01-01 00:00:00 +0000\n', text[2])
 
408
        self.assertEqual('@@ -1,1 +0,0 @@\n', text[3])
 
409
        self.assertEqual('-contents of tree/b\n', text[4])
 
410
        self.assertEqual('\n', text[5])
 
411
 
 
412
        self.assertEqual("=== modified file 'a'\n", text[6])
 
413
        self.assertContainsRe(text[7],
481
414
            r"--- a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
482
 
        self.assertContainsRe(text[2],
483
 
            r"\+\+\+ a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
484
 
        self.assertEqual('@@ -1,1 +1,1 @@\n', text[3])
485
 
        self.assertEqual('-contents of tree/a\n', text[4])
486
 
        self.assertEqual('+new contents for a\n', text[5])
487
 
        self.assertEqual('\n', text[6])
488
 
 
489
 
        self.assertEqual("=== removed file 'b'\n", text[7])
490
415
        self.assertContainsRe(text[8],
491
 
            r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
492
 
        self.assertEqual('+++ b\t1970-01-01 00:00:00 +0000\n', text[9])
493
 
        self.assertEqual('@@ -1,1 +0,0 @@\n', text[10])
494
 
        self.assertEqual('-contents of tree/b\n', text[11])
 
416
            r"\+\+\+ a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
 
417
        self.assertEqual('@@ -1,1 +1,1 @@\n', text[9])
 
418
        self.assertEqual('-contents of tree/a\n', text[10])
 
419
        self.assertEqual('+new contents for a\n', text[11])
495
420
        self.assertEqual('\n', text[12])
496
421
 
497
422
        self.assertEqual('Diff for All Files', dlg._diff_label.get_text())
498
423
 
499
 
    def test_commit_partial_toggle(self):
500
 
        tree = self.make_branch_and_tree('tree')
501
 
        self.build_tree(['tree/a', 'tree/b'])
502
 
        tree.add(['a', 'b'], ['a-id', 'b-id'])
503
 
 
504
 
        dlg = commit.CommitDialog(tree)
505
 
        checked_col = dlg._treeview_files.get_column(0)
506
 
        self.assertFalse(checked_col.get_property('visible'))
507
 
        self.assertTrue(dlg._commit_all_changes)
508
 
 
509
 
        dlg._commit_selected_radio.set_active(True)
510
 
        self.assertTrue(checked_col.get_property('visible'))
511
 
        self.assertFalse(dlg._commit_all_changes)
512
 
 
513
424
    def test_file_selection(self):
514
425
        """Several things should happen when a file has been selected."""
515
426
        tree = self.make_branch_and_tree('tree')
525
436
        self.assertFalse(dlg._file_message_expander.get_expanded())
526
437
        self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
527
438
 
528
 
        dlg._treeview_files.set_cursor(
529
 
            Gtk.TreePath(path=1), None, False)
 
439
        dlg._treeview_files.set_cursor((1,))
530
440
        self.assertEqual('Diff for a', dlg._diff_label.get_text())
531
441
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
532
 
                                    diff_buffer.get_end_iter(),
533
 
                                    True).splitlines(True)
 
442
                                    diff_buffer.get_end_iter()).splitlines(True)
534
443
        self.assertEqual("=== added file 'a'\n", text[0])
535
444
        self.assertContainsRe(text[1],
536
445
            r"--- a\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
544
453
        self.assertTrue(dlg._file_message_expander.get_expanded())
545
454
        self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
546
455
 
547
 
        dlg._treeview_files.set_cursor(
548
 
            Gtk.TreePath(path=2), None, False)
 
456
        dlg._treeview_files.set_cursor((2,))
549
457
        self.assertEqual('Diff for b', dlg._diff_label.get_text())
550
458
        text = diff_buffer.get_text(diff_buffer.get_start_iter(),
551
 
                                    diff_buffer.get_end_iter(),
552
 
                                    True).splitlines(True)
 
459
                                    diff_buffer.get_end_iter()).splitlines(True)
553
460
        self.assertEqual("=== added file 'b'\n", text[0])
554
461
        self.assertContainsRe(text[1],
555
462
            r"--- b\t\d\d\d\d-\d\d-\d\d \d\d:\d\d:\d\d [+-]\d\d\d\d")
563
470
        self.assertTrue(dlg._file_message_expander.get_expanded())
564
471
        self.assertTrue(dlg._file_message_expander.get_property('sensitive'))
565
472
 
566
 
        dlg._treeview_files.set_cursor(
567
 
            Gtk.TreePath(path=0), None, False)
 
473
        dlg._treeview_files.set_cursor((0,))
568
474
        self.assertEqual('Diff for All Files', dlg._diff_label.get_text())
569
475
        self.assertEqual('File commit message',
570
476
                         dlg._file_message_expander.get_label())
580
486
 
581
487
        def get_file_text():
582
488
            buf = dlg._file_message_text_view.get_buffer()
583
 
            return buf.get_text(
584
 
                buf.get_start_iter(), buf.get_end_iter(), True)
 
489
            return buf.get_text(buf.get_start_iter(), buf.get_end_iter())
585
490
 
586
491
        def get_saved_text(path):
587
492
            """Get the saved text for a given record."""
594
499
        self.assertFalse(dlg._file_message_expander.get_property('sensitive'))
595
500
        self.assertEqual('', get_file_text())
596
501
 
597
 
        dlg._treeview_files.set_cursor(
598
 
            Gtk.TreePath(path=1), None, False)
 
502
        dlg._treeview_files.set_cursor((1,))
599
503
        self.assertEqual('Commit message for a',
600
504
                         dlg._file_message_expander.get_label())
601
505
        self.assertTrue(dlg._file_message_expander.get_expanded())
608
512
        # We should have updated the ListStore with the new file commit info
609
513
        self.assertEqual('Some text\nfor a\n', get_saved_text(1))
610
514
 
611
 
        dlg._treeview_files.set_cursor(
612
 
            Gtk.TreePath(path=2), None, False)
 
515
        dlg._treeview_files.set_cursor((2,))
613
516
        self.assertEqual('Commit message for b/',
614
517
                         dlg._file_message_expander.get_label())
615
518
        self.assertTrue(dlg._file_message_expander.get_expanded())
620
523
        dlg._set_file_commit_message('More text\nfor b\n')
621
524
        # Now switch back to 'a'. The message should be saved, and the buffer
622
525
        # should be updated with the other text
623
 
        dlg._treeview_files.set_cursor(
624
 
            Gtk.TreePath(path=1), None, False)
 
526
        dlg._treeview_files.set_cursor((1,))
625
527
        self.assertEqual('More text\nfor b\n', get_saved_text(2))
626
528
        self.assertEqual('Commit message for a',
627
529
                         dlg._file_message_expander.get_label())
636
538
        tree.add(['a', 'b'], ['a-id', 'b-id'])
637
539
 
638
540
        dlg = commit.CommitDialog(tree)
639
 
        self.assertEqual([("", "", True),
 
541
        self.assertEqual([(None, None, True),
640
542
                          ('a-id', 'a', True),
641
543
                          ('b-id', 'b', True),
642
544
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
647
549
        #       do with. So instead, we just call toggle directly, and assume
648
550
        #       that toggle is hooked in correctly
649
551
        # column = dlg._treeview_files.get_column(0)
650
 
        # renderer = column.get_cells()[0]
 
552
        # renderer = column.get_cell_renderers()[0]
651
553
 
652
554
        # Toggle a single entry should set just that entry to False
653
555
        dlg._toggle_commit(None, 1, dlg._files_store)
654
 
        self.assertEqual([("", "", True),
 
556
        self.assertEqual([(None, None, True),
655
557
                          ('a-id', 'a', False),
656
558
                          ('b-id', 'b', True),
657
559
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
658
560
 
659
561
        # Toggling the main entry should set all entries
660
562
        dlg._toggle_commit(None, 0, dlg._files_store)
661
 
        self.assertEqual([("", "", False),
 
563
        self.assertEqual([(None, None, False),
662
564
                          ('a-id', 'a', False),
663
565
                          ('b-id', 'b', False),
664
566
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
665
567
 
666
568
        dlg._toggle_commit(None, 2, dlg._files_store)
667
 
        self.assertEqual([("", "", False),
 
569
        self.assertEqual([(None, None, False),
668
570
                          ('a-id', 'a', False),
669
571
                          ('b-id', 'b', True),
670
572
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
671
573
 
672
574
        dlg._toggle_commit(None, 0, dlg._files_store)
673
 
        self.assertEqual([("", "", True),
 
575
        self.assertEqual([(None, None, True),
674
576
                          ('a-id', 'a', True),
675
577
                          ('b-id', 'b', True),
676
578
                         ], [(r[0], r[1], r[2]) for r in dlg._files_store])
683
585
        dlg = commit.CommitDialog(tree)
684
586
        self.assertEqual((['a', 'b'], []), dlg._get_specific_files())
685
587
 
686
 
        dlg._commit_selected_radio.set_active(True)
687
588
        dlg._toggle_commit(None, 0, dlg._files_store)
688
589
        self.assertEqual(([], []), dlg._get_specific_files())
689
590
 
697
598
        tree.add(['a_file', 'b_dir'], ['1a-id', '0b-id'])
698
599
 
699
600
        dlg = commit.CommitDialog(tree)
700
 
        dlg._commit_selected_radio.set_active(True)
701
601
        self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
702
602
 
703
 
        dlg._treeview_files.set_cursor(
704
 
            Gtk.TreePath(path=1), None, False)
 
603
        dlg._treeview_files.set_cursor((1,))
705
604
        dlg._set_file_commit_message('Test\nmessage\nfor a_file\n')
706
 
        dlg._treeview_files.set_cursor(
707
 
            Gtk.TreePath(path=2), None, False)
 
605
        dlg._treeview_files.set_cursor((2,))
708
606
        dlg._set_file_commit_message('message\nfor b_dir\n')
709
607
 
710
608
        self.assertEqual((['a_file', 'b_dir'],
720
618
                            'message':'message\nfor b_dir\n'},
721
619
                          ]), dlg._get_specific_files())
722
620
 
723
 
    def test_specific_files_sanitizes_messages(self):
724
 
        tree = self.make_branch_and_tree('tree')
725
 
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
726
 
        self.build_tree(['tree/a_file', 'tree/b_dir/'])
727
 
        tree.add(['a_file', 'b_dir'], ['1a-id', '0b-id'])
728
 
 
729
 
        dlg = commit.CommitDialog(tree)
730
 
        dlg._commit_selected_radio.set_active(True)
731
 
        self.assertEqual((['a_file', 'b_dir'], []), dlg._get_specific_files())
732
 
 
733
 
        dlg._treeview_files.set_cursor(
734
 
            Gtk.TreePath(path=1), None, False)
735
 
        dlg._set_file_commit_message('Test\r\nmessage\rfor a_file\n')
736
 
        dlg._treeview_files.set_cursor(
737
 
            Gtk.TreePath(path=2), None, False)
738
 
        dlg._set_file_commit_message('message\r\nfor\nb_dir\r')
739
 
 
740
 
        self.assertEqual((['a_file', 'b_dir'],
741
 
                          [{'path':'a_file', 'file_id':'1a-id',
742
 
                            'message':'Test\nmessage\nfor a_file\n'},
743
 
                           {'path':'b_dir', 'file_id':'0b-id',
744
 
                            'message':'message\nfor\nb_dir\n'},
745
 
                          ]), dlg._get_specific_files())
746
 
 
747
 
 
748
 
class QuestionHelpers(object):
 
621
 
 
622
class TestCommitDialog_Commit(tests.TestCaseWithTransport):
 
623
    """Tests on the actual 'commit' button being pushed."""
749
624
 
750
625
    def _set_question_yes(self, dlg):
751
626
        """Set the dialog to answer YES to any questions."""
752
627
        self.questions = []
753
 
        def _question_yes(*args, **kwargs):
 
628
        def _question_yes(*args):
754
629
            self.questions.append(args)
755
630
            self.questions.append('YES')
756
 
            return Gtk.ResponseType.YES
 
631
            return gtk.RESPONSE_YES
757
632
        dlg._question_dialog = _question_yes
758
633
 
759
634
    def _set_question_no(self, dlg):
760
635
        """Set the dialog to answer NO to any questions."""
761
636
        self.questions = []
762
 
        def _question_no(*args, **kwargs):
 
637
        def _question_no(*args):
763
638
            self.questions.append(args)
764
639
            self.questions.append('NO')
765
 
            return Gtk.ResponseType.NO
 
640
            return gtk.RESPONSE_NO
766
641
        dlg._question_dialog = _question_no
767
642
 
768
 
 
769
 
class TestCommitDialog_Commit(tests.TestCaseWithTransport, QuestionHelpers):
770
 
    """Tests on the actual 'commit' button being pushed."""
771
 
 
772
643
    def test_bound_commit_local(self):
773
644
        tree = self.make_branch_and_tree('tree')
774
645
        self.build_tree(['tree/a'])
790
661
        self.assertEqual(last_rev, dlg.committed_revision_id)
791
662
        self.assertEqual(rev_id1, tree.branch.last_revision())
792
663
 
793
 
    def test_commit_global_sanitizes_message(self):
794
 
        tree = self.make_branch_and_tree('tree')
795
 
        self.build_tree(['tree/a'])
796
 
        tree.add(['a'], ['a-id'])
797
 
        rev_id1 = tree.commit('one')
798
 
 
799
 
        self.build_tree(['tree/b'])
800
 
        tree.add(['b'], ['b-id'])
801
 
        dlg = commit.CommitDialog(tree)
802
 
        # With the check box set, it should only effect the local branch
803
 
        dlg._set_global_commit_message('Commit\r\nmessage\rfoo\n')
804
 
        dlg._do_commit()
805
 
        rev = tree.branch.repository.get_revision(tree.last_revision())
806
 
        self.assertEqual('Commit\nmessage\nfoo\n', rev.message)
807
 
 
808
664
    def test_bound_commit_both(self):
809
665
        tree = self.make_branch_and_tree('tree')
810
666
        self.build_tree(['tree/a'])
826
682
        self.assertEqual(last_rev, dlg.committed_revision_id)
827
683
        self.assertEqual(last_rev, tree.branch.last_revision())
828
684
 
829
 
    def test_commit_empty_message(self):
 
685
    def test_commit_no_message(self):
830
686
        tree = self.make_branch_and_tree('tree')
831
687
        self.build_tree(['tree/a', 'tree/b'])
832
688
        tree.add(['a'], ['a-id'])
948
804
        tree.add(['a', 'b'], ['a-id', 'b-id'])
949
805
 
950
806
        dlg = commit.CommitDialog(tree)
951
 
        dlg._commit_selected_radio.set_active(True) # enable partial
952
807
        dlg._toggle_commit(None, 2, dlg._files_store) # unset 'b'
953
808
 
954
809
        dlg._set_global_commit_message('Committing just "a"\n')
963
818
                                       if path] # Ignore the root entry
964
819
        self.assertEqual([('a', 'a-id')], entries)
965
820
 
966
 
    def test_commit_partial_no_partial(self):
967
 
        """Ignore the checkboxes if committing all files."""
968
 
        tree = self.make_branch_and_tree('tree')
969
 
        rev_id1 = tree.commit('one')
970
 
        self.build_tree(['tree/a', 'tree/b'])
971
 
        tree.add(['a', 'b'], ['a-id', 'b-id'])
972
 
 
973
 
        dlg = commit.CommitDialog(tree)
974
 
        dlg._commit_selected_radio.set_active(True) # enable partial
975
 
        dlg._toggle_commit(None, 2, dlg._files_store) # unset 'b'
976
 
 
977
 
        # Switch back to committing all changes
978
 
        dlg._commit_all_files_radio.set_active(True)
979
 
 
980
 
        dlg._set_global_commit_message('Committing everything\n')
981
 
        dlg._do_commit()
982
 
 
983
 
        rev_id2 = dlg.committed_revision_id
984
 
        self.assertIsNot(None, rev_id2)
985
 
        self.assertEqual(rev_id2, tree.last_revision())
986
 
 
987
 
        rt = tree.branch.repository.revision_tree(rev_id2)
988
 
        entries = [(path, ie.file_id) for path, ie in rt.iter_entries_by_dir()
989
 
                                       if path] # Ignore the root entry
990
 
        self.assertEqual([('a', 'a-id'), ('b', 'b-id')], entries)
991
 
 
992
821
    def test_commit_no_messages(self):
993
822
        tree = self.make_branch_and_tree('tree')
994
823
        rev_id1 = tree.commit('one')
1011
840
 
1012
841
        dlg = commit.CommitDialog(tree)
1013
842
        self.assertFalse(dlg._file_message_expander.get_property('visible'))
1014
 
        self.assertEqual('Commit Message',
1015
 
                         dlg._global_message_label.get_text())
1016
843
 
1017
844
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
1018
845
        dlg = commit.CommitDialog(tree)
1019
846
        self.assertTrue(dlg._file_message_expander.get_property('visible'))
1020
 
        self.assertEqual('Global Commit Message',
1021
 
                         dlg._global_message_label.get_text())
1022
847
 
1023
848
        tree.branch.get_config().set_user_option('per_file_commits', 'on')
1024
849
        dlg = commit.CommitDialog(tree)
1025
850
        self.assertTrue(dlg._file_message_expander.get_property('visible'))
1026
 
        self.assertEqual('Global Commit Message',
1027
 
                         dlg._global_message_label.get_text())
1028
851
 
1029
852
        tree.branch.get_config().set_user_option('per_file_commits', 'y')
1030
853
        dlg = commit.CommitDialog(tree)
1031
854
        self.assertTrue(dlg._file_message_expander.get_property('visible'))
1032
 
        self.assertEqual('Global Commit Message',
1033
 
                         dlg._global_message_label.get_text())
1034
855
 
1035
856
        tree.branch.get_config().set_user_option('per_file_commits', 'n')
1036
857
        dlg = commit.CommitDialog(tree)
1037
858
        self.assertFalse(dlg._file_message_expander.get_property('visible'))
1038
 
        self.assertEqual('Commit Message',
1039
 
                         dlg._global_message_label.get_text())
1040
859
 
1041
860
    def test_commit_specific_files_with_messages(self):
1042
861
        tree = self.make_branch_and_tree('tree')
1046
865
        tree.add(['a', 'b'], ['a-id', 'b-id'])
1047
866
 
1048
867
        dlg = commit.CommitDialog(tree)
1049
 
        dlg._commit_selected_radio.set_active(True) # enable partial
1050
 
        dlg._treeview_files.set_cursor(
1051
 
            Gtk.TreePath(path=1), None, False)
 
868
        dlg._treeview_files.set_cursor((1,))
1052
869
        dlg._set_file_commit_message('Message for A\n')
1053
 
        dlg._treeview_files.set_cursor(
1054
 
            Gtk.TreePath(path=2), None, False)
 
870
        dlg._treeview_files.set_cursor((2,))
1055
871
        dlg._set_file_commit_message('Message for B\n')
1056
872
        dlg._toggle_commit(None, 2, dlg._files_store) # unset 'b'
1057
873
        dlg._set_global_commit_message('Commit just "a"')
1063
879
        rev = tree.branch.repository.get_revision(rev_id2)
1064
880
        self.assertEqual('Commit just "a"', rev.message)
1065
881
        file_info = rev.properties['file-info']
1066
 
        self.assertEqual(u'ld7:file_id4:a-id'
1067
 
                         '7:message14:Message for A\n'
1068
 
                         '4:path1:a'
1069
 
                         'ee',
1070
 
                         file_info)
 
882
        self.assertEqual('ld7:file_id4:a-id'
 
883
                           '7:message14:Message for A\n'
 
884
                           '4:path1:a'
 
885
                         'ee', file_info)
1071
886
        self.assertEqual([{'path':'a', 'file_id':'a-id',
1072
 
                           'message':'Message for A\n'},],
1073
 
                         bencode.bdecode(file_info.encode('UTF-8')))
 
887
                           'message':'Message for A\n'},
 
888
                         ], bencode.bdecode(file_info))
1074
889
 
1075
890
    def test_commit_messages_after_merge(self):
1076
891
        tree = self.make_branch_and_tree('tree')
1084
899
        tree.merge_from_branch(tree2.branch)
1085
900
 
1086
901
        dlg = commit.CommitDialog(tree)
1087
 
        dlg._treeview_files.set_cursor(
1088
 
            Gtk.TreePath(path=1), None, False) # 'a'
 
902
        dlg._treeview_files.set_cursor((1,)) # 'a'
1089
903
        dlg._set_file_commit_message('Message for A\n')
1090
904
        # No message for 'B'
1091
905
        dlg._set_global_commit_message('Merging from "tree2"\n')
1098
912
        self.assertEqual('Merging from "tree2"\n', rev.message)
1099
913
        self.assertEqual([rev_id1, rev_id2], rev.parent_ids)
1100
914
        file_info = rev.properties['file-info']
1101
 
        self.assertEqual(u'ld7:file_id4:a-id'
1102
 
                         '7:message14:Message for A\n'
1103
 
                         '4:path1:a'
1104
 
                         'ee',
1105
 
                         file_info)
 
915
        self.assertEqual('ld7:file_id4:a-id'
 
916
                           '7:message14:Message for A\n'
 
917
                           '4:path1:a'
 
918
                         'ee', file_info)
1106
919
        self.assertEqual([{'path':'a', 'file_id':'a-id',
1107
 
                           'message':'Message for A\n'},],
1108
 
                         bencode.bdecode(file_info.encode('UTF-8')))
 
920
                           'message':'Message for A\n'},
 
921
                         ], bencode.bdecode(file_info))
1109
922
 
1110
923
    def test_commit_unicode_messages(self):
1111
 
        self.requireFeature(UnicodeFilenameFeature)
 
924
        from bzrlib.tests.test_diff import UnicodeFilename
 
925
        self.requireFeature(UnicodeFilename)
1112
926
 
1113
927
        tree = self.make_branch_and_tree('tree')
1114
928
        tree.branch.get_config().set_user_option('per_file_commits', 'true')
1116
930
        tree.add(['a', u'\u03a9'], ['a-id', 'omega-id'])
1117
931
 
1118
932
        dlg = commit.CommitDialog(tree)
1119
 
        dlg._treeview_files.set_cursor(
1120
 
            Gtk.TreePath(path=1), None, False) # 'a'
 
933
        dlg._treeview_files.set_cursor((1,)) # 'a'
1121
934
        dlg._set_file_commit_message(u'Test \xfan\xecc\xf6de\n')
1122
 
        dlg._treeview_files.set_cursor(
1123
 
            Gtk.TreePath(path=2), None, False) # omega
 
935
        dlg._treeview_files.set_cursor((2,)) # omega
1124
936
        dlg._set_file_commit_message(u'\u03a9 is the end of all things.\n')
1125
937
        dlg._set_global_commit_message(u'\u03a9 and \xfan\xecc\xf6de\n')
1126
938
 
1155
967
                          {'path':u'\u03a9', 'file_id':'omega-id',
1156
968
                           'message':u'\u03a9 is the end of all things.\n'},
1157
969
                         ], file_info_decoded)
1158
 
 
1159
 
 
1160
 
class TestSanitizeMessage(tests.TestCase):
1161
 
 
1162
 
    def assertSanitize(self, expected, original):
1163
 
        self.assertEqual(expected,
1164
 
                         commit._sanitize_and_decode_message(original))
1165
 
 
1166
 
    def test_untouched(self):
1167
 
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\nbar\nbaz\n')
1168
 
 
1169
 
    def test_converts_cr_to_lf(self):
1170
 
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\rbar\rbaz\r')
1171
 
 
1172
 
    def test_converts_crlf_to_lf(self):
1173
 
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\r\nbaz\r\n')
1174
 
 
1175
 
    def test_converts_mixed_to_lf(self):
1176
 
        self.assertSanitize('foo\nbar\nbaz\n', 'foo\r\nbar\rbaz\n')
1177
 
 
1178
 
 
1179
 
class TestSavedCommitMessages(tests.TestCaseWithTransport):
1180
 
 
1181
 
    def setUp(self):
1182
 
        super(TestSavedCommitMessages, self).setUp()
1183
 
        # Install our hook
1184
 
        branch.Branch.hooks.install_named_hook(
1185
 
            'post_uncommit', commitmsgs.save_commit_messages, None)
1186
 
 
1187
 
    def _get_file_info_dict(self, rank):
1188
 
        file_info = [dict(path='a', file_id='a-id', message='a msg %d' % rank),
1189
 
                     dict(path='b', file_id='b-id', message='b msg %d' % rank)]
1190
 
        return file_info
1191
 
 
1192
 
    def _get_file_info_revprops(self, rank):
1193
 
        file_info_prop = self._get_file_info_dict(rank)
1194
 
        return {'file-info': bencode.bencode(file_info_prop).decode('UTF-8')}
1195
 
 
1196
 
    def _get_commit_message(self):
1197
 
        return self.config.get_user_option('gtk_global_commit_message')
1198
 
 
1199
 
    def _get_file_commit_messages(self):
1200
 
        return self.config.get_user_option('gtk_file_commit_messages')
1201
 
 
1202
 
 
1203
 
class TestUncommitHook(TestSavedCommitMessages):
1204
 
 
1205
 
    def setUp(self):
1206
 
        super(TestUncommitHook, self).setUp()
1207
 
        self.tree = self.make_branch_and_tree('tree')
1208
 
        self.config = self.tree.branch.get_config()
1209
 
        self.build_tree(['tree/a', 'tree/b'])
1210
 
        self.tree.add(['a'], ['a-id'])
1211
 
        self.tree.add(['b'], ['b-id'])
1212
 
        rev1 = self.tree.commit('one', rev_id='one-id',
1213
 
                                revprops=self._get_file_info_revprops(1))
1214
 
        rev2 = self.tree.commit('two', rev_id='two-id',
1215
 
                                revprops=self._get_file_info_revprops(2))
1216
 
        rev3 = self.tree.commit('three', rev_id='three-id',
1217
 
                                revprops=self._get_file_info_revprops(3))
1218
 
 
1219
 
    def test_uncommit_one_by_one(self):
1220
 
        uncommit.uncommit(self.tree.branch, tree=self.tree)
1221
 
        self.assertEquals(u'three', self._get_commit_message())
1222
 
        self.assertEquals(u'd4:a-id7:a msg 34:b-id7:b msg 3e',
1223
 
                          self._get_file_commit_messages())
1224
 
 
1225
 
        uncommit.uncommit(self.tree.branch, tree=self.tree)
1226
 
        self.assertEquals(u'two\n******\nthree', self._get_commit_message())
1227
 
        self.assertEquals(u'd4:a-id22:a msg 2\n******\na msg 3'
1228
 
                          '4:b-id22:b msg 2\n******\nb msg 3e',
1229
 
                          self._get_file_commit_messages())
1230
 
 
1231
 
        uncommit.uncommit(self.tree.branch, tree=self.tree)
1232
 
        self.assertEquals(u'one\n******\ntwo\n******\nthree',
1233
 
                          self._get_commit_message())
1234
 
        self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
1235
 
                          '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
1236
 
                          self._get_file_commit_messages())
1237
 
 
1238
 
    def test_uncommit_all_at_once(self):
1239
 
        uncommit.uncommit(self.tree.branch, tree=self.tree, revno=1)
1240
 
        self.assertEquals(u'one\n******\ntwo\n******\nthree',
1241
 
                          self._get_commit_message())
1242
 
        self.assertEquals(u'd4:a-id37:a msg 1\n******\na msg 2\n******\na msg 3'
1243
 
                          '4:b-id37:b msg 1\n******\nb msg 2\n******\nb msg 3e',
1244
 
                          self._get_file_commit_messages())
1245
 
 
1246
 
 
1247
 
class TestReusingSavedCommitMessages(TestSavedCommitMessages, QuestionHelpers):
1248
 
 
1249
 
    def setUp(self):
1250
 
        super(TestReusingSavedCommitMessages, self).setUp()
1251
 
        self.tree = self.make_branch_and_tree('tree')
1252
 
        self.config = self.tree.branch.get_config()
1253
 
        self.config.set_user_option('per_file_commits', 'true')
1254
 
        self.build_tree(['tree/a', 'tree/b'])
1255
 
        self.tree.add(['a'], ['a-id'])
1256
 
        self.tree.add(['b'], ['b-id'])
1257
 
        rev1 = self.tree.commit('one', revprops=self._get_file_info_revprops(1))
1258
 
        rev2 = self.tree.commit('two', revprops=self._get_file_info_revprops(2))
1259
 
        uncommit.uncommit(self.tree.branch, tree=self.tree)
1260
 
        self.build_tree_contents([('tree/a', 'new a content\n'),
1261
 
                                  ('tree/b', 'new b content'),])
1262
 
 
1263
 
    def _get_commit_dialog(self, tree):
1264
 
        # Ensure we will never use a dialog that can actually prompt the user
1265
 
        # during the test suite. Test *can* and *should* override with the
1266
 
        # correct question dialog type.
1267
 
        dlg = commit.CommitDialog(tree)
1268
 
        self._set_question_no(dlg)
1269
 
        return dlg
1270
 
 
1271
 
    def test_setup_saved_messages(self):
1272
 
        # Check the initial setup
1273
 
        self.assertEquals(u'two', self._get_commit_message())
1274
 
        self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
1275
 
                          self._get_file_commit_messages())
1276
 
 
1277
 
    def test_messages_are_reloaded(self):
1278
 
        dlg = self._get_commit_dialog(self.tree)
1279
 
        self.assertEquals(u'two', dlg._get_global_commit_message())
1280
 
        self.assertEquals(([u'a', u'b'],
1281
 
                           [{ 'path': 'a',
1282
 
                             'file_id': 'a-id', 'message': 'a msg 2',},
1283
 
                           {'path': 'b',
1284
 
                            'file_id': 'b-id', 'message': 'b msg 2',}],),
1285
 
                          dlg._get_specific_files())
1286
 
 
1287
 
    def test_messages_are_consumed(self):
1288
 
        dlg = self._get_commit_dialog(self.tree)
1289
 
        dlg._do_commit()
1290
 
        self.assertEquals(u'', self._get_commit_message())
1291
 
        self.assertEquals(u'de', self._get_file_commit_messages())
1292
 
 
1293
 
    def test_messages_are_saved_on_cancel_if_required(self):
1294
 
        dlg = self._get_commit_dialog(self.tree)
1295
 
        self._set_question_yes(dlg) # Save messages
1296
 
        dlg._do_cancel()
1297
 
        self.assertEquals(u'two', self._get_commit_message())
1298
 
        self.assertEquals(u'd4:a-id7:a msg 24:b-id7:b msg 2e',
1299
 
                          self._get_file_commit_messages())
1300
 
 
1301
 
    def test_messages_are_cleared_on_cancel_if_required(self):
1302
 
        dlg = self._get_commit_dialog(self.tree)
1303
 
        self._set_question_no(dlg) # Don't save messages
1304
 
        dlg._do_cancel()
1305
 
        self.assertEquals(u'', self._get_commit_message())
1306
 
        self.assertEquals(u'de',
1307
 
                          self._get_file_commit_messages())
1308
 
 
1309
 
 
1310
 
class BzrHandlePatchTestCase(tests.TestCase):
1311
 
 
1312
 
    def setUp(self):
1313
 
        top = os.path.abspath(os.path.join(
1314
 
            os.path.dirname(__file__), os.pardir))
1315
 
        self.script = os.path.join(top, 'bzr-handle-patch')
1316
 
        self.env = dict(os.environ)
1317
 
        self.env['BZR_PLUGINS_AT'] = 'gtk@%s' % top
1318
 
        self.patch = NamedTemporaryFile()
1319
 
        self.patch.write('\n'.join([
1320
 
            "=== added file '_test.txt'",
1321
 
            "--- _test.txt      1970-01-01 00:00:00 +0000",
1322
 
            "+++ _test.txt      2012-02-03 20:00:34 +0000",
1323
 
            "@@ -0,0 +1,1 @@",
1324
 
            "+hello",
1325
 
            ]))
1326
 
        self.patch.flush()
1327
 
        super(BzrHandlePatchTestCase, self).setUp()
1328
 
 
1329
 
    def test_smoketest(self):
1330
 
        # This is a smoke test to verify the process starts.
1331
 
        bzr_notify = subprocess.Popen(
1332
 
            [self.script, self.patch.name, 'test'],
1333
 
            stdout=subprocess.PIPE, stderr=subprocess.PIPE, env=self.env)
1334
 
        stdout, stderr = bzr_notify.communicate()
1335
 
        self.assertEqual('', stdout)
1336
 
        self.assertEqual('', stderr)