def test_record_content(app, test_communities, login_user, test_users): """Test record read with REST API.""" uploaded_files = { 'myfile1.dat': b'contents1', 'myfile2.dat': b'contents2' } admin = test_users['admin'] with app.app_context(): creator = create_user('creator') non_creator = create_user('non-creator') record_data = generate_record_data() _, record_pid, record = create_record( record_data, creator, files=uploaded_files ) with app.test_client() as client: login_user(creator, client) headers = [('Accept', 'application/json')] request_res = client.get( url_for('b2share_records_rest.b2rec_item', pid_value=record_pid.pid_value), headers=headers) assert request_res.status_code == 200 request_data = json.loads( request_res.get_data(as_text=True)) assert 'created' in request_data expected_metadata = build_expected_metadata( record_data, PublicationStates.published.name, owners=[creator.id], PID=request_data['metadata'].get('ePIC_PID'), DOI=request_data['metadata'].get('DOI'), ) assert request_data['metadata'] == expected_metadata # check that the link to the bucket is correctly generated expected_bucket_link = url_for_bucket(record.files.bucket) assert request_data['links']['files'] == expected_bucket_link # test self link subtest_self_link(request_data, request_res.headers, client)
def test_deposit_submit(app, test_records_data, draft_deposits, test_users, login_user): """Test record draft submit with HTTP PATCH.""" with app.app_context(): deposit = Deposit.get_record(draft_deposits[0].deposit_id) record_data = test_records_data[0] with app.test_client() as client: user = test_users['deposits_creator'] login_user(user, client) headers = [('Content-Type', 'application/json-patch+json'), ('Accept', 'application/json')] draft_patch_res = client.patch(url_for( 'b2share_deposit_rest.b2dep_item', pid_value=deposit.pid.pid_value), data=json.dumps([{ "op": "replace", "path": "/publication_state", "value": PublicationStates.submitted.name }]), headers=headers) assert draft_patch_res.status_code == 200 draft_patch_data = json.loads( draft_patch_res.get_data(as_text=True)) expected_metadata = build_expected_metadata( record_data, PublicationStates.draft.name, owners=[user.id], draft=True, ) with app.app_context(): deposit = Deposit.get_record(draft_deposits[0].deposit_id) with app.test_client() as client: user = test_users['deposits_creator'] login_user(user, client) expected_metadata['publication_state'] = \ PublicationStates.submitted.name assert expected_metadata == draft_patch_data['metadata'] assert (deposit['publication_state'] == PublicationStates.submitted.name) subtest_self_link(draft_patch_data, draft_patch_res.headers, client)
def test_deposit_submit(app, test_records_data, draft_deposits, test_users, login_user): """Test record draft submit with HTTP PATCH.""" with app.app_context(): deposit = Deposit.get_record(draft_deposits[0].deposit_id) record_data = test_records_data[0] with app.test_client() as client: user = test_users['deposits_creator'] login_user(user, client) headers = [('Content-Type', 'application/json-patch+json'), ('Accept', 'application/json')] draft_patch_res = client.patch( url_for('b2share_deposit_rest.b2dep_item', pid_value=deposit.pid.pid_value), data=json.dumps([{ "op": "replace", "path": "/publication_state", "value": PublicationStates.submitted.name }]), headers=headers) assert draft_patch_res.status_code == 200 draft_patch_data = json.loads( draft_patch_res.get_data(as_text=True)) expected_metadata = build_expected_metadata( record_data, PublicationStates.draft.name, owners=[user.id], draft=True, ) with app.app_context(): deposit = Deposit.get_record(draft_deposits[0].deposit_id) with app.test_client() as client: user = test_users['deposits_creator'] login_user(user, client) expected_metadata['publication_state'] = \ PublicationStates.submitted.name assert expected_metadata == draft_patch_data['metadata'] assert (deposit['publication_state'] == PublicationStates.submitted.name) subtest_self_link(draft_patch_data, draft_patch_res.headers, client)
def test_deposit_create(app, test_records_data, test_users, login_user): """Test record draft creation.""" headers = [('Content-Type', 'application/json'), ('Accept', 'application/json')] def create_record(client, record_data): return client.post( url_for('b2share_records_rest.b2rec_list'), data=json.dumps(record_data), headers=headers ) # test creating a deposit with anonymous user with app.app_context(): with app.test_client() as client: draft_create_res = create_record(client, test_records_data[0]) assert draft_create_res.status_code == 401 # test creating a deposit with a logged in user with app.app_context(): with app.test_client() as client: user = test_users['normal'] login_user(user, client) # create the deposit for record_data in test_records_data: draft_create_res = create_record(client, record_data) assert draft_create_res.status_code == 201 draft_create_data = json.loads( draft_create_res.get_data(as_text=True)) expected_metadata = build_expected_metadata( record_data, PublicationStates.draft.name, owners=[user.id], draft=True, PID=draft_create_data['metadata'].get('ePIC_PID'), DOI=draft_create_data['metadata'].get('DOI'), ) assert expected_metadata == draft_create_data['metadata'] subtest_self_link(draft_create_data, draft_create_res.headers, client)
def test_deposit_create(app, test_records_data, test_users, login_user): """Test record draft creation.""" headers = [('Content-Type', 'application/json'), ('Accept', 'application/json')] def create_record(client, record_data): return client.post(url_for('b2share_records_rest.b2rec_list'), data=json.dumps(record_data), headers=headers) # test creating a deposit with anonymous user with app.app_context(): with app.test_client() as client: draft_create_res = create_record(client, test_records_data[0]) assert draft_create_res.status_code == 401 # test creating a deposit with a logged in user with app.app_context(): with app.test_client() as client: user = test_users['normal'] login_user(user, client) # create the deposit for record_data in test_records_data: draft_create_res = create_record(client, record_data) assert draft_create_res.status_code == 201 draft_create_data = json.loads( draft_create_res.get_data(as_text=True)) expected_metadata = build_expected_metadata( record_data, PublicationStates.draft.name, owners=[user.id], draft=True, PID=draft_create_data['metadata'].get('ePIC_PID'), DOI=draft_create_data['metadata'].get('DOI'), ) assert expected_metadata == draft_create_data['metadata'] subtest_self_link(draft_create_data, draft_create_res.headers, client)
def test_deposit_publish(app, test_users, test_communities, login_user): """Test record draft publication with HTTP PATCH.""" with app.app_context(): community_name = 'MyTestCommunity1' creator = test_users['deposits_creator'] record_data = generate_record_data(community=community_name) community = Community.get(name=community_name) com_admin = create_user('com_admin', roles=[community.admin_role]) deposit = create_deposit(record_data, creator) deposit_id = deposit.id deposit.submit() db.session.commit() with app.test_client() as client: login_user(com_admin, client) headers = [('Content-Type', 'application/json-patch+json'), ('Accept', 'application/json')] draft_patch_res = client.patch(url_for( 'b2share_deposit_rest.b2dep_item', pid_value=deposit.pid.pid_value), data=json.dumps([{ "op": "replace", "path": "/publication_state", "value": PublicationStates.published.name }]), headers=headers) assert draft_patch_res.status_code == 200 draft_patch_data = json.loads( draft_patch_res.get_data(as_text=True)) expected_metadata = build_expected_metadata( record_data, PublicationStates.published.name, owners=[creator.id], draft=True, PID=draft_patch_data['metadata'].get('ePIC_PID'), DOI=draft_patch_data['metadata'].get('DOI'), ) with app.app_context(): deposit = Deposit.get_record(deposit_id) with app.test_client() as client: login_user(creator, client) assert expected_metadata == draft_patch_data['metadata'] assert (deposit['publication_state'] == PublicationStates.published.name) subtest_self_link(draft_patch_data, draft_patch_res.headers, client) pid, published = deposit.fetch_published() # check that the published record and the deposit are equal except # for the schema cleaned_deposit = { f: v for f, v in deposit.items() if f != '$schema' } cleaned_published = { f: v for f, v in deposit.items() if f != '$schema' } assert cleaned_published == cleaned_deposit # check "published" link assert draft_patch_data['links']['publication'] == \ url_for('b2share_records_rest.{0}_item'.format( RecordUUIDProvider.pid_type ), pid_value=pid.pid_value, _external=True) # check that the published record content match the deposit headers = [('Accept', 'application/json')] self_response = client.get( draft_patch_data['links']['publication'], headers=headers) assert self_response.status_code == 200 published_data = json.loads(self_response.get_data(as_text=True)) # we don't want to compare the links and dates cleaned_published_data = deepcopy(published_data) # the published record has an extra empty 'files' array assert cleaned_published_data['files'] == [] del cleaned_published_data['files'] cleaned_draft_data = deepcopy(draft_patch_data) for item in [cleaned_published_data, cleaned_draft_data]: del item['links'] del item['created'] del item['updated'] del item['metadata']['$schema'] assert cleaned_draft_data == cleaned_published_data
def test_deposit_publish(app, test_users, test_communities, login_user): """Test record draft publication with HTTP PATCH.""" with app.app_context(): community_name = 'MyTestCommunity1' creator = test_users['deposits_creator'] record_data = generate_record_data(community=community_name) community = Community.get(name=community_name) com_admin = create_user('com_admin', roles=[community.admin_role]) deposit = create_deposit(record_data, creator) deposit_id = deposit.id deposit.submit() db.session.commit() with app.test_client() as client: login_user(com_admin, client) headers = [('Content-Type', 'application/json-patch+json'), ('Accept', 'application/json')] draft_patch_res = client.patch( url_for('b2share_deposit_rest.b2dep_item', pid_value=deposit.pid.pid_value), data=json.dumps([{ "op": "replace", "path": "/publication_state", "value": PublicationStates.published.name }]), headers=headers) assert draft_patch_res.status_code == 200 draft_patch_data = json.loads( draft_patch_res.get_data(as_text=True)) expected_metadata = build_expected_metadata( record_data, PublicationStates.published.name, owners=[creator.id], draft=True, PID=draft_patch_data['metadata'].get('ePIC_PID'), DOI=draft_patch_data['metadata'].get('DOI'), ) with app.app_context(): deposit = Deposit.get_record(deposit_id) with app.test_client() as client: login_user(creator, client) assert expected_metadata == draft_patch_data['metadata'] assert (deposit['publication_state'] == PublicationStates.published.name) subtest_self_link(draft_patch_data, draft_patch_res.headers, client) pid, published = deposit.fetch_published() # check that the published record and the deposit are equal except # for the schema cleaned_deposit = {f: v for f, v in deposit.items() if f != '$schema'} cleaned_published = {f: v for f, v in deposit.items() if f != '$schema'} assert cleaned_published == cleaned_deposit # check "published" link assert draft_patch_data['links']['publication'] == \ url_for('b2share_records_rest.{0}_item'.format( RecordUUIDProvider.pid_type ), pid_value=pid.pid_value, _external=True) # check that the published record content match the deposit headers = [('Accept', 'application/json')] self_response = client.get( draft_patch_data['links']['publication'], headers=headers ) assert self_response.status_code == 200 published_data = json.loads(self_response.get_data( as_text=True)) # we don't want to compare the links and dates cleaned_published_data = deepcopy(published_data) # the published record has an extra empty 'files' array assert cleaned_published_data['files'] == [] del cleaned_published_data['files'] cleaned_draft_data = deepcopy(draft_patch_data) for item in [cleaned_published_data, cleaned_draft_data]: del item['links'] del item['created'] del item['updated'] del item['metadata']['$schema'] assert cleaned_draft_data == cleaned_published_data