465
469
self.theme_hist = theme.ThemeHistory()
466
470
self.widgets_frontend_state = frontendstate.WidgetsFrontendState()
472
def check_fixed_value(self, obj, column_name, value, disk_value=None):
473
obj = self.reload_object(obj)
474
self.assertEquals(getattr(obj, column_name), value)
475
# make sure the values stored on disk are correct as well
476
if disk_value is None:
478
obj_schema = app.db._schema_map[obj.__class__]
479
app.db.cursor.execute("SELECT %s FROM %s WHERE id=?" % (column_name,
480
obj_schema.table_name), (obj.id,))
481
row = app.db.cursor.fetchone()
482
for name, schema_item in obj_schema.fields:
483
if name == column_name:
485
sql_value = app.db._converter.to_sql(obj_schema, column_name,
486
schema_item, disk_value)
487
self.assertEqual(row[0], sql_value)
468
489
def test_corrupt_status(self):
469
490
app.db.cursor.execute("UPDATE remote_downloader "
470
491
"SET status='{baddata' WHERE id=?", (self.downloader.id,))
471
reloaded = self.reload_object(self.downloader)
472
492
# setup_restored sets some values for status, so we will have more
473
493
# than an empty dict
474
self.assertEquals(reloaded.status,
475
{'rate': 0, 'upRate': 0, 'eta': 0})
494
self.check_fixed_value(self.downloader, 'status',
495
{'rate': 0, 'upRate': 0, 'eta': 0}, disk_value={})
477
497
def test_corrupt_feedparser_output(self):
478
498
app.db.cursor.execute("UPDATE item "
479
499
"SET feedparser_output='{baddata' WHERE id=?", (self.item.id,))
480
reloaded = self.reload_object(self.item)
481
self.assertEquals(reloaded.feedparser_output, {})
500
self.check_fixed_value(self.item, 'feedparser_output', {})
483
502
def test_corrupt_etag(self):
484
503
app.db.cursor.execute("UPDATE rss_multi_feed_impl "
485
504
"SET etag='{baddata' WHERE ufeed_id=?", (self.feed.id,))
486
reloaded = self.reload_object(self.feed.actualFeed)
487
self.assertEquals(reloaded.etag, {})
505
self.check_fixed_value(self.feed.actualFeed, 'etag', {})
489
507
def test_corrupt_modified(self):
490
508
app.db.cursor.execute("UPDATE rss_multi_feed_impl "
491
509
"SET modified='{baddata' WHERE ufeed_id=?", (self.feed.id,))
492
reloaded = self.reload_object(self.feed.actualFeed)
493
self.assertEquals(reloaded.modified, {})
510
self.check_fixed_value(self.feed.actualFeed, 'modified', {})
495
512
def test_corrupt_tab_ids(self):
496
513
app.db.cursor.execute("UPDATE taborder_order "
497
514
"SET tab_ids='[1, 2; 3 ]' WHERE id=?", (self.tab_order.id,))
498
515
reloaded = self.reload_object(self.tab_order)
516
self.check_fixed_value(reloaded, 'tab_ids', [])
517
# check that restore_tab_list() re-adds the tab ids
499
518
reloaded.restore_tab_list()
500
self.assertEquals(reloaded.tab_ids, [self.feed.id])
519
self.check_fixed_value(reloaded, 'tab_ids', [self.feed.id])
502
521
def test_corrupt_allowed_urls(self):
503
522
app.db.cursor.execute("UPDATE channel_guide "
504
523
"SET allowedURLs='[1, 2; 3 ]' WHERE id=?", (self.guide.id,))
505
reloaded = self.reload_object(self.guide)
506
self.assertEquals(reloaded.allowedURLs, [])
524
self.check_fixed_value(self.guide, 'allowedURLs', [])
508
526
def test_corrupt_past_themes(self):
509
527
app.db.cursor.execute("UPDATE theme_history "
510
528
"SET pastThemes='[1, 2; 3 ]' WHERE id=?", (self.theme_hist.id,))
511
reloaded = self.reload_object(self.theme_hist)
512
self.assertEquals(reloaded.pastThemes, [])
529
self.check_fixed_value(self.theme_hist, 'pastThemes', [])
514
531
def test_corrupt_list_view_displays(self):
515
532
app.db.cursor.execute("UPDATE widgets_frontend_state "
516
533
"SET list_view_displays='[1, 2; 3 ]' WHERE id=?",
517
534
(self.widgets_frontend_state.id,))
518
reloaded = self.reload_object(self.widgets_frontend_state)
519
self.assertEquals(reloaded.list_view_displays, [])
535
self.check_fixed_value(self.widgets_frontend_state,
536
'list_view_displays', [])
521
538
def test_corrupt_link_history(self):
522
539
# TODO: should test ScraperFeedIpml.linkHistory, but it's not so easy
523
540
# to create a ScraperFeedIpml in the unit tests.
543
class BadTabOrderTest(StoreDatabaseTest):
544
# Test TabOrder objects with the wrong order
546
StoreDatabaseTest.setUp(self)
547
self.f1 = feed.Feed(u"http://example.com/1")
548
self.f2 = feed.Feed(u"http://example.com/2")
549
self.folder = folder.ChannelFolder(u'test channel folder')
550
self.tab_order = tabs.TabOrder(u'channel')
552
def screw_with_tab_order(self, *tab_ids):
553
app.db.cursor.execute("UPDATE taborder_order "
554
"SET tab_ids=? WHERE id=?",
555
(repr(list(tab_ids)), self.tab_order.id,))
557
def check_order(self, *tab_ids):
558
self.tab_order = self.reload_object(self.tab_order)
559
self.tab_order.restore_tab_list()
560
self.assertEqual(self.tab_order.tab_ids, list(tab_ids))
562
def test_missing_tab_ids(self):
563
self.screw_with_tab_order(self.f1.id, self.folder.id)
564
self.check_order(self.f1.id, self.folder.id, self.f2.id)
566
def test_missing_folder_ids(self):
567
self.screw_with_tab_order(self.f1.id, self.f2.id)
568
self.check_order(self.f1.id, self.f2.id, self.folder.id)
570
def test_extra_tab_ids(self):
571
self.screw_with_tab_order(self.f1.id, self.f2.id, self.folder.id, 123)
572
self.check_order(self.f1.id, self.f2.id, self.folder.id)
574
def test_order_wrong(self):
575
self.f1.set_folder(self.folder)
576
self.check_order(self.f2.id, self.folder.id, self.f1.id)
577
# f1 should follow it's parent, check that we fix things if that's not
579
self.screw_with_tab_order(self.f1.id, self.f2.id, self.folder.id)
580
self.check_order(self.f2.id, self.folder.id, self.f1.id)
526
582
if __name__ == '__main__':