X-Git-Url: https://plomlompom.com/repos/foo.html?a=blobdiff_plain;f=tests%2Fversioned_attributes.py;h=a75fc3cec338d5bed5bf5739101287cd8efa1851;hb=80491fac3c476788d90010812c9ba0b95701e09b;hp=df6fc46259d211acfa3d6a80dce0a601973ea421;hpb=908debd6dc3a56a4e39617e35d479f5683017433;p=plomtask diff --git a/tests/versioned_attributes.py b/tests/versioned_attributes.py index df6fc46..a75fc3c 100644 --- a/tests/versioned_attributes.py +++ b/tests/versioned_attributes.py @@ -1,12 +1,12 @@ """"Test Versioned Attributes in the abstract.""" from unittest import TestCase -from tests.utils import TestCaseWithDB from time import sleep from datetime import datetime -from plomtask.misc import VersionedAttribute, TIMESTAMP_FMT -from plomtask.db import BaseModel +from tests.utils import TestCaseWithDB +from plomtask.versioned_attributes import VersionedAttribute, TIMESTAMP_FMT +from plomtask.db import BaseModel -SQL_TEST_TABLE = ''' +SQL_TEST_TABLE_STR = ''' CREATE TABLE versioned_tests ( parent INTEGER NOT NULL, timestamp TEXT NOT NULL, @@ -14,13 +14,23 @@ CREATE TABLE versioned_tests ( PRIMARY KEY (parent, timestamp) ); ''' +SQL_TEST_TABLE_FLOAT = ''' +CREATE TABLE versioned_tests ( + parent INTEGER NOT NULL, + timestamp TEXT NOT NULL, + value REAL NOT NULL, + PRIMARY KEY (parent, timestamp) +); +''' + + class TestParentType(BaseModel[int]): - pass + """Dummy abstracting whatever may use VersionedAttributes.""" class TestsSansDB(TestCase): """Tests not requiring DB setup.""" - + def test_VersionedAttribute_set(self) -> None: """Test .set() behaves as expected.""" # check value gets set even if already is the default @@ -36,7 +46,7 @@ class TestsSansDB(TestCase): # check that different value _will_ be set/added attr.set('B') self.assertEqual(sorted(attr.history.values()), ['A', 'B']) - # check that a previously used value can be set if not most recent + # check that a previously used value can be set if not most recent attr.set('A') self.assertEqual(sorted(attr.history.values()), ['A', 'A', 'B']) # again check for same value not being set twice in a row, even for @@ -45,7 +55,7 @@ class TestsSansDB(TestCase): self.assertEqual(sorted(attr.history.values()), ['A', 'A', 'B', 'D']) attr.set('D') self.assertEqual(sorted(attr.history.values()), ['A', 'A', 'B', 'D']) - + def test_VersionedAttribute_newest(self) -> None: """Test .newest returns newest element, or default on empty.""" attr = VersionedAttribute(None, '', 'A') @@ -53,73 +63,82 @@ class TestsSansDB(TestCase): attr.set('B') self.assertEqual(attr.newest, 'B') attr.set('C') - + def test_VersionedAttribute_at(self) -> None: """Test .at() returns values nearest to queried time, or default.""" # check .at() return default on empty history attr = VersionedAttribute(None, '', 'A') - timestamp_A = datetime.now().strftime(TIMESTAMP_FMT) - self.assertEqual(attr.at(timestamp_A), 'A') - # check value exactly at timestamp returned + timestamp_a = datetime.now().strftime(TIMESTAMP_FMT) + self.assertEqual(attr.at(timestamp_a), 'A') + # check value exactly at timestamp returned attr.set('B') - timestamp_B = list(attr.history.keys())[0] - self.assertEqual(attr.at(timestamp_B), 'B') - # check earliest value returned if exists, rather than default - self.assertEqual(attr.at(timestamp_A), 'B') - # check reverts to previous value for timestamps not indexed + timestamp_b = list(attr.history.keys())[0] + self.assertEqual(attr.at(timestamp_b), 'B') + # check earliest value returned if exists, rather than default + self.assertEqual(attr.at(timestamp_a), 'B') + # check reverts to previous value for timestamps not indexed sleep(0.00001) timestamp_between = datetime.now().strftime(TIMESTAMP_FMT) sleep(0.00001) attr.set('C') - timestamp_C = sorted(attr.history.keys())[-1] - self.assertEqual(attr.at(timestamp_C), 'C') + timestamp_c = sorted(attr.history.keys())[-1] + self.assertEqual(attr.at(timestamp_c), 'C') self.assertEqual(attr.at(timestamp_between), 'B') sleep(0.00001) - timestamp_after_C = datetime.now().strftime(TIMESTAMP_FMT) - self.assertEqual(attr.at(timestamp_after_C), 'C') + timestamp_after_c = datetime.now().strftime(TIMESTAMP_FMT) + self.assertEqual(attr.at(timestamp_after_c), 'C') -class TestsWithDB(TestCaseWithDB): +class TestsWithDBStr(TestCaseWithDB): """Module tests requiring DB setup.""" + default_vals: list[str | float] = ['A', 'B', 'C'] + init_sql = SQL_TEST_TABLE_STR def setUp(self) -> None: super().setUp() - self.db_conn.exec(SQL_TEST_TABLE) + self.db_conn.exec(self.init_sql) + self.test_parent = TestParentType(1) + self.attr = VersionedAttribute(self.test_parent, + 'versioned_tests', self.default_vals[0]) def test_VersionedAttribute_save(self) -> None: """Test .save() to write to DB.""" - test_parent = TestParentType(1) - attr = VersionedAttribute(test_parent, 'versioned_tests', 'A') # check mere .set() calls do not by themselves reflect in the DB - attr.set('B') + self.attr.set(self.default_vals[1]) self.assertEqual([], - self.db_conn.row_where('versioned_tests', 'parent', 1)) - # check .save() makes history appear in DB - attr.save(self.db_conn) + self.db_conn.row_where('versioned_tests', + 'parent', 1)) + # check .save() makes history appear in DB + self.attr.save(self.db_conn) vals_found = [] for row in self.db_conn.row_where('versioned_tests', 'parent', 1): vals_found += [row[2]] - self.assertEqual(['B'], vals_found) + self.assertEqual([self.default_vals[1]], vals_found) # check .save() also updates history in DB - attr.set('C') - attr.save(self.db_conn) + self.attr.set(self.default_vals[2]) + self.attr.save(self.db_conn) vals_found = [] for row in self.db_conn.row_where('versioned_tests', 'parent', 1): vals_found += [row[2]] - self.assertEqual(['B', 'C'], sorted(vals_found)) + self.assertEqual([self.default_vals[1], self.default_vals[2]], + sorted(vals_found)) def test_VersionedAttribute_history_from_row(self) -> None: """"Test .history_from_row() properly interprets DB rows.""" - test_parent = TestParentType(1) - attr = VersionedAttribute(test_parent, 'versioned_tests', 'A') - attr.set('B') - attr.set('C') - attr.save(self.db_conn) - loaded_attr = VersionedAttribute(test_parent, 'versioned_tests', 'A') + self.attr.set(self.default_vals[1]) + self.attr.set(self.default_vals[2]) + self.attr.save(self.db_conn) + loaded_attr = VersionedAttribute(self.test_parent, 'versioned_tests', + self.default_vals[0]) for row in self.db_conn.row_where('versioned_tests', 'parent', 1): loaded_attr.history_from_row(row) - for timestamp, value in attr.history.items(): + for timestamp, value in self.attr.history.items(): self.assertEqual(value, loaded_attr.history[timestamp]) - self.assertEqual(len(attr.history.keys()), + self.assertEqual(len(self.attr.history.keys()), len(loaded_attr.history.keys())) + +class TestsWithDBFloat(TestsWithDBStr): + """Module tests requiring DB setup.""" + default_vals: list[str | float] = [0.9, 1.1, 2] + init_sql = SQL_TEST_TABLE_FLOAT