105
107
self._attrs = attrs
106
108
for i in xrange(attrs):
107
109
attr_name = 'attr%i' % i
108
setattr(self, attr_name, '%s-%i' % (prefix, i))
110
setattr(self, attr_name, u'%s-%i' % (prefix, i))
110
112
def __len__(self):
111
113
return self._attrs
114
116
class FakeDialog(Recorder):
115
117
"""A Fake Dialog that knows how to run and hide itself."""
117
response = gtk.RESPONSE_NONE
119
response = Gtk.ResponseType.NONE
118
120
no_wrap = ['_called', 'response', 'args', 'kwargs']
120
122
def __init__(self, *args, **kwargs):
137
139
@defer.inlineCallbacks
139
self.patch(gtk, 'FileChooserDialog', FakeDialog)
140
self.patch(gtk, 'MessageDialog', FakeDialog)
141
self.patch(Gtk, 'FileChooserDialog', FakeDialog)
142
self.patch(Gtk, 'MessageDialog', FakeDialog)
142
144
if self.ui_class.data_fields is None:
143
fakes = (('attr0', lambda s: ''.join(reversed(s))),
144
('attr1', lambda s: s.replace('-', ' ❥ ')))
145
fakes = (('attr0', lambda s: u''.join(reversed(s))),
146
('attr1', lambda s: s.replace(u'-', u' ❥ ')))
145
147
self.patch(self.ui_class, 'data_fields', fakes)
147
149
if self.ui_class.sd_attr is None:
148
150
self.patch(self.ui_class, 'sd_attr', 'fake_sd_attr')
150
152
if self.ui_class.filename is None:
151
builder = gtk.Builder()
153
builder = Gtk.Builder()
152
154
builder.add_from_string(TEST_UI)
153
155
self.kwargs['builder'] = builder
154
156
self.addCleanup(self.kwargs.pop, 'builder')
257
259
buttons = self.ui.get_action_area().get_children()
258
260
self.assertTrue(len(buttons) > 0)
260
# with the gtk.STOCK_CLOSE stock
262
# with the Gtk.STOCK_CLOSE stock
261
263
close_button = buttons[-1]
262
264
self.assertIs(self.ui.close_button, close_button)
263
265
self.assertTrue(close_button.get_use_stock())
264
266
stock = close_button.get_image().get_stock()
265
self.assertEqual(stock, (gtk.STOCK_CLOSE, gtk.ICON_SIZE_BUTTON))
267
self.assertEqual(stock, (Gtk.STOCK_CLOSE, Gtk.IconSize.BUTTON))
267
# that emits gtk.RESPONSE_CLOSE when clicked
268
widget = self.ui.get_widget_for_response(gtk.RESPONSE_CLOSE)
269
# that emits Gtk.ResponseType.CLOSE when clicked
270
widget = self.ui.get_widget_for_response(Gtk.ResponseType.CLOSE)
269
271
self.assertIs(widget, close_button)
271
273
def test_warning_label(self):
328
330
"""The panel can be re-sorted."""
329
331
for idx, col in enumerate(self.ui.view.get_columns()):
330
332
col.clicked() # click on the column
331
self.assert_sort_order_correct(col, idx, gtk.SORT_ASCENDING)
333
self.assert_sort_order_correct(col, idx, Gtk.SortType.ASCENDING)
332
334
self.assert_sort_indicator_correct(col)
334
336
col.clicked() # click on the column, sort order must change
335
self.assert_sort_order_correct(col, idx, gtk.SORT_DESCENDING)
337
self.assert_sort_order_correct(col, idx, Gtk.SortType.DESCENDING)
337
339
col.clicked() # click again, sort order must be the first one
338
self.assert_sort_order_correct(col, idx, gtk.SORT_ASCENDING)
340
self.assert_sort_order_correct(col, idx, Gtk.SortType.ASCENDING)
340
342
def test_view_selection_single(self):
341
343
"""The view selection's mode is SINGLE."""
342
344
self.assertEqual(self.ui.view.get_selection().get_mode(),
343
gtk.SELECTION_SINGLE)
345
Gtk.SelectionMode.SINGLE)
345
347
def test_on_error(self, exc=None):
346
348
"""On error 'exc', show a error dialog."""
357
359
def test_confirm_dialog(self):
358
360
"""The confirm dialog dialog is properly created."""
359
self.assertIsInstance(self.ui.confirm_dialog, gtk.MessageDialog)
361
self.assertIsInstance(self.ui.confirm_dialog, Gtk.MessageDialog)
361
363
def test_confirm_dialog_creation_params(self):
362
364
"""The confirm dialog dialog is created with the expected params."""
363
365
self.assertEqual(self.ui.confirm_dialog.args, ())
366
flags = Gtk.DialogFlags.MODAL | Gtk.DialogFlags.DESTROY_WITH_PARENT
364
367
kwargs = dict(parent=self.ui,
365
flags=gtk.DIALOG_MODAL | gtk.DIALOG_DESTROY_WITH_PARENT,
366
type=gtk.MESSAGE_QUESTION,
367
buttons=gtk.BUTTONS_YES_NO)
369
type=Gtk.MessageType.QUESTION,
370
buttons=Gtk.ButtonsType.YES_NO)
368
371
self.assertEqual(self.ui.confirm_dialog.kwargs, kwargs)
370
373
def test_confirm_dialog_title(self):
429
432
def test_file_chooser(self):
430
433
"""The file chooser dialog is properly created."""
431
self.assertIsInstance(self.ui.file_chooser, gtk.FileChooserDialog)
434
self.assertIsInstance(self.ui.file_chooser, Gtk.FileChooserDialog)
433
436
self.assertEqual(self.ui.file_chooser.args, ())
434
437
kwargs = dict(title=ADD_NEW_FOLDER, parent=None,
435
action=gtk.FILE_CHOOSER_ACTION_SELECT_FOLDER,
436
buttons=(gtk.STOCK_CANCEL, gtk.RESPONSE_CANCEL,
437
gtk.STOCK_OPEN, gtk.RESPONSE_ACCEPT))
438
action=Gtk.FileChooserAction.SELECT_FOLDER,
439
buttons=(Gtk.STOCK_CANCEL, Gtk.ResponseType.CANCEL,
440
Gtk.STOCK_OPEN, Gtk.ResponseType.ACCEPT))
438
441
self.assertEqual(self.ui.file_chooser.kwargs, kwargs)
440
443
def test_on_subscribed_renderer_toggled(self):
450
453
@defer.inlineCallbacks
451
454
def test_on_add_folder_button_clicked_file_chooser_cancel(self):
452
455
"""When the file choosing is canceled, the backend is not called."""
453
self.patch(self.ui.file_chooser, 'response', gtk.RESPONSE_CANCEL)
456
self.patch(self.ui.file_chooser, 'response', Gtk.ResponseType.CANCEL)
454
457
yield self.ui.add_folder_button.clicked()
456
459
self.assert_methods_called(self.ui.file_chooser, ['run', 'hide'])
460
463
@defer.inlineCallbacks
461
464
def test_on_add_folder_button_clicked_file_chooser_close(self):
462
465
"""When the file choosing is closed, the backend is not called."""
463
self.patch(self.ui.file_chooser, 'response', gtk.RESPONSE_CLOSE)
466
self.patch(self.ui.file_chooser, 'response', Gtk.ResponseType.CLOSE)
464
467
yield self.ui.add_folder_button.clicked()
466
469
self.assert_methods_called(self.ui.file_chooser, ['run', 'hide'])
471
474
def test_on_add_folder_button_clicked_file_chooser_accept(self):
472
475
"""When the add_folder_button is clicked, the backend is called."""
473
476
self.patch(self.ui, 'load', self._set_called)
474
self.patch(self.ui.file_chooser, 'response', gtk.RESPONSE_ACCEPT)
477
self.patch(self.ui.file_chooser, 'response', Gtk.ResponseType.ACCEPT)
477
480
"""Perform a middle check."""
515
518
def test_remove_folder_button_disabled(self):
516
519
"""When there is no folder selected, the remove button is disabled."""
517
self.ui.view.get_selection().unselect_path('0')
520
self.ui.view.get_selection().unselect_all()
518
521
self.ui.on_view_cursor_changed()
519
522
self.assertFalse(self.ui.remove_folder_button.get_sensitive())
539
542
def test_on_remove_folder_button_clicked_closes_dialog(self):
540
543
"""If the user closes the dialog, nothing is done."""
541
544
self.patch(self.ui.confirm_dialog, 'response',
542
gtk.RESPONSE_DELETE_EVENT)
545
Gtk.ResponseType.DELETE_EVENT)
543
546
yield self.ui.remove_folder_button.clicked()
545
548
self.assert_no_method_called(self.ui.sd)
548
551
@defer.inlineCallbacks
549
552
def test_on_remove_folder_button_clicked_answers_no(self):
550
553
"""If the user answers no, nothing is done."""
551
self.patch(self.ui.confirm_dialog, 'response', gtk.RESPONSE_NO)
554
self.patch(self.ui.confirm_dialog, 'response', Gtk.ResponseType.NO)
552
555
yield self.ui.remove_folder_button.clicked()
554
557
self.assert_no_method_called(self.ui.sd)
557
560
@defer.inlineCallbacks
558
561
def test_on_remove_folder_button_clicked_answers_yes(self):
559
562
"""If the user answers yes, sd.delete_folder is called."""
560
self.patch(self.ui.confirm_dialog, 'response', gtk.RESPONSE_YES)
563
self.patch(self.ui.confirm_dialog, 'response', Gtk.ResponseType.YES)
563
566
"""Perform a middle check."""