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)
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])
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
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}])
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), ])
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'], })
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'], })
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)
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)]
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)
def __init__(self): self._path = None self._type = None self._latest_version = None self._app = None self._vs = qvarn.VersionedStorage()
def test_starts_a_new_version(self): vs = qvarn.VersionedStorage() vs.start_version('v1', None) self.assertEqual(vs.get_versions(), ['v1'])
def test_has_no_versions_initially(self): vs = qvarn.VersionedStorage() self.assertEqual(vs.get_versions(), [])
def test_sets_resource_type(self): vs = qvarn.VersionedStorage() vs.set_resource_type(u'foo') self.assertEqual(vs.get_resource_type(), u'foo')
def test_has_no_resource_type_initally(self): vs = qvarn.VersionedStorage() self.assertEqual(vs.get_resource_type(), None)