emmental/db/test_table.py

190 lines
5.9 KiB
Python

# Copyright 2021 (c) Anna Schumaker.
import unittest
from gi.repository import GObject
from gi.repository import Gio
from . import sql
from . import table
class FakeRow(GObject.GObject):
def __init__(self, data):
GObject.GObject.__init__(self)
self.rowid = data["fakeid"]
self.name = data["name"]
class FakeTable(table.Table):
def __init__(self):
table.Table.__init__(self, "fake_table")
self.reset()
def do_create(self):
sql.execute("CREATE TABLE IF NOT EXISTS fake_table "
"(fakeid INTEGER PRIMARY KEY, name TEXT UNIQUE)")
def do_factory(self, row):
return FakeRow(row)
def do_insert(self, name):
return sql.execute("INSERT INTO fake_table (name) VALUES (?)", [ name ])
def do_lookup(self, name):
return sql.execute("SELECT * FROM fake_table WHERE name=?", [ name ])
class FakeModel(table.Model, FakeTable):
def __init__(self):
table.Model.__init__(self, "fake_table", "lower(name)")
self.reset()
class FakeChild(table.Child):
def __init__(self):
table.Child.__init__(self, "fake_child", "parentid", "lower(name)")
self.reset()
def do_create(self):
sql.execute("CREATE TABLE IF NOT EXISTS fake_child "
"(fakeid INTEGER PRIMARY KEY, "
"parentid INTEGER, "
"name TEXT UNIQUE, "
"FOREIGN KEY(parentid) REFERENCES fake_table(fakeid))")
def do_factory(self, row):
return FakeRow(row)
def do_insert(self, parent, name):
return sql.execute("INSERT INTO fake_child (parentid, name) "
"VALUES (?,?)", [ parent.rowid, name ])
class TestTable(unittest.TestCase):
def test_init(self):
fake = FakeTable()
self.assertIsInstance(fake.cache, dict)
self.assertEqual(fake.table, "fake_table")
def test_interface(self):
with self.assertRaises(NotImplementedError):
table.Table.do_create(None)
with self.assertRaises(NotImplementedError):
table.Table.do_factory(None, None)
with self.assertRaises(NotImplementedError):
table.Table.do_insert(None, "Text")
with self.assertRaises(NotImplementedError):
table.Table.do_lookup(None, "Text")
def test_insert_delete(self):
fake = FakeTable()
row = fake.insert("Test Name")
self.assertIsInstance(row, FakeRow)
self.assertEqual(fake.cache[1], row)
self.assertEqual(fake.get(1), row)
fake.delete(row)
self.assertEqual(fake.cache, { })
def test_find(self):
fake = FakeTable()
row = fake.find("Test Name")
self.assertIsInstance(row, FakeRow)
self.assertEqual(fake.cache[1], row)
self.assertEqual(fake.find("Test Name"), row)
def test_lookup(self):
fake = FakeTable()
row = fake.insert("Test Name")
fake.cache.clear()
row = fake.lookup("Test Name")
self.assertEqual(row.name, "Test Name")
self.assertEqual(fake.cache, { 1 : row })
self.assertEqual(fake.lookup("Test Name"), row)
def test_reset(self):
fake = FakeTable()
sql.execute("SELECT fakeid,name FROM fake_table")
fake.insert("Test Name")
fake.reset()
self.assertEqual(fake.cache, { })
class TestModel(unittest.TestCase):
def items_changed(self, table, pos, rm, add):
self.changed = (pos, rm, add)
def setUp(self):
self.changed = None
def test_init(self):
fake = FakeModel()
self.assertIsInstance(fake, GObject.GObject)
self.assertIsInstance(fake, Gio.ListModel)
self.assertIsInstance(fake, table.Table)
self.assertEqual(fake.order, "lower(name)")
def test_insert_delete(self):
fake = FakeModel()
fake.connect("items-changed", self.items_changed)
row = fake.insert("Test Row")
self.assertEqual(self.changed, (0, 0, 1))
fake.delete(row)
self.assertEqual(self.changed, (0, 1, 0))
def test_model(self):
fake = FakeModel()
self.assertEqual(fake.get_item_type(), GObject.TYPE_PYOBJECT)
self.assertEqual(fake.get_n_items(), 0)
c = fake.insert("C")
self.assertEqual(fake.get_n_items(), 1)
self.assertEqual(fake.get_item(0), c)
b = fake.insert("B")
self.assertEqual(fake.get_n_items(), 2)
self.assertEqual(fake.get_item(0), b)
self.assertEqual(fake.get_item(1), c)
a = fake.insert("A")
self.assertEqual(fake.get_n_items(), 3)
self.assertEqual(fake.get_item(0), a)
self.assertEqual(fake.get_item(1), b)
self.assertEqual(fake.get_item(2), c)
def test_reset(self):
fake = FakeModel()
fake.insert("Test Row")
fake.insert("Test Row 2")
fake.connect("items-changed", self.items_changed)
fake.reset()
self.assertEqual(self.changed, (0, 2, 0))
class TestChild(unittest.TestCase):
def test_init(self):
child = FakeChild()
self.assertIsInstance(child, table.Table)
self.assertEqual(child.parent, "parentid")
self.assertEqual(child.order, "lower(name)")
def test_children(self):
model = FakeModel()
child = FakeChild()
parent = model.insert("Fake Parent")
self.assertEqual(child.get_n_children(parent), 0)
c = child.insert(parent, "C")
b = child.insert(parent, "B")
a = child.insert(parent, "A")
self.assertEqual(child.get_n_children(parent), 3)
self.assertEqual(child.get_child(parent, 0), a)
self.assertEqual(child.get_child(parent, 1), b)
self.assertEqual(child.get_child(parent, 2), c)
self.assertEqual(child.get_child_index(parent, a), 0)
self.assertEqual(child.get_child_index(parent, b), 1)
self.assertEqual(child.get_child_index(parent, c), 2)