def test_db(): """Test database backend.""" app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get( 'SQLALCHEMY_DATABASE_URI', 'sqlite:///test.db' ) FlaskCLI(app) InvenioDB(app) InvenioRecords(app) with app.app_context(): create_database(db.engine.url) db.create_all() assert len(db.metadata.tables) == 3 data = {'title': 'Test'} from invenio_records.models import RecordMetadata as RM # Create a record with app.app_context(): assert RM.query.count() == 0 record_uuid = Record.create(data).id db.session.commit() assert RM.query.count() == 1 db.session.commit() # Retrieve created record with app.app_context(): record = Record.get_record(record_uuid) assert record.dumps() == data with pytest.raises(NoResultFound): Record.get_record(uuid.uuid4()) record['field'] = True record = record.patch([ {'op': 'add', 'path': '/hello', 'value': ['world']} ]) assert record['hello'] == ['world'] record.commit() db.session.commit() with app.app_context(): record2 = Record.get_record(record_uuid) assert record2.model.version_id == 2 assert record2['field'] assert record2['hello'] == ['world'] db.session.commit() # Cannot commit record without model (i.e. Record.create_record) with app.app_context(): record3 = Record({'title': 'Not possible'}) with pytest.raises(RecordNotCommitableError): record3.commit() with app.app_context(): db.drop_all() drop_database(db.engine.url)
def update_model(self, form, model): """Update the metadata for a record.""" try: new_json_data = request.form.get('json') if new_json_data: record = Record(model.json, model=model) record.clear() record.update(json.loads(new_json_data)) record.commit() self.session.commit() except ValidationError as ex: flash('Failed to update record, provided metadata is invalid: %s' % ex.message, 'error') return False except Exception as ex: if not self.handle_view_exception(ex): flash('Failed to update record. %s' % str(ex), 'error') self.session.rollback() return False else: self.after_model_change(form, model, False) return True
def test_db(app, db): """Test database backend.""" with app.app_context(): assert 'records_metadata' in db.metadata.tables assert 'records_metadata_version' in db.metadata.tables assert 'transaction' in db.metadata.tables schema = { 'type': 'object', 'properties': { 'title': { 'type': 'string' }, 'field': { 'type': 'boolean' }, 'hello': { 'type': 'array' }, }, 'required': ['title'], } data = {'title': 'Test', '$schema': schema} from invenio_records.models import RecordMetadata as RM # Create a record with app.app_context(): assert RM.query.count() == 0 record_uuid = Record.create(data).id db.session.commit() assert RM.query.count() == 1 db.session.commit() # Retrieve created record with app.app_context(): record = Record.get_record(record_uuid) assert record.dumps() == data with pytest.raises(NoResultFound): Record.get_record(uuid.uuid4()) record['field'] = True record = record.patch([{ 'op': 'add', 'path': '/hello', 'value': ['world'] }]) assert record['hello'] == ['world'] record.commit() db.session.commit() with app.app_context(): record2 = Record.get_record(record_uuid) assert record2.model.version_id == 2 assert record2['field'] assert record2['hello'] == ['world'] db.session.commit() # Cannot commit record without model (i.e. Record.create_record) with app.app_context(): record3 = Record({'title': 'Not possible'}) with pytest.raises(MissingModelError): record3.commit() # Check invalid schema values with app.app_context(): data = { '$schema': 'http://json-schema.org/learn/examples/' 'geographical-location.schema.json', 'latitude': 42, 'longitude': 42, } record_with_schema = Record.create(data).commit() db.session.commit() record_with_schema['latitude'] = 'invalid' with pytest.raises(ValidationError): record_with_schema.commit() # Allow types overriding on schema validation with app.app_context(): data = { 'title': 'Test', 'hello': tuple(['foo', 'bar']), '$schema': schema } app.config['RECORDS_VALIDATION_TYPES'] = {} with pytest.raises(ValidationError): Record.create(data).commit() app.config['RECORDS_VALIDATION_TYPES'] = {'array': (list, tuple)} record_uuid = Record.create(data).commit() db.session.commit()
def test_db(): """Test database backend.""" app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get( 'SQLALCHEMY_DATABASE_URI', 'sqlite:///test.db' ) FlaskCLI(app) InvenioDB(app) InvenioRecords(app) with app.app_context(): db.create_all() assert 'records_metadata' in db.metadata.tables assert 'records_metadata_version' in db.metadata.tables assert 'transaction' in db.metadata.tables schema = { 'type': 'object', 'properties': { 'title': {'type': 'string'}, 'field': {'type': 'boolean'}, 'hello': {'type': 'array'}, }, 'required': ['title'], } data = {'title': 'Test', '$schema': schema} from invenio_records.models import RecordMetadata as RM # Create a record with app.app_context(): assert RM.query.count() == 0 record_uuid = Record.create(data).id db.session.commit() assert RM.query.count() == 1 db.session.commit() # Retrieve created record with app.app_context(): record = Record.get_record(record_uuid) assert record.dumps() == data with pytest.raises(NoResultFound): Record.get_record(uuid.uuid4()) record['field'] = True record = record.patch([ {'op': 'add', 'path': '/hello', 'value': ['world']} ]) assert record['hello'] == ['world'] record.commit() db.session.commit() with app.app_context(): record2 = Record.get_record(record_uuid) assert record2.model.version_id == 2 assert record2['field'] assert record2['hello'] == ['world'] db.session.commit() # Cannot commit record without model (i.e. Record.create_record) with app.app_context(): record3 = Record({'title': 'Not possible'}) with pytest.raises(MissingModelError): record3.commit() with app.app_context(): db.drop_all()
def test_db(): """Test database backend.""" app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get( 'SQLALCHEMY_DATABASE_URI', 'sqlite:///test.db' ) FlaskCLI(app) InvenioDB(app) InvenioRecords(app) with app.app_context(): db.drop_all() db.create_all() assert 'records_metadata' in db.metadata.tables assert 'records_metadata_version' in db.metadata.tables assert 'transaction' in db.metadata.tables schema = { 'type': 'object', 'properties': { 'title': {'type': 'string'}, 'field': {'type': 'boolean'}, 'hello': {'type': 'array'}, }, 'required': ['title'], } data = {'title': 'Test', '$schema': schema} from invenio_records.models import RecordMetadata as RM # Create a record with app.app_context(): assert RM.query.count() == 0 record_uuid = Record.create(data).id db.session.commit() assert RM.query.count() == 1 db.session.commit() # Retrieve created record with app.app_context(): record = Record.get_record(record_uuid) assert record.dumps() == data with pytest.raises(NoResultFound): Record.get_record(uuid.uuid4()) record['field'] = True record = record.patch([ {'op': 'add', 'path': '/hello', 'value': ['world']} ]) assert record['hello'] == ['world'] record.commit() db.session.commit() with app.app_context(): record2 = Record.get_record(record_uuid) assert record2.model.version_id == 2 assert record2['field'] assert record2['hello'] == ['world'] db.session.commit() # Cannot commit record without model (i.e. Record.create_record) with app.app_context(): record3 = Record({'title': 'Not possible'}) with pytest.raises(MissingModelError): record3.commit() # Check invalid schema values with app.app_context(): data = { '$schema': 'http://json-schema.org/geo#', 'latitude': 42, 'longitude': 42, } record_with_schema = Record.create(data).commit() db.session.commit() record_with_schema['latitude'] = 'invalid' with pytest.raises(ValidationError): record_with_schema.commit() # Allow types overriding on schema validation with app.app_context(): data = { 'title': 'Test', 'hello': tuple(['foo', 'bar']), '$schema': schema } app.config['RECORDS_VALIDATION_TYPES'] = {} with pytest.raises(ValidationError): Record.create(data).commit() app.config['RECORDS_VALIDATION_TYPES'] = {'array': (list, tuple)} record_uuid = Record.create(data).commit() db.session.commit() with app.app_context(): db.drop_all()
def test_db(): """Test database backend.""" app = Flask(__name__) app.config['SQLALCHEMY_DATABASE_URI'] = os.environ.get( 'SQLALCHEMY_DATABASE_URI', 'sqlite:///test.db') FlaskCLI(app) InvenioDB(app) InvenioRecords(app) with app.app_context(): db.create_all() assert 'records_metadata' in db.metadata.tables assert 'records_metadata_version' in db.metadata.tables assert 'transaction' in db.metadata.tables schema = { 'type': 'object', 'properties': { 'title': { 'type': 'string' }, 'field': { 'type': 'boolean' }, 'hello': { 'type': 'array' }, }, 'required': ['title'], } data = {'title': 'Test', '$schema': schema} from invenio_records.models import RecordMetadata as RM # Create a record with app.app_context(): assert RM.query.count() == 0 record_uuid = Record.create(data).id db.session.commit() assert RM.query.count() == 1 db.session.commit() # Retrieve created record with app.app_context(): record = Record.get_record(record_uuid) assert record.dumps() == data with pytest.raises(NoResultFound): Record.get_record(uuid.uuid4()) record['field'] = True record = record.patch([{ 'op': 'add', 'path': '/hello', 'value': ['world'] }]) assert record['hello'] == ['world'] record.commit() db.session.commit() with app.app_context(): record2 = Record.get_record(record_uuid) assert record2.model.version_id == 2 assert record2['field'] assert record2['hello'] == ['world'] db.session.commit() # Cannot commit record without model (i.e. Record.create_record) with app.app_context(): record3 = Record({'title': 'Not possible'}) with pytest.raises(MissingModelError): record3.commit() with app.app_context(): db.drop_all()