def setUp(self): # noqa """Create test data.""" self.table = 'files' self.db_file = create_db(self.table) self.datasource = _FilesDataSource( self.db_file, self.table, None, [ { 'column': 'Parent', 'type': 'str' }, { 'column': 'Filename', 'type': 'str' }, { 'column': 'Flatname', 'type': 'str' }, { 'column': 'CHildren', 'type': 'int' }, ], ensure_selected_column=False, ) self.model = DataGridModel(self.datasource, None, None) self.model.active_params['order_by'] = '__id' self.model.refresh()
def setUp(self): # noqa """Create test data.""" self.datagrid_model = DataGridModel( data_source=SQLiteDataSource('', 'test', ensure_selected_column=False), get_media_callback=mock.MagicMock(), decode_fallback=mock.MagicMock())
def setUp(self): # noqa """Create test data.""" self.datagrid_model = DataGridModel( data_source=SQLiteDataSource( '', 'test', ensure_selected_column=False), get_media_callback=mock.MagicMock(), decode_fallback=mock.MagicMock() )
def setUp(self): # noqa """Create test data.""" self.table = 'files' self.db_file = create_db(self.table) self.datasource = _FilesDataSource( self.db_file, self.table, None, [ {'column': 'Parent', 'type': 'str'}, {'column': 'Filename', 'type': 'str'}, {'column': 'Flatname', 'type': 'str'}, {'column': 'CHildren', 'type': 'int'}, ], ensure_selected_column=False, ) self.model = DataGridModel(self.datasource, None, None) self.model.active_params['order_by'] = '__id' self.model.refresh()
class TransformationsTest(unittest.TestCase): """Test transformations done by DataGridModel.""" _ESCAPED_HTML = """ <img class="size-medium wp-image-113" style="margin: 666px;" title="xxx" src="http://something.org/xxx-111x222.jpg" alt="" width="300" /> """ _UNESCAPED_HTML = """ <img class="size-medium wp-image-113" style="margin: 666px;" title="xxx" src="http://something.org/xxx-111x222.jpg" alt="" width="300" /> """ def setUp(self): # noqa """Create test data.""" self.datagrid_model = DataGridModel( data_source=SQLiteDataSource( '', 'test', ensure_selected_column=False), get_media_callback=mock.MagicMock(), decode_fallback=mock.MagicMock() ) def test_html_transform(self): """Test html transformation on datagrid.""" self.assertEqual(self._transform('html', None), '<NULL>') self.assertEqual( self._transform('html', self._ESCAPED_HTML), '<img class="size-medium wp-image-113" style="margin: 666px;" ' 'title="xxx" src="http://something.org/x [...]') def test_html_transform_no_max_lenth(self): """Test html transformation on datagrid without max_length.""" with mock.patch('datagrid_gtk3.ui.grid.get_transformer') as gt: gt.return_value = lambda v, **kw: html_transform( v, max_length=None, oneline=True) self.assertEqual( self._transform('html', self._ESCAPED_HTML), '<img class="size-medium wp-image-113" style="margin: 666px;" ' 'title="xxx" src="http://something.org/xxx-111x222.jpg" ' 'alt="" width="300" />') def test_html_transform_no_oneline(self): """Test html transformation on datagrid without oneline.""" with mock.patch('datagrid_gtk3.ui.grid.get_transformer') as gt: gt.return_value = lambda v, **kw: html_transform( v, max_length=None, oneline=False) self.assertEqual( self._transform('html', self._ESCAPED_HTML), self._UNESCAPED_HTML) def test_timestamp_transform(self): """Return valid datetime with valid seconds input.""" self.assertEqual( self._transform('timestamp', None), '') self.assertEqual( self._transform('timestamp', 0), '1970-01-01 00:00:00') self.assertEqual( self._transform('timestamp', 1104537600), '2005-01-01 00:00:00') self.assertEqual( self._transform('timestamp', -134843428), '1965-09-23 07:29:32') self.assertEqual( self._transform('timestamp', -1), '1969-12-31 23:59:59') def test_timestamp_transform_invalid(self): """Return the value as a string when it could not be converted.""" self.assertEqual( self._transform('timestamp', 315532801000), '315532801000') self.assertEqual( self._transform('timestamp', -315532801000), '-315532801000') self.assertEqual( self._transform('timestamp', 'invalid string'), 'invalid string') self.assertEqual( self._transform('timestamp', []), '[]') def test_timestamp_ms_transform(self): """Return valid datetime with valid miliseconds input.""" self.assertEqual( self._transform('timestamp_ms', 1104537600 * 10 ** 3), '2005-01-01 00:00:00') self.assertEqual( self._transform('timestamp_ms', -134843428 * 10 ** 3), '1965-09-23 07:29:32') def test_timestamp_Ms_transform(self): """Return valid datetime with valid microseconds input.""" self.assertEqual( self._transform('timestamp_Ms', None), '') self.assertEqual( self._transform('timestamp_Ms', 1104537600 * 10 ** 6), '2005-01-01 00:00:00') self.assertEqual( self._transform('timestamp_Ms', -134843428 * 10 ** 6), '1965-09-23 07:29:32') def test_timestamp_apple_transform(self): """Return valid datetime with valid apple timestamp input.""" self.assertEqual( self._transform('timestamp_apple', None), '') self.assertEqual( self._transform('timestamp_apple', 0), '2001-01-01 00:00:00') self.assertEqual( self._transform('timestamp_apple', 1104537600), '2036-01-02 00:00:00') self.assertEqual( self._transform('timestamp_apple', -134843428), '1996-09-23 07:29:32') self.assertEqual( self._transform('timestamp_apple', -1), '2000-12-31 23:59:59') def test_timestamp_webkit_transform(self): """Return valid datetime with valid webkit timestamp input.""" self.assertEqual( self._transform('timestamp_webkit', None), '') self.assertEqual( self._transform('timestamp_webkit', 0), '1601-01-01 00:00:00') self.assertEqual( self._transform('timestamp_webkit', 1104537600), '1601-01-01 00:18:24') self.assertEqual( self._transform('timestamp_webkit', 1104537600 * 10 ** 6), '1636-01-02 00:00:00') self.assertEqual( self._transform('timestamp_webkit', -134843428 * 10 ** 6), '1596-09-23 07:29:32') self.assertEqual( self._transform('timestamp_webkit', -1), '1600-12-31 23:59:59') def test_timestamp_julian_transform(self): """Return valid datetime with valid julian date input.""" self.assertEqual( self._transform('timestamp_julian', None), '') self.assertEqual( self._transform('timestamp_julian', 2457093.5), '2015-03-12 00:00:00') self.assertEqual( self._transform('timestamp_julian', 2457093.75), '2015-03-12 06:00:00') self.assertEqual( self._transform('timestamp_julian', 2440587.5), '1970-01-01 00:00:00') self.assertEqual( self._transform('timestamp_julian', 2439283.0), '1966-06-06 12:00:00') def test_timestamp_julian_date_transform(self): """Return valid datetime with valid julian date input.""" self.assertEqual( self._transform('timestamp_julian_date', None), '') self.assertEqual( self._transform('timestamp_julian_date', 2457093.5), '2015-03-12') self.assertEqual( self._transform('timestamp_julian_date', 2457093.75), '2015-03-12') self.assertEqual( self._transform('timestamp_julian_date', 2440587.5), '1970-01-01') self.assertEqual( self._transform('timestamp_julian_date', 2439283.0), '1966-06-06') def test_timestamp_midnight_transform(self): """Return valid time with valid seconds after midnight input.""" self.assertEqual( self._transform('timestamp_midnight', None), '') self.assertEqual( self._transform('timestamp_midnight', 0), '00:00:00') self.assertEqual( self._transform('timestamp_midnight', 530), '00:08:50') self.assertEqual( self._transform('timestamp_midnight', 8493), '02:21:33') def test_timestamp_midnight_ms_transform(self): """Return valid time with valid miliseconds after midnight input.""" self.assertEqual( self._transform('timestamp_midnight_ms', None), '') self.assertEqual( self._transform('timestamp_midnight_ms', 0), '00:00:00') self.assertEqual( self._transform('timestamp_midnight_ms', 530 * 10 ** 3), '00:08:50') self.assertEqual( self._transform('timestamp_midnight_ms', 8493 * 10 ** 3), '02:21:33') def test_timestamp_midnight_Ms_transform(self): """Return valid time with valid microseconds after midnight input.""" self.assertEqual( self._transform('timestamp_midnight_Ms', None), '') self.assertEqual( self._transform('timestamp_midnight_Ms', 0), '00:00:00') self.assertEqual( self._transform('timestamp_midnight_Ms', 530 * 10 ** 6), '00:08:50') self.assertEqual( self._transform('timestamp_midnight_Ms', 8493 * 10 ** 6), '02:21:33') def test_datetime_transform(self): """Return datetime in isoformat after datetime.datetime input.""" self.assertEqual( self._transform('datetime', datetime.datetime(2015, 3, 11)), '2015-03-11 00:00:00') self.assertEqual( self._transform('datetime', datetime.datetime(2000, 8, 22, 6, 12)), '2000-08-22 06:12:00') def test_bytes_transform(self): """Test bytes humanization.""" self.assertEqual( self._transform('bytes', 1), '1.0 B') self.assertEqual( self._transform('bytes', 50), '50.0 B') self.assertEqual( self._transform('bytes', 2348), '2.3 kB') self.assertEqual( self._transform('bytes', 1420000), '1.4 MB') self.assertEqual( self._transform('bytes', 1420000328), '1.3 GB') self.assertEqual( self._transform('bytes', 24200003283214), '22.0 TB') @mock.patch('datagrid_gtk3.ui.grid.NO_IMAGE_PIXBUF.scale_simple') def test_image_transform_no_value(self, scale_simple): """Return an invisible image when no value is provided.""" returned_value = object() scale_simple.return_value = returned_value self.datagrid_model.image_max_size = 50 self.assertEqual( self._transform('image', None), returned_value) self.assertEqual( self._transform('image', None), returned_value) # Even though we called _image_transform twice, the second one # was taken from the cache scale_simple.assert_called_once_with( 50, 50, GdkPixbuf.InterpType.NEAREST) def test_image_transform_with_border(self): """Make sure the right functions are called to transform the image.""" image = Image.open(imageutils.get_icon_filename(['image'], 48)) image.load() _add_border_func = imageutils.add_border def _add_border(*args, **kwargs): _add_border_func(*args, **kwargs) return image _add_drop_shadow_func = imageutils.add_drop_shadow def _add_drop_shadow(*args, **kwargs): _add_drop_shadow_func(*args, **kwargs) return image cm = imageutils.ImageCacheManager.get_default() self.datagrid_model.image_draw_border = True self.datagrid_model.image_load_on_thread = False self.datagrid_model.image_max_size = 123 with contextlib.nested( mock.patch('datagrid_gtk3.utils.imageutils.add_drop_shadow'), mock.patch('datagrid_gtk3.utils.imageutils.add_border'), mock.patch('datagrid_gtk3.utils.imageutils.Image.open'), mock.patch.object(image, 'thumbnail')) as ( add_drop_shadow, add_border, open_, thumbnail): add_border.side_effect = _add_border add_drop_shadow.side_effect = _add_drop_shadow open_.return_value = image self.assertIsInstance( self._transform('image', 'file:///xxx'), GdkPixbuf.Pixbuf) thumbnail.assert_called_once_with((123, 123), Image.BICUBIC) open_.assert_called_once_with('/xxx') add_border.assert_called_once_with( image, border_size=cm.IMAGE_BORDER_SIZE) add_drop_shadow.assert_called_once_with( image, border_size=cm.IMAGE_BORDER_SIZE, offset=(cm.IMAGE_SHADOW_OFFSET, cm.IMAGE_SHADOW_OFFSET)) @mock.patch('datagrid_gtk3.utils.imageutils.add_drop_shadow') @mock.patch('datagrid_gtk3.utils.imageutils.add_border') def test_image_transform_without_border(self, add_border, add_drop_shadow): """Make sure the right functions are called to transform the image.""" image = Image.open(imageutils.get_icon_filename(['unknown'], 48)) image.load() add_border.return_value = image add_drop_shadow.return_value = image self.datagrid_model.image_max_size = 123 self.datagrid_model.image_draw_border = False self.datagrid_model.image_load_on_thread = False with contextlib.nested( mock.patch('datagrid_gtk3.utils.imageutils.Image.open'), mock.patch.object(image, 'thumbnail')) as (open_, thumbnail): open_.return_value = image self.assertIsInstance( self._transform('image', 'file:///xxx'), GdkPixbuf.Pixbuf) thumbnail.assert_called_once_with((123, 123), Image.BICUBIC) open_.assert_called_once_with('/xxx') # This is because of a PIL issue. See # datagrid_gtk3.utils.transformations.image_transform for more # details self.assertEqual(add_border.call_count, 1) self.assertEqual(add_drop_shadow.call_count, 0) def test_custom_transform(self): """Test custom transformations.""" def test_transform(value, options=1): return options * value.upper() transformations.register_transformer('test', test_transform) try: self.assertEqual(self._transform('test', 'x'), 'X') self.assertEqual( self._transform('test', 'x', transform_options=2), 'XX') finally: transformations.unregister_transformer('test') def _transform(self, transform_type, value, transform_options=None): self.datagrid_model.columns = [ {'name': transform_type, 'transform': transform_type, 'transform_options': transform_options, 'from_config': True}] return self.datagrid_model.get_formatted_value(value, 0)
class DataGridModelTreeTest(unittest.TestCase): """Test for DataGridModel using an hierarchical data source.""" def setUp(self): # noqa """Create test data.""" self.table = 'files' self.db_file = create_db(self.table) self.datasource = _FilesDataSource( self.db_file, self.table, None, [ {'column': 'Parent', 'type': 'str'}, {'column': 'Filename', 'type': 'str'}, {'column': 'Flatname', 'type': 'str'}, {'column': 'CHildren', 'type': 'int'}, ], ensure_selected_column=False, ) self.model = DataGridModel(self.datasource, None, None) self.model.active_params['order_by'] = '__id' self.model.refresh() def test_hierarchy(self): """Test that iter rows will load database rows as required.""" self.assertEqual(self.model.rows.children_len, 4) self.assertEqual( [row.data[0] for row in self.model.rows], ['file-0', 'file-1', 'folder-0', 'folder-1']) self.assertEqual(self.model.rows.path, ()) # folder-0 self.assertEqual(len(self.model.rows[2]), 0) self.assertEqual(self.model.rows[2].children_len, 2) self.model.add_rows(parent_node=self.model.rows[2]) self.assertEqual( [row.data[0] for row in self.model.rows[2]], ['file-0-0', 'file-0-1']) self.assertEqual(self.model.rows[2].path, (2, )) # folder-1 self.assertEqual(len(self.model.rows[3]), 0) self.assertEqual(self.model.rows[3].children_len, 3) self.model.add_rows(parent_node=self.model.rows[3]) self.assertEqual( [row.data[0] for row in self.model.rows[3]], ['file-1-0', 'file-1-1', 'folder-1-0']) self.assertEqual(self.model.rows[3].path, (3, )) # folder-1-0 self.assertEqual(len(self.model.rows[3][2]), 0) self.assertEqual(self.model.rows[3][2].children_len, 1) self.model.add_rows(parent_node=self.model.rows[3][2]) self.assertEqual( [row.data[0] for row in self.model.rows[3][2]], ['file-1-0-0']) self.assertEqual(self.model.rows[3][2].path, (3, 2)) def test_iter_rows(self): """Test that iter rows will load database rows as required.""" self.assertNotEqual( {tuple(row.data) for row in self.model.iter_rows(load_rows=False)}, set(TEST_DATA[self.table]['data'])) self.assertEqual( {tuple(row.data) for row in self.model.iter_rows(load_rows=True)}, set(TEST_DATA[self.table]['data'])) def test_get_iter(self): """Test that get_iter returns a valid way to access data.""" for path, expected_value in [ ((0, ), 'file-0'), ((3, ), 'folder-1'), ((3, 2), 'folder-1-0'), ((3, 1), 'file-1-1')]: itr = self.model.get_iter(path) self.assertEqual(self.model.get_value(itr, 0), expected_value) def test_iter_has_child(self): """Test that iter_has_child returns valid information.""" for path, has_children in [ ((0, ), False), ((3, ), True), ((3, 2), True), ((3, 1), False)]: itr = self.model.get_iter(path) self.assertEqual(self.model.iter_has_child(itr), has_children) def test_iter_n_children(self): """Test that iter_m_childrem returns valid number of children.""" for path, children_len in [ ((0, ), 0), ((3, ), 3), ((3, 2), 1), ((3, 1), 0)]: itr = self.model.get_iter(path) self.assertEqual(self.model.iter_n_children(itr), children_len) def test_iter_parent(self): """Test that iter_parent returns valid parent for row.""" for path in [(0, ), (3, )]: itr = self.model.get_iter(path) self.assertEqual(self.model.iter_parent(itr), None) for path, parent_path in [ ((3, 2), (3, )), ((3, 1), (3, ))]: # Iter is not the same and comparing them will fail, even if they # are pointing to the same row. Use path for this comparison. parent = self.model.get_path(self.model.get_iter(parent_path)) itr = self.model.get_iter(path) def test_iter_next(self): """Test that iter_next returns iter for parent's next row.""" for path, next_path in [ ((2, ), (3, )), ((3, 1), (3, 2))]: # Iter is not the same and comparing them will fail, even if they # are pointing to the same row. Use path for this comparison. itr = self.model.get_iter(path) self.assertEqual( self.model.get_path(self.model.iter_next(itr)), self.model.get_path(self.model.get_iter(next_path))) def test_iter_nth_child(self): """Test that iter_nth_child returns iter parent's for nth child.""" for path, pos, child_path in [ (None, 1, (1, )), ((3, ), 1, (3, 1))]: # Iter is not the same and comparing them will fail, even if they # are pointing to the same row. Use path for this comparison. itr = path and self.model.get_iter(path) self.assertEqual( self.model.get_path(self.model.iter_nth_child(itr, pos)), self.model.get_path(self.model.get_iter(child_path))) def test_iter_children(self): """Test that iter_children returns iter fir parent's first child.""" # Iter is not the same and comparing them will fail, even if they # are pointing to the same row. Use path for this comparison. path = self.model.get_path(self.model.get_iter((0, ))) self.assertEqual( self.model.get_path(self.model.iter_children()), path) itr = self.model.get_iter((3, )) self.assertEqual( self.model.get_path(self.model.iter_children(itr)), self.model.get_path(self.model.get_iter((3, 0))))
class TransformationsTest(unittest.TestCase): """Test transformations done by DataGridModel.""" _ESCAPED_HTML = """ <img class="size-medium wp-image-113" style="margin: 666px;" title="xxx" src="http://something.org/xxx-111x222.jpg" alt="" width="300" /> """ _UNESCAPED_HTML = """ <img class="size-medium wp-image-113" style="margin: 666px;" title="xxx" src="http://something.org/xxx-111x222.jpg" alt="" width="300" /> """ def setUp(self): # noqa """Create test data.""" self.datagrid_model = DataGridModel( data_source=SQLiteDataSource('', 'test', ensure_selected_column=False), get_media_callback=mock.MagicMock(), decode_fallback=mock.MagicMock()) def test_html_transform(self): """Test html transformation on datagrid.""" self.assertEqual(self._transform('html', None), '<NULL>') self.assertEqual( self._transform('html', self._ESCAPED_HTML), '<img class="size-medium wp-image-113" style="margin: 666px;" ' 'title="xxx" src="http://something.org/x [...]') def test_html_transform_no_max_lenth(self): """Test html transformation on datagrid without max_length.""" with mock.patch('datagrid_gtk3.ui.grid.get_transformer') as gt: gt.return_value = lambda v, **kw: html_transform( v, max_length=None, oneline=True) self.assertEqual( self._transform('html', self._ESCAPED_HTML), '<img class="size-medium wp-image-113" style="margin: 666px;" ' 'title="xxx" src="http://something.org/xxx-111x222.jpg" ' 'alt="" width="300" />') def test_html_transform_no_oneline(self): """Test html transformation on datagrid without oneline.""" with mock.patch('datagrid_gtk3.ui.grid.get_transformer') as gt: gt.return_value = lambda v, **kw: html_transform( v, max_length=None, oneline=False) self.assertEqual(self._transform('html', self._ESCAPED_HTML), self._UNESCAPED_HTML) def test_timestamp_transform(self): """Return valid datetime with valid seconds input.""" self.assertEqual(self._transform('timestamp', None), '') self.assertEqual(self._transform('timestamp', 0), '1970-01-01 00:00:00') self.assertEqual(self._transform('timestamp', 1104537600), '2005-01-01 00:00:00') self.assertEqual(self._transform('timestamp', -134843428), '1965-09-23 07:29:32') self.assertEqual(self._transform('timestamp', -1), '1969-12-31 23:59:59') def test_timestamp_transform_invalid(self): """Return the value as a string when it could not be converted.""" self.assertEqual(self._transform('timestamp', 315532801000), '315532801000') self.assertEqual(self._transform('timestamp', -315532801000), '-315532801000') self.assertEqual(self._transform('timestamp', 'invalid string'), 'invalid string') self.assertEqual(self._transform('timestamp', []), '[]') def test_timestamp_ms_transform(self): """Return valid datetime with valid miliseconds input.""" self.assertEqual(self._transform('timestamp_ms', 1104537600 * 10**3), '2005-01-01 00:00:00') self.assertEqual(self._transform('timestamp_ms', -134843428 * 10**3), '1965-09-23 07:29:32') def test_timestamp_Ms_transform(self): """Return valid datetime with valid microseconds input.""" self.assertEqual(self._transform('timestamp_Ms', None), '') self.assertEqual(self._transform('timestamp_Ms', 1104537600 * 10**6), '2005-01-01 00:00:00') self.assertEqual(self._transform('timestamp_Ms', -134843428 * 10**6), '1965-09-23 07:29:32') def test_timestamp_apple_transform(self): """Return valid datetime with valid apple timestamp input.""" self.assertEqual(self._transform('timestamp_apple', None), '') self.assertEqual(self._transform('timestamp_apple', 0), '2001-01-01 00:00:00') self.assertEqual(self._transform('timestamp_apple', 1104537600), '2036-01-02 00:00:00') self.assertEqual(self._transform('timestamp_apple', -134843428), '1996-09-23 07:29:32') self.assertEqual(self._transform('timestamp_apple', -1), '2000-12-31 23:59:59') def test_timestamp_webkit_transform(self): """Return valid datetime with valid webkit timestamp input.""" self.assertEqual(self._transform('timestamp_webkit', None), '') self.assertEqual(self._transform('timestamp_webkit', 0), '1601-01-01 00:00:00') self.assertEqual(self._transform('timestamp_webkit', 1104537600), '1601-01-01 00:18:24') self.assertEqual( self._transform('timestamp_webkit', 1104537600 * 10**6), '1636-01-02 00:00:00') self.assertEqual( self._transform('timestamp_webkit', -134843428 * 10**6), '1596-09-23 07:29:32') self.assertEqual(self._transform('timestamp_webkit', -1), '1600-12-31 23:59:59') def test_timestamp_julian_transform(self): """Return valid datetime with valid julian date input.""" self.assertEqual(self._transform('timestamp_julian', None), '') self.assertEqual(self._transform('timestamp_julian', 2457093.5), '2015-03-12 00:00:00') self.assertEqual(self._transform('timestamp_julian', 2457093.75), '2015-03-12 06:00:00') self.assertEqual(self._transform('timestamp_julian', 2440587.5), '1970-01-01 00:00:00') self.assertEqual(self._transform('timestamp_julian', 2439283.0), '1966-06-06 12:00:00') def test_timestamp_julian_date_transform(self): """Return valid datetime with valid julian date input.""" self.assertEqual(self._transform('timestamp_julian_date', None), '') self.assertEqual(self._transform('timestamp_julian_date', 2457093.5), '2015-03-12') self.assertEqual(self._transform('timestamp_julian_date', 2457093.75), '2015-03-12') self.assertEqual(self._transform('timestamp_julian_date', 2440587.5), '1970-01-01') self.assertEqual(self._transform('timestamp_julian_date', 2439283.0), '1966-06-06') def test_timestamp_midnight_transform(self): """Return valid time with valid seconds after midnight input.""" self.assertEqual(self._transform('timestamp_midnight', None), '') self.assertEqual(self._transform('timestamp_midnight', 0), '00:00:00') self.assertEqual(self._transform('timestamp_midnight', 530), '00:08:50') self.assertEqual(self._transform('timestamp_midnight', 8493), '02:21:33') def test_timestamp_midnight_ms_transform(self): """Return valid time with valid miliseconds after midnight input.""" self.assertEqual(self._transform('timestamp_midnight_ms', None), '') self.assertEqual(self._transform('timestamp_midnight_ms', 0), '00:00:00') self.assertEqual(self._transform('timestamp_midnight_ms', 530 * 10**3), '00:08:50') self.assertEqual( self._transform('timestamp_midnight_ms', 8493 * 10**3), '02:21:33') def test_timestamp_midnight_Ms_transform(self): """Return valid time with valid microseconds after midnight input.""" self.assertEqual(self._transform('timestamp_midnight_Ms', None), '') self.assertEqual(self._transform('timestamp_midnight_Ms', 0), '00:00:00') self.assertEqual(self._transform('timestamp_midnight_Ms', 530 * 10**6), '00:08:50') self.assertEqual( self._transform('timestamp_midnight_Ms', 8493 * 10**6), '02:21:33') def test_datetime_transform(self): """Return datetime in isoformat after datetime.datetime input.""" self.assertEqual( self._transform('datetime', datetime.datetime(2015, 3, 11)), '2015-03-11 00:00:00') self.assertEqual( self._transform('datetime', datetime.datetime(2000, 8, 22, 6, 12)), '2000-08-22 06:12:00') def test_bytes_transform(self): """Test bytes humanization.""" self.assertEqual(self._transform('bytes', 1), '1.0 B') self.assertEqual(self._transform('bytes', 50), '50.0 B') self.assertEqual(self._transform('bytes', 2348), '2.3 kB') self.assertEqual(self._transform('bytes', 1420000), '1.4 MB') self.assertEqual(self._transform('bytes', 1420000328), '1.3 GB') self.assertEqual(self._transform('bytes', 24200003283214), '22.0 TB') @mock.patch('datagrid_gtk3.ui.grid.NO_IMAGE_PIXBUF.scale_simple') def test_image_transform_no_value(self, scale_simple): """Return an invisible image when no value is provided.""" returned_value = object() scale_simple.return_value = returned_value self.datagrid_model.image_max_size = 50 self.assertEqual(self._transform('image', None), returned_value) self.assertEqual(self._transform('image', None), returned_value) # Even though we called _image_transform twice, the second one # was taken from the cache scale_simple.assert_called_once_with(50, 50, GdkPixbuf.InterpType.NEAREST) def test_image_transform_with_border(self): """Make sure the right functions are called to transform the image.""" image = Image.open(imageutils.get_icon_filename(['image'], 48)) image.load() _add_border_func = imageutils.add_border def _add_border(*args, **kwargs): _add_border_func(*args, **kwargs) return image _add_drop_shadow_func = imageutils.add_drop_shadow def _add_drop_shadow(*args, **kwargs): _add_drop_shadow_func(*args, **kwargs) return image cm = imageutils.ImageCacheManager.get_default() self.datagrid_model.image_draw_border = True self.datagrid_model.image_load_on_thread = False self.datagrid_model.image_max_size = 123 with contextlib.nested( mock.patch('datagrid_gtk3.utils.imageutils.add_drop_shadow'), mock.patch('datagrid_gtk3.utils.imageutils.add_border'), mock.patch('datagrid_gtk3.utils.imageutils.Image.open'), mock.patch.object(image, 'thumbnail')) as (add_drop_shadow, add_border, open_, thumbnail): add_border.side_effect = _add_border add_drop_shadow.side_effect = _add_drop_shadow open_.return_value = image self.assertIsInstance(self._transform('image', 'file:///xxx'), GdkPixbuf.Pixbuf) thumbnail.assert_called_once_with((123, 123), Image.BICUBIC) open_.assert_called_once_with('/xxx') add_border.assert_called_once_with( image, border_size=cm.IMAGE_BORDER_SIZE) add_drop_shadow.assert_called_once_with( image, border_size=cm.IMAGE_BORDER_SIZE, offset=(cm.IMAGE_SHADOW_OFFSET, cm.IMAGE_SHADOW_OFFSET)) @mock.patch('datagrid_gtk3.utils.imageutils.add_drop_shadow') @mock.patch('datagrid_gtk3.utils.imageutils.add_border') def test_image_transform_without_border(self, add_border, add_drop_shadow): """Make sure the right functions are called to transform the image.""" image = Image.open(imageutils.get_icon_filename(['unknown'], 48)) image.load() add_border.return_value = image add_drop_shadow.return_value = image self.datagrid_model.image_max_size = 123 self.datagrid_model.image_draw_border = False self.datagrid_model.image_load_on_thread = False with contextlib.nested( mock.patch('datagrid_gtk3.utils.imageutils.Image.open'), mock.patch.object(image, 'thumbnail')) as (open_, thumbnail): open_.return_value = image self.assertIsInstance(self._transform('image', 'file:///xxx'), GdkPixbuf.Pixbuf) thumbnail.assert_called_once_with((123, 123), Image.BICUBIC) open_.assert_called_once_with('/xxx') # This is because of a PIL issue. See # datagrid_gtk3.utils.transformations.image_transform for more # details self.assertEqual(add_border.call_count, 1) self.assertEqual(add_drop_shadow.call_count, 0) def test_custom_transform(self): """Test custom transformations.""" def test_transform(value, options=1): return options * value.upper() transformations.register_transformer('test', test_transform) try: self.assertEqual(self._transform('test', 'x'), 'X') self.assertEqual(self._transform('test', 'x', transform_options=2), 'XX') finally: transformations.unregister_transformer('test') def _transform(self, transform_type, value, transform_options=None): self.datagrid_model.columns = [{ 'name': transform_type, 'transform': transform_type, 'transform_options': transform_options, 'from_config': True }] return self.datagrid_model.get_formatted_value(value, 0)
class DataGridModelTreeTest(unittest.TestCase): """Test for DataGridModel using an hierarchical data source.""" def setUp(self): # noqa """Create test data.""" self.table = 'files' self.db_file = create_db(self.table) self.datasource = _FilesDataSource( self.db_file, self.table, None, [ { 'column': 'Parent', 'type': 'str' }, { 'column': 'Filename', 'type': 'str' }, { 'column': 'Flatname', 'type': 'str' }, { 'column': 'CHildren', 'type': 'int' }, ], ensure_selected_column=False, ) self.model = DataGridModel(self.datasource, None, None) self.model.active_params['order_by'] = '__id' self.model.refresh() def test_hierarchy(self): """Test that iter rows will load database rows as required.""" self.assertEqual(self.model.rows.children_len, 4) self.assertEqual([row.data[0] for row in self.model.rows], ['file-0', 'file-1', 'folder-0', 'folder-1']) self.assertEqual(self.model.rows.path, ()) # folder-0 self.assertEqual(len(self.model.rows[2]), 0) self.assertEqual(self.model.rows[2].children_len, 2) self.model.add_rows(parent_node=self.model.rows[2]) self.assertEqual([row.data[0] for row in self.model.rows[2]], ['file-0-0', 'file-0-1']) self.assertEqual(self.model.rows[2].path, (2, )) # folder-1 self.assertEqual(len(self.model.rows[3]), 0) self.assertEqual(self.model.rows[3].children_len, 3) self.model.add_rows(parent_node=self.model.rows[3]) self.assertEqual([row.data[0] for row in self.model.rows[3]], ['file-1-0', 'file-1-1', 'folder-1-0']) self.assertEqual(self.model.rows[3].path, (3, )) # folder-1-0 self.assertEqual(len(self.model.rows[3][2]), 0) self.assertEqual(self.model.rows[3][2].children_len, 1) self.model.add_rows(parent_node=self.model.rows[3][2]) self.assertEqual([row.data[0] for row in self.model.rows[3][2]], ['file-1-0-0']) self.assertEqual(self.model.rows[3][2].path, (3, 2)) def test_iter_rows(self): """Test that iter rows will load database rows as required.""" self.assertNotEqual( {tuple(row.data) for row in self.model.iter_rows(load_rows=False)}, set(TEST_DATA[self.table]['data'])) self.assertEqual( {tuple(row.data) for row in self.model.iter_rows(load_rows=True)}, set(TEST_DATA[self.table]['data'])) def test_get_iter(self): """Test that get_iter returns a valid way to access data.""" for path, expected_value in [((0, ), 'file-0'), ((3, ), 'folder-1'), ((3, 2), 'folder-1-0'), ((3, 1), 'file-1-1')]: itr = self.model.get_iter(path) self.assertEqual(self.model.get_value(itr, 0), expected_value) def test_iter_has_child(self): """Test that iter_has_child returns valid information.""" for path, has_children in [((0, ), False), ((3, ), True), ((3, 2), True), ((3, 1), False)]: itr = self.model.get_iter(path) self.assertEqual(self.model.iter_has_child(itr), has_children) def test_iter_n_children(self): """Test that iter_m_childrem returns valid number of children.""" for path, children_len in [((0, ), 0), ((3, ), 3), ((3, 2), 1), ((3, 1), 0)]: itr = self.model.get_iter(path) self.assertEqual(self.model.iter_n_children(itr), children_len) def test_iter_parent(self): """Test that iter_parent returns valid parent for row.""" for path in [(0, ), (3, )]: itr = self.model.get_iter(path) self.assertEqual(self.model.iter_parent(itr), None) for path, parent_path in [((3, 2), (3, )), ((3, 1), (3, ))]: # Iter is not the same and comparing them will fail, even if they # are pointing to the same row. Use path for this comparison. parent = self.model.get_path(self.model.get_iter(parent_path)) itr = self.model.get_iter(path) def test_iter_next(self): """Test that iter_next returns iter for parent's next row.""" for path, next_path in [((2, ), (3, )), ((3, 1), (3, 2))]: # Iter is not the same and comparing them will fail, even if they # are pointing to the same row. Use path for this comparison. itr = self.model.get_iter(path) self.assertEqual( self.model.get_path(self.model.iter_next(itr)), self.model.get_path(self.model.get_iter(next_path))) def test_iter_nth_child(self): """Test that iter_nth_child returns iter parent's for nth child.""" for path, pos, child_path in [(None, 1, (1, )), ((3, ), 1, (3, 1))]: # Iter is not the same and comparing them will fail, even if they # are pointing to the same row. Use path for this comparison. itr = path and self.model.get_iter(path) self.assertEqual( self.model.get_path(self.model.iter_nth_child(itr, pos)), self.model.get_path(self.model.get_iter(child_path))) def test_iter_children(self): """Test that iter_children returns iter fir parent's first child.""" # Iter is not the same and comparing them will fail, even if they # are pointing to the same row. Use path for this comparison. path = self.model.get_path(self.model.get_iter((0, ))) self.assertEqual(self.model.get_path(self.model.iter_children()), path) itr = self.model.get_iter((3, )) self.assertEqual(self.model.get_path(self.model.iter_children(itr)), self.model.get_path(self.model.get_iter((3, 0))))