From 0af14495ff3aa05e2f99d029a0f8ae5eb26d4477 Mon Sep 17 00:00:00 2001 From: Jan Fajerski Date: Wed, 27 May 2020 16:02:03 +0200 Subject: [PATCH] pybind/mgr/snap-schedule: fix meta uniqueness contraint This adds a simple test for the Schedule.store_schedule. This test exposed a bug (couldn't add schedule on different paths with the same repeat and start time). Bug is also fixed. Signed-off-by: Jan Fajerski --- src/pybind/mgr/snap_schedule/fs/schedule.py | 2 +- .../mgr/snap_schedule/tests/conftest.py | 23 +++++++++++------- .../snap_schedule/tests/fs/test_schedule.py | 24 +++++++++++++++++++ 3 files changed, 40 insertions(+), 9 deletions(-) diff --git a/src/pybind/mgr/snap_schedule/fs/schedule.py b/src/pybind/mgr/snap_schedule/fs/schedule.py index 5ffdbff28c072..781eeb67023a9 100644 --- a/src/pybind/mgr/snap_schedule/fs/schedule.py +++ b/src/pybind/mgr/snap_schedule/fs/schedule.py @@ -110,7 +110,7 @@ class Schedule(object): retention TEXT, active INT NOT NULL, FOREIGN KEY(schedule_id) REFERENCES schedules(id) ON DELETE CASCADE, - UNIQUE (start, repeat) + UNIQUE (schedule_id, start, repeat) );''' EXEC_QUERY = '''SELECT diff --git a/src/pybind/mgr/snap_schedule/tests/conftest.py b/src/pybind/mgr/snap_schedule/tests/conftest.py index ceaec8f2d1320..12b7a9066edcc 100644 --- a/src/pybind/mgr/snap_schedule/tests/conftest.py +++ b/src/pybind/mgr/snap_schedule/tests/conftest.py @@ -5,23 +5,30 @@ from fs.schedule import Schedule # simple_schedule fixture returns schedules without any timing arguments # the tuple values correspong to ctor args for Schedule -simple_schedules = [ +_simple_schedules = [ ('/foo', '6h', '', 'fs_name', '/foo'), - ('/foo', '24h', '', 'fs_name', '/foo'), - ('/bar', '1d', '', 'fs_name', '/bar'), - ('/fnord', '1w', '', 'fs_name', '/fnord'), + ('/foo', '24h', '10d', 'fs_name', '/foo'), + ('/bar', '1d', '30d', 'fs_name', '/bar'), + ('/fnord', '1w', '4w1m', 'fs_name', '/fnord'), ] -@pytest.fixture(params=simple_schedules) + + +@pytest.fixture(params=_simple_schedules) def simple_schedule(request): return Schedule(*request.param) + @pytest.fixture -def db_and_simple_schedules(): +def simple_schedules(): + return [Schedule(*s) for s in _simple_schedules] + + +@pytest.fixture +def db(): db = sqlite3.connect(':memory:', check_same_thread=False) with db: db.row_factory = sqlite3.Row db.execute("PRAGMA FOREIGN_KEYS = 1") db.executescript(Schedule.CREATE_TABLES) - return db, [Schedule(*s) for s in simple_schedules] - + return db diff --git a/src/pybind/mgr/snap_schedule/tests/fs/test_schedule.py b/src/pybind/mgr/snap_schedule/tests/fs/test_schedule.py index 2adbc6b49af82..a6239798f3cc6 100644 --- a/src/pybind/mgr/snap_schedule/tests/fs/test_schedule.py +++ b/src/pybind/mgr/snap_schedule/tests/fs/test_schedule.py @@ -1,6 +1,10 @@ import datetime from fs.schedule import Schedule +SELECT_ALL = ('select * from schedules s' + ' INNER JOIN schedules_meta sm' + ' ON sm.schedule_id = s.id') + class TestSchedule(object): @@ -26,3 +30,23 @@ class TestSchedule(object): def test_repeat_valid(self, simple_schedule): repeat = simple_schedule.repeat assert isinstance(repeat, int) + + def test_store_single(self, db, simple_schedule): + simple_schedule.store_schedule(db) + row = () + with db: + row = db.execute(SELECT_ALL).fetchone() + + db_schedule = Schedule._from_get_query(row, simple_schedule.fs) + + for var in vars(db_schedule): + assert getattr(simple_schedule, var) == getattr(db_schedule, var) + + def test_store_multiple(self, db, simple_schedules): + [s.store_schedule(db) for s in simple_schedules] + + rows = [] + with db: + rows = db.execute(SELECT_ALL).fetchall() + + assert len(rows) == len(simple_schedules) -- 2.39.5