def test_harvesting_arxiv_workflow_manual_accepted( mocked_refextract_extract_refs, mocked_matching_match, mocked_api_request_magpie, mocked_api_request_beard, mocked_download_utils, mocked_download_arxiv, mocked_package_download, workflow_app, mocked_external_services, ): record = generate_record() """Test a full harvesting workflow.""" workflow_uuid, eng, obj = get_halted_workflow(app=workflow_app, record=record) do_accept_core(app=workflow_app, workflow_id=obj.id) eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] assert obj.status == ObjectStatus.WAITING do_robotupload_callback(app=workflow_app, workflow_id=obj.id, recids=[12345]) eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] # It was accepted assert obj.status == ObjectStatus.COMPLETED assert obj.extra_data["approved"] is True
def test_harvesting_arxiv_workflow_manual_accepted( mocked_refextract_extract_refs, mocked_matching_match, mocked_api_request_magpie, mocked_api_request_beard, mocked_download_utils, mocked_download_arxiv, mocked_package_download, workflow_app, mocked_external_services, ): record = generate_record() """Test a full harvesting workflow.""" workflow_uuid, eng, obj = get_halted_workflow(app=workflow_app, record=record) do_accept_core(app=workflow_app, workflow_id=obj.id) eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] assert obj.status == ObjectStatus.WAITING do_robotupload_callback(app=workflow_app, workflow_id=obj.id, recids=[12345]) obj = workflow_object_class.get(obj.id) assert obj.status == ObjectStatus.WAITING do_webcoll_callback(app=workflow_app, recids=[12345]) eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] # It was accepted assert obj.status == ObjectStatus.COMPLETED assert obj.extra_data["approved"] is True
def test_harvesting_arxiv_workflow_manual_accepted( mocked_refextract_extract_refs, mocked_matching_search, mocked_api_request_magpie, mocked_api_request_beard, mocked_download_utils, mocked_download_arxiv, workflow_app, ): record = generate_record() """Test a full harvesting workflow.""" with requests_mock.Mocker() as requests_mocker: requests_mocker.register_uri( requests_mock.ANY, re.compile('.*(indexer|localhost).*'), real_http=True, ) requests_mocker.register_uri( 'POST', re.compile('https?://localhost:1234.*', ), text=u'[INFO]', status_code=200, ) workflow_uuid, eng, obj = get_halted_workflow( app=workflow_app, extra_config={'PRODUCTION_MODE': False}, record=record, ) do_accept_core( app=workflow_app, workflow_id=obj.id, ) eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] assert obj.status == ObjectStatus.WAITING response = do_robotupload_callback( app=workflow_app, workflow_id=obj.id, recids=[12345], ) assert response.status_code == 200 obj = workflow_object_class.get(obj.id) assert obj.status == ObjectStatus.WAITING response = do_webcoll_callback(app=workflow_app, recids=[12345]) assert response.status_code == 200 eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] # It was accepted assert obj.status == ObjectStatus.COMPLETED
def test_harvesting_arxiv_workflow_manual_accepted( mocked_refextract_extract_refs, mocked_matching_match, mocked_api_request_magpie, mocked_api_request_beard, mocked_download_utils, mocked_download_arxiv, workflow_app, mocked_external_services, ): record = generate_record() """Test a full harvesting workflow.""" workflow_uuid, eng, obj = get_halted_workflow( app=workflow_app, record=record, ) do_accept_core( app=workflow_app, workflow_id=obj.id, ) eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] assert obj.status == ObjectStatus.WAITING response = do_robotupload_callback( app=workflow_app, workflow_id=obj.id, recids=[12345], ) assert response.status_code == 200 obj = workflow_object_class.get(obj.id) assert obj.status == ObjectStatus.WAITING response = do_webcoll_callback(app=workflow_app, recids=[12345]) assert response.status_code == 200 eng = WorkflowEngine.from_uuid(workflow_uuid) obj = eng.processed_objects[0] # It was accepted assert obj.status == ObjectStatus.COMPLETED
def test_edit_article_workflow_sending_to_hep(workflow_app, mocked_external_services): app_client = workflow_app.test_client() user = User.query.filter_by(email='*****@*****.**').one() login_user_via_session(app_client, user=user) record = { '$schema': 'http://localhost:5000/schemas/records/hep.json', 'arxiv_eprints': [{ 'categories': ['nucl-th'], 'value': '1802.03287' }], 'control_number': 123, 'document_type': ['article'], 'titles': [{ 'title': 'Resource Pooling in Large-Scale Content Delivery Systems' }], 'self': { '$ref': 'http://localhost:5000/schemas/records/hep.json' }, '_collections': ['Literature'] } factory = TestRecordMetadata.create_from_kwargs(json=record) with patch.dict( workflow_app.config, { 'FEATURE_FLAG_ENABLE_REST_RECORD_MANAGEMENT': True, 'INSPIREHEP_URL': "http://web:8000" }): with requests_mock.Mocker() as requests_mocker: requests_mocker.register_uri( 'PUT', '{url}/literature/{cn}'.format( url=workflow_app.config.get("INSPIREHEP_URL"), cn=record['control_number'], ), headers={'content-type': 'application/json'}, status_code=200, json={ "metadata": { 'control_number': record['control_number'], }, 'id_': 1 }) eng_uuid = start('edit_article', data=factory.record_metadata.json) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.WAITING assert obj.extra_data['callback_url'] user_id = user.get_id() obj.id_user = user_id # simulate changes in the editor and save new_title = 'Somebody edited this fancy title' obj.data['titles'][0]['title'] = new_title payload = { 'id': obj.id, 'metadata': obj.data, '_extra_data': obj.extra_data } app_client.put(obj.extra_data['callback_url'], data=json.dumps(payload), content_type='application/json') obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.WAITING # waiting for robot_upload assert obj.data['titles'][0]['title'] == new_title do_robotupload_callback( app=workflow_app, workflow_id=obj.id, recids=[obj.data['control_number']], ) record = get_db_record('lit', 123) assert record['titles'][0]['title'] == new_title # assert record edit transaction is by user who created the edit workflow revision = record.revisions[record.revision_id] transaction_id = revision.model.transaction_id Transaction = transaction_class(RecordMetadata) transaction = Transaction.query.filter( Transaction.id == transaction_id).one() assert transaction.user_id == int(user_id) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.COMPLETED pending_records = WorkflowsPendingRecord.query.filter_by( workflow_id=obj.id).all() assert not pending_records
def test_edit_article_workflow_deleting(workflow_app, mocked_external_services): app_client = workflow_app.test_client() user = User.query.filter_by(email='*****@*****.**').one() login_user_via_session(app_client, user=user) record = { '$schema': 'http://localhost:5000/schemas/records/hep.json', 'arxiv_eprints': [{ 'categories': ['nucl-th'], 'value': '1802.03287' }], 'control_number': 123, 'document_type': ['article'], 'titles': [{ 'title': 'Resource Pooling in Large-Scale Content Delivery Systems' }], 'self': { '$ref': 'http://localhost:5000/schemas/records/hep.json' }, '_collections': ['Literature'] } factory = TestRecordMetadata.create_from_kwargs(json=record) eng_uuid = start('edit_article', data=factory.record_metadata.json) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] obj.id_user = user.get_id() assert obj.status == ObjectStatus.WAITING assert obj.extra_data['callback_url'] record = get_db_record('lit', 123) search = LiteratureSearch() search.get_source(record.id) # simulate changes in the editor and save obj.data['deleted'] = True payload = { 'id': obj.id, 'metadata': obj.data, '_extra_data': obj.extra_data } app_client.put(obj.extra_data['callback_url'], data=json.dumps(payload), content_type='application/json') obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.WAITING # waiting for robot_upload assert obj.data['deleted'] is True do_robotupload_callback( app=workflow_app, workflow_id=obj.id, recids=[obj.data['control_number']], ) record = get_db_record('lit', 123) assert record['deleted'] is True with pytest.raises(NotFoundError): search.get_source(record.id) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.COMPLETED pending_records = WorkflowsPendingRecord.query.filter_by( workflow_id=obj.id).all() assert not pending_records
def test_edit_article_workflow(workflow_app, mocked_external_services): app_client = workflow_app.test_client() user = User.query.filter_by(email='*****@*****.**').one() login_user_via_session(app_client, user=user) record = { '$schema': 'http://localhost:5000/schemas/records/hep.json', 'arxiv_eprints': [{ 'categories': ['nucl-th'], 'value': '1802.03287' }], 'control_number': 123, 'document_type': ['article'], 'titles': [{ 'title': 'Resource Pooling in Large-Scale Content Delivery Systems' }], 'self': { '$ref': 'http://localhost:5000/schemas/records/hep.json' }, '_collections': ['Literature'] } factory = TestRecordMetadata.create_from_kwargs(json=record) eng_uuid = start('edit_article', data=factory.record_metadata.json) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.WAITING assert obj.extra_data['callback_url'] user_id = user.get_id() obj.id_user = user_id # simulate changes in the editor and save new_title = 'Somebody edited this fancy title' obj.data['titles'][0]['title'] = new_title payload = { 'id': obj.id, 'metadata': obj.data, '_extra_data': obj.extra_data } app_client.put(obj.extra_data['callback_url'], data=json.dumps(payload), content_type='application/json') obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.WAITING # waiting for robot_upload assert obj.data['titles'][0]['title'] == new_title do_robotupload_callback( app=workflow_app, workflow_id=obj.id, recids=[obj.data['control_number']], ) record = get_db_record('lit', 123) assert record['titles'][0]['title'] == new_title # assert record edit transaction is by user who created the edit workflow revision = record.revisions[record.revision_id] transaction_id = revision.model.transaction_id Transaction = transaction_class(RecordMetadata) transaction = Transaction.query.filter( Transaction.id == transaction_id).one() assert transaction.user_id == int(user_id) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.COMPLETED pending_records = WorkflowsPendingRecord.query.filter_by( workflow_id=obj.id).all() assert not pending_records
def test_edit_article_workflow_deleting(workflow_app, mocked_external_services): app_client = workflow_app.test_client() user = User.query.filter_by(email='*****@*****.**').one() login_user_via_session(app_client, user=user) record = { '$schema': 'http://localhost:5000/schemas/records/hep.json', 'arxiv_eprints': [ { 'categories': [ 'nucl-th' ], 'value': '1802.03287' } ], 'control_number': 123, 'document_type': ['article'], 'titles': [{'title': 'Resource Pooling in Large-Scale Content Delivery Systems'}], 'self': {'$ref': 'http://localhost:5000/schemas/records/hep.json'}, '_collections': ['Literature'] } factory = TestRecordMetadata.create_from_kwargs(json=record) eng_uuid = start('edit_article', data=factory.record_metadata.json) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] obj.id_user = user.get_id() assert obj.status == ObjectStatus.WAITING assert obj.extra_data['callback_url'] record = get_db_record('lit', 123) search = LiteratureSearch() search.get_source(record.id) # simulate changes in the editor and save obj.data['deleted'] = True payload = { 'id': obj.id, 'metadata': obj.data, '_extra_data': obj.extra_data } app_client.put( obj.extra_data['callback_url'], data=json.dumps(payload), content_type='application/json' ) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.WAITING # waiting for robot_upload assert obj.data['deleted'] is True do_robotupload_callback( app=workflow_app, workflow_id=obj.id, recids=[obj.data['control_number']], ) record = get_db_record('lit', 123) assert record['deleted'] is True with pytest.raises(NotFoundError): search.get_source(record.id) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.COMPLETED pending_records = WorkflowsPendingRecord.query.filter_by(workflow_id=obj.id).all() assert not pending_records
def test_edit_article_workflow(workflow_app, mocked_external_services): app_client = workflow_app.test_client() user = User.query.filter_by(email='*****@*****.**').one() login_user_via_session(app_client, user=user) record = { '$schema': 'http://localhost:5000/schemas/records/hep.json', 'arxiv_eprints': [ { 'categories': [ 'nucl-th' ], 'value': '1802.03287' } ], 'control_number': 123, 'document_type': ['article'], 'titles': [{'title': 'Resource Pooling in Large-Scale Content Delivery Systems'}], 'self': {'$ref': 'http://localhost:5000/schemas/records/hep.json'}, '_collections': ['Literature'] } factory = TestRecordMetadata.create_from_kwargs(json=record) eng_uuid = start('edit_article', data=factory.record_metadata.json) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.WAITING assert obj.extra_data['callback_url'] user_id = user.get_id() obj.id_user = user_id # simulate changes in the editor and save new_title = 'Somebody edited this fancy title' obj.data['titles'][0]['title'] = new_title payload = { 'id': obj.id, 'metadata': obj.data, '_extra_data': obj.extra_data } app_client.put( obj.extra_data['callback_url'], data=json.dumps(payload), content_type='application/json' ) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.WAITING # waiting for robot_upload assert obj.data['titles'][0]['title'] == new_title do_robotupload_callback( app=workflow_app, workflow_id=obj.id, recids=[obj.data['control_number']], ) record = get_db_record('lit', 123) assert record['titles'][0]['title'] == new_title # assert record edit transaction is by user who created the edit workflow revision = record.revisions[record.revision_id] transaction_id = revision.model.transaction_id Transaction = transaction_class(RecordMetadata) transaction = Transaction.query.filter(Transaction.id == transaction_id).one() assert transaction.user_id == int(user_id) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.COMPLETED pending_records = WorkflowsPendingRecord.query.filter_by(workflow_id=obj.id).all() assert not pending_records
def test_edit_article_workflow_sending_to_hep(workflow_app, mocked_external_services): app_client = workflow_app.test_client() user = User.query.filter_by(email='*****@*****.**').one() login_user_via_session(app_client, user=user) record = { '$schema': 'http://localhost:5000/schemas/records/hep.json', 'arxiv_eprints': [ { 'categories': [ 'nucl-th' ], 'value': '1802.03287' } ], 'control_number': 123, 'document_type': ['article'], 'titles': [{'title': 'Resource Pooling in Large-Scale Content Delivery Systems'}], 'self': {'$ref': 'http://localhost:5000/schemas/records/hep.json'}, '_collections': ['Literature'] } factory = TestRecordMetadata.create_from_kwargs(json=record) with patch.dict(workflow_app.config, { 'FEATURE_FLAG_ENABLE_REST_RECORD_MANAGEMENT': True, 'INSPIREHEP_URL': "http://web:8000" }): with requests_mock.Mocker() as requests_mocker: requests_mocker.register_uri( 'PUT', '{url}/literature/{cn}'.format( url=workflow_app.config.get("INSPIREHEP_URL"), cn=record['control_number'], ), headers={'content-type': 'application/json'}, status_code=200, json={ "metadata": { 'control_number': record['control_number'], }, 'id_': 1 } ) eng_uuid = start('edit_article', data=factory.record_metadata.json) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.WAITING assert obj.extra_data['callback_url'] user_id = user.get_id() obj.id_user = user_id # simulate changes in the editor and save new_title = 'Somebody edited this fancy title' obj.data['titles'][0]['title'] = new_title payload = { 'id': obj.id, 'metadata': obj.data, '_extra_data': obj.extra_data } app_client.put( obj.extra_data['callback_url'], data=json.dumps(payload), content_type='application/json' ) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.WAITING # waiting for robot_upload assert obj.data['titles'][0]['title'] == new_title do_robotupload_callback( app=workflow_app, workflow_id=obj.id, recids=[obj.data['control_number']], ) record = get_db_record('lit', 123) assert record['titles'][0]['title'] == new_title # assert record edit transaction is by user who created the edit workflow revision = record.revisions[record.revision_id] transaction_id = revision.model.transaction_id Transaction = transaction_class(RecordMetadata) transaction = Transaction.query.filter(Transaction.id == transaction_id).one() assert transaction.user_id == int(user_id) obj = WorkflowEngine.from_uuid(eng_uuid).objects[0] assert obj.status == ObjectStatus.COMPLETED pending_records = WorkflowsPendingRecord.query.filter_by(workflow_id=obj.id).all() assert not pending_records