def subtest_search_aggregation_serialization(app, user_factory, expected): """Test the serialization of elasticsearch aggregations.""" with app.app_context(): # create the record using the internal API pid1, record1 = create_record(test_data) pid2, record2 = create_record(test_data2) pid3, record3 = create_record(test_data3) with user_factory('allowed') as allowed_user: # create one user allowed to delete the record allowed_user.read_access(True, str(record1.id)) allowed_user.read_access(True, str(record2.id)) allowed_user.read_access(True, str(record3.id)) allowed_login = allowed_user.login_function() db.session.commit() app.config['RECORDS_REST_FACETS'] = { 'invenio_records_rest_test_index': { 'aggs': { 'stars': {'terms': {'field': 'stars'}} }, 'post_filters': { 'type': terms_filter('type'), } } } es_index = app.config["RECORDS_REST_DEFAULT_SEARCH_INDEX"] current_search_client.indices.flush(wait_if_ongoing=True, force=True, index=es_index) with app.test_client() as client: allowed_login(client) headers = [('Accept', 'application/json')] res = client.get(url_for('invenio_records_rest.recid_list', q='the', sort='year'), headers=headers) assert res.status_code == 200 data = json.loads(res.get_data(as_text=True)) assert isinstance(data['hits']['hits'], list) assert data['hits']['total'] == 3 subtest_expected_hits(data['hits']['hits'], [ (pid3.pid_value, control_num(test_data3, 3)), (pid1.pid_value, control_num(test_data, 1)), (pid2.pid_value, control_num(test_data2, 2)), ], client) assert data['aggregations'] == expected
def test_valid_get(app): """Test VALID record get request (GET .../records/<record_id>).""" with app.app_context(): # create the record using the internal API pid, record = create_record(test_data) with app.test_client() as client: headers = [('Accept', 'application/json')] res = client.get(url_for('invenio_records_rest.recid_item', pid_value=pid.pid_value), headers=headers) assert res.status_code == 200 # check that the returned record matches the given data response_data = json.loads(res.get_data(as_text=True)) assert response_data['metadata'] == control_num(test_data) # check the returned id assert 'id' in response_data.keys() assert str(response_data['id']) == pid.pid_value # check that the returned self link returns the same data subtest_self_link(response_data, res.headers, client)
def test_valid_create(app, resolver): """Test VALID record creation request (POST .../records/).""" with app.app_context(): with app.test_client() as client: headers = [('Content-Type', 'application/json'), ('Accept', 'application/json')] res = client.post(url_for('invenio_records_rest.recid_list'), data=json.dumps(test_data), headers=headers) assert res.status_code == 201 # check that the returned record matches the given data response_data = json.loads(res.get_data(as_text=True)) # note that recid_minter ingests the control_number. assert response_data['metadata'] == control_num(test_data) # check that an internal record returned id and that it contains # the same data assert 'id' in response_data.keys() pid, internal_record = resolver.resolve(response_data['id']) assert internal_record == response_data['metadata'] # check that the returned self link returns the same data subtest_self_link(response_data, res.headers, client)
def test_valid_search(app, user_factory): """Test VALID record search request (GET .../records/?q=...).""" with app.app_context(): # create the record using the internal API pid1, record1 = create_record(test_data) pid2, record2 = create_record(test_data2) pid3, record3 = create_record(test_data3) pid4, record4 = create_record(test_data4) with user_factory('allowed') as allowed_user, \ user_factory('forbidden') as forbidden_user: # create one user allowed to delete the record allowed_user.read_access(True, str(record1.id)) allowed_user.read_access(True, str(record2.id)) allowed_user.read_access(True, str(record3.id)) allowed_user.read_access(True, str(record4.id)) allowed_login = allowed_user.login_function() # create one user who is not allowed to delete the record forbidden_user.read_access(False, str(record1.id)) forbidden_user.read_access(False, str(record2.id)) forbidden_user.read_access(False, str(record3.id)) forbidden_user.read_access(False, str(record4.id)) forbidden_login = forbidden_user.login_function() db.session.commit() es_index = app.config["RECORDS_REST_DEFAULT_SEARCH_INDEX"] current_search_client.indices.flush(wait_if_ongoing=True, force=True, index=es_index) with app.test_client() as client: forbidden_login(client) headers = [('Accept', 'application/json')] res = client.get(url_for('invenio_records_rest.recid_list', q='back'), headers=headers) assert res.status_code == 200 data = json.loads(res.get_data(as_text=True)) assert isinstance(data['hits']['hits'], list) assert len(data['hits']['hits']) == 0 with app.test_client() as client: allowed_login(client) headers = [('Accept', 'application/json')] res = client.get(url_for('invenio_records_rest.recid_list', q='back', sort='-year'), headers=headers) assert res.status_code == 200 data = json.loads(res.get_data(as_text=True)) assert isinstance(data['hits']['hits'], list) assert data['hits']['total'] == 2 subtest_expected_hits(data['hits']['hits'], [ (pid2.pid_value, control_num(test_data2, 2)), (pid1.pid_value, control_num(test_data, 1)), ], client) # test pagination with app.test_client() as client: allowed_login(client) headers = [('Accept', 'application/json')] res = client.get(url_for('invenio_records_rest.recid_list', q='the', page='1', size='2', sort='year'), headers=headers) assert res.status_code == 200 data = json.loads(res.get_data(as_text=True)) assert isinstance(data['hits']['hits'], list) assert data['hits']['total'] == 3 subtest_expected_hits(data['hits']['hits'], [ (pid3.pid_value, control_num(test_data3, 3)), (pid1.pid_value, control_num(test_data, 1)), ], client) assert 'next' in data['links'].keys() assert 'prev' not in data['links'].keys() # check next page url = external_to_relative_url(data['links']['next']) res2 = client.get(url) assert res2.status_code == 200 data2 = json.loads(res2.get_data(as_text=True)) assert isinstance(data2['hits']['hits'], list) assert data2['hits']['total'] == 3 subtest_expected_hits(data2['hits']['hits'], [ (pid2.pid_value, control_num(test_data2, 2)), ], client) assert 'next' not in data2['links'].keys() assert 'prev' in data2['links'].keys() # check previous page url = external_to_relative_url(data2['links']['prev']) res3 = client.get(url) assert res3.status_code == 200 # check that the previous link returns the same response data3 = json.loads(res3.get_data(as_text=True)) data3_copy = copy.deepcopy(data3) data3_copy['links'] = { k: normalise_url(v) for k, v in data3_copy['links'].items() } data_copy = copy.deepcopy(data) data_copy['links'] = { k: normalise_url(v) for k, v in data_copy['links'].items() } assert data3_copy == data_copy