예제 #1
0
    def setUp(self):
        self._dbconn = qvarn.DatabaseConnection()
        self._dbconn.set_sql(qvarn.SqliteAdapter())

        vs = qvarn.VersionedStorage()
        vs.set_resource_type(self.resource_type)
        vs.start_version(u'first-version', None)
        vs.add_prototype(self.prototype)
        vs.add_prototype(qvarn.listener_prototype, auxtable=u'listener')
        vs.add_prototype(qvarn.notification_prototype,
                         auxtable=u'notification')
        with self._dbconn.transaction() as t:
            vs.prepare_storage(t)

        self.ro = qvarn.ReadOnlyStorage()
        self.ro.set_item_prototype(self.resource_type, self.prototype)

        self.wo = qvarn.WriteOnlyStorage()
        self.wo.set_item_prototype(self.resource_type, self.prototype)

        self.listener = qvarn.ListenerResource()
        self.listener.set_top_resource_path(self.resource_type,
                                            self.resource_type)
        self.listener.prepare_resource(self._dbconn)

        self.resource = qvarn.ListResource()
        self.resource.set_path(self.resource_type)
        self.resource.set_item_type(self.resource_type)
        self.resource.set_item_prototype(self.prototype)
        self.resource.set_listener(self.listener)
        self.resource.prepare_resource(self._dbconn)
예제 #2
0
    def test_prepares_a_single_version(self):
        prototype_v1 = {
            u'type': u'',
            u'id': u'',
            u'foo': u'',
        }

        called = []

        def callback_v1(*args):
            called.append(callback_v1)

        sql = qvarn.SqliteAdapter()
        dbconn = qvarn.DatabaseConnection()
        dbconn.set_sql(sql)

        vs = qvarn.VersionedStorage()
        vs.set_resource_type(u'foo')

        vs.start_version(u'v1', callback_v1)
        vs.add_prototype(prototype_v1)

        with dbconn.transaction() as t:
            vs.prepare_storage(t)
        self.assertEqual(called, [callback_v1])
예제 #3
0
def setup_version_resource(app):
    vs = qvarn.VersionedStorage()
    vs.set_resource_type('version')
    app.add_versioned_storage(vs)

    resource = qvarn.SimpleResource()
    resource.set_path(u'/version', version)
    return resource
예제 #4
0
    def test_updates_data_for_each_version(self):
        prototype_v1 = {
            u'type': u'',
            u'id': u'',
            u'foo': u'',
        }

        prototype_v2 = {
            u'type': u'',
            u'id': u'',
            u'bar': u'',  # note that foo is dropped
        }

        prototype_v3 = {
            u'type': u'',
            u'id': u'',
            u'bar': u'',
            u'foobar': u'',  # added field, thus bar should be copied
        }

        called = []
        resource_type = u'resource'
        table_name = qvarn.table_name(resource_type=resource_type)

        def callback_v1(t, temp_tables):
            # Insert a row with an id. It should remain at end.
            t.insert(table_name, {u'id': u'foo.id'})
            called.append(callback_v1)

        def callback_v2(t, temp_tables):
            called.append(callback_v2)

        def callback_v3(t, temp_tables):
            called.append(callback_v3)

        vs = qvarn.VersionedStorage()
        vs.set_resource_type(resource_type)

        vs.start_version(u'v1', callback_v1)
        vs.add_prototype(prototype_v1)

        vs.start_version(u'v2', callback_v2)
        vs.add_prototype(prototype_v2)

        vs.start_version(u'v3', callback_v3)
        vs.add_prototype(prototype_v3)

        sql = qvarn.SqliteAdapter()
        dbconn = qvarn.DatabaseConnection()
        dbconn.set_sql(sql)
        with dbconn.transaction() as t:
            vs.prepare_storage(t)
            self.assertEqual(called, [callback_v1, callback_v2, callback_v3])

            rows = t.select(table_name, [u'bar', u'foobar', u'id'], None)
            self.assertEqual(
                rows,
                [{u'id': u'foo.id', u'bar': None, u'foobar': None}])
예제 #5
0
    def test_updates_data_for_each_version(self):
        prototype_v1 = {
            u'type': u'',
            u'id': u'',
            u'foo': u'',
        }

        prototype_v2 = {
            u'type': u'',
            u'id': u'',
            u'bar': u'',  # note that foo is dropped
        }

        prototype_v3 = {
            u'type': u'',
            u'id': u'',
            u'bar': u'',
            u'foobar': u'',  # added field, thus bar should be copied
        }

        vs = qvarn.VersionedStorage()
        vs.set_resource_type('resource')

        vs.start_version(u'v1')
        vs.add_prototype(prototype_v1)

        with self.dbconn.transaction() as t:
            vs.prepare_storage(t)
            self.assertVersions(t, 'resource', ['v1'])

        with self.dbconn.transaction() as t:
            t.insert('resource', {'id': 'foo.id'})

        vs.start_version(u'v2')
        vs.add_prototype(prototype_v2)

        vs.start_version(u'v3')
        vs.add_prototype(prototype_v3)

        with self.dbconn.transaction() as t:
            vs.prepare_storage(t)

        with self.dbconn.transaction() as t:
            self.assertVersions(t, 'resource', ['v1', 'v2', 'v3'])
            self.assertSchema(
                t, {
                    'resource': ['bar', 'foo', 'foobar', 'id', 'type'],
                    'resource__aux_versions': ['version'],
                })
            self.assertData(t, 'resource', ('id', 'bar', 'foobar'), [
                ('foo.id', None, None),
            ])
예제 #6
0
    def test_schema_migration(self):
        vs = qvarn.VersionedStorage()
        vs.set_resource_type(u'rt')

        # Do initial migration
        vs.start_version(u'v1')
        vs.add_prototype({
            u'type': u'',
            u'id': u'',
            u'items': [{
                u'str': u'',
                u'lst': [u''],
            }]
        })
        with self.dbconn.transaction() as t:
            vs.prepare_storage(t)
            self.assertSchema(
                t, {
                    'rt': ['id', 'type'],
                    'rt__aux_versions': ['version'],
                    'rt_items': ['id', 'list_pos', 'str'],
                    'rt_items_lst': ['dict_list_pos', 'id', 'list_pos', 'lst'],
                })

        # Add new version and do another migration.
        vs.start_version(u'v2')
        vs.add_prototype({
            u'type':
            u'',
            u'id':
            u'',
            u'items': [{
                u'str': u'',
                u'lst': [u''],
                u'new_1': u'',
            }],
            u'new_2':
            u'',
            u'items_3': [u''],
        })
        with self.dbconn.transaction() as t:
            vs.prepare_storage(t)
            self.assertSchema(
                t, {
                    'rt': ['id', 'new_2', 'type'],
                    'rt__aux_versions': ['version'],
                    'rt_items': ['id', 'list_pos', 'new_1', 'str'],
                    'rt_items_3': ['id', 'items_3', 'list_pos'],
                    'rt_items_lst': ['dict_list_pos', 'id', 'list_pos', 'lst'],
                })
예제 #7
0
    def test_prepares_a_single_version(self):
        prototype_v1 = {
            u'type': u'',
            u'id': u'',
            u'foo': u'',
        }

        vs = qvarn.VersionedStorage()
        vs.set_resource_type(u'foo')

        vs.start_version(u'v1')
        vs.add_prototype(prototype_v1)

        with self.dbconn.transaction() as t:
            vs.prepare_storage(t)
            self.assertSchema(t, {
                'foo': ['foo', 'id', 'type'],
                'foo__aux_versions': ['version'],
            })
예제 #8
0
    def setUp(self):
        self.dbconn = qvarn.DatabaseConnection()
        self.dbconn.set_sql(qvarn.SqliteAdapter())

        vs = qvarn.VersionedStorage()
        vs.set_resource_type(self.resource_type)
        vs.start_version(u'1', None)
        vs.add_prototype(self.prototype)
        vs.add_prototype(self.subitem_prototype, subpath=self.subitem_name)
        with self.dbconn.transaction() as t:
            vs.prepare_storage(t)

        self.wo = qvarn.WriteOnlyStorage()
        self.wo.set_item_prototype(self.person[u'type'], self.prototype)
        self.wo.set_subitem_prototype(self.person[u'type'], self.subitem_name,
                                      self.subitem_prototype)

        self.ro = qvarn.ReadOnlyStorage()
        self.ro.set_item_prototype(self.person[u'type'], self.prototype)
        self.ro.set_subitem_prototype(self.person[u'type'], self.subitem_name,
                                      self.subitem_prototype)
예제 #9
0
def test_field_type_change(dbconn, old, new):
    def typ(x):
        return x(b'') if x is memoryview else x()

    def val(x):
        return b'1' if x is memoryview else x(1)

    dbconn.drop_tables(['rt', 'rt__aux_versions'])

    vs = qvarn.VersionedStorage()
    vs.set_resource_type(u'rt')

    # Do initial migration
    vs.start_version(u'v1')
    vs.add_prototype({
        u'type': u'',
        u'id': u'',
        u'field': typ(old),
    })
    with dbconn.transaction() as t:
        vs.prepare_storage(t)

    with dbconn.transaction() as t:
        t.insert('rt', {'id': '1', 'field': val(old)})

    assert get_data(dbconn, 'rt', 'field') == [val(old)]

    # Do migration with a field type changed
    vs.start_version(u'v2')
    vs.add_prototype({
        u'type': u'',
        u'id': u'',
        u'field': typ(new),
    })
    with dbconn.transaction() as t:
        vs.prepare_storage(t)

    assert get_data(dbconn, 'rt', 'field') == [val(new)]
예제 #10
0
    def setUp(self):
        self._dbconn = qvarn.DatabaseConnection()
        self._dbconn.set_sql(qvarn.SqliteAdapter())

        vs = qvarn.VersionedStorage()
        vs.set_resource_type(self.resource_type)
        vs.start_version(u'first-version')
        vs.add_prototype(self.prototype)
        with self._dbconn.transaction() as t:
            vs.prepare_storage(t)

        self.ro = qvarn.ReadOnlyStorage()
        self.ro.set_item_prototype(self.resource_type, self.prototype)

        self.wo = qvarn.WriteOnlyStorage()
        self.wo.set_item_prototype(self.resource_type, self.prototype)

        self.resource = qvarn.ListResource()
        self.resource.set_path(self.resource_type)
        self.resource.set_item_type(self.resource_type)
        self.resource.set_item_prototype(self.prototype)
        self.resource.set_listener(FakeListenerResource())
        self.resource.prepare_resource(self._dbconn)
예제 #11
0
 def __init__(self):
     self._path = None
     self._type = None
     self._latest_version = None
     self._app = None
     self._vs = qvarn.VersionedStorage()
예제 #12
0
 def test_starts_a_new_version(self):
     vs = qvarn.VersionedStorage()
     vs.start_version('v1', None)
     self.assertEqual(vs.get_versions(), ['v1'])
예제 #13
0
 def test_has_no_versions_initially(self):
     vs = qvarn.VersionedStorage()
     self.assertEqual(vs.get_versions(), [])
예제 #14
0
 def test_sets_resource_type(self):
     vs = qvarn.VersionedStorage()
     vs.set_resource_type(u'foo')
     self.assertEqual(vs.get_resource_type(), u'foo')
예제 #15
0
 def test_has_no_resource_type_initally(self):
     vs = qvarn.VersionedStorage()
     self.assertEqual(vs.get_resource_type(), None)