]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
pybind/mgr/snap-schedule: fix meta uniqueness contraint
authorJan Fajerski <jfajerski@suse.com>
Wed, 27 May 2020 14:02:03 +0000 (16:02 +0200)
committerJan Fajerski <jfajerski@suse.com>
Thu, 27 Aug 2020 13:55:46 +0000 (15:55 +0200)
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 <jfajerski@suse.com>
src/pybind/mgr/snap_schedule/fs/schedule.py
src/pybind/mgr/snap_schedule/tests/conftest.py
src/pybind/mgr/snap_schedule/tests/fs/test_schedule.py

index 5ffdbff28c0721b13b11033c8b1b32d6849b47f7..781eeb67023a90baa025f13c8c54ba9dfecdd527 100644 (file)
@@ -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
index ceaec8f2d13209e6f4c303a19e33dbcc03999703..12b7a9066edcc84cebfc6ae029eed89b752bd3dd 100644 (file)
@@ -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
index 2adbc6b49af820a1e5157aa28ea0175708c492e2..a6239798f3cc6ab459127e45c615f6fd110ea8b3 100644 (file)
@@ -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)