Exemple #1
0
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
Exemple #4
0
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
Exemple #5
0
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
Exemple #6
0
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
Exemple #7
0
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