def test_aggregations(api_app, es, cds_jsonresolver, users, location, db, deposit_metadata, json_headers): """Test deposit search aggregations.""" project_1, _, _ = new_project(api_app, es, cds_jsonresolver, users, location, db, deposit_metadata) _users = [users[1]] project_2, _, _ = new_project(api_app, es, cds_jsonresolver, _users, location, db, deposit_metadata) RecordIndexer().bulk_index([project_1.id, project_2.id]) RecordIndexer().process_bulk_queue() sleep(2) with api_app.test_client() as client: login_user_via_session(client, email=User.query.get(users[0]).email) url = url_for('invenio_deposit_rest.project_list', q='') res = client.get(url, headers=json_headers) assert res.status_code == 200 data = json.loads(res.data.decode('utf-8')) assert len(data['aggregations']['created_by']['buckets']) == 1 assert data['aggregations']['created_by']['buckets'][0][ 'key'] == users[0] # Invalid query syntax (Invalid ES syntax) url = url_for('invenio_deposit_rest.project_list') res = client.get( url, headers=json_headers, query_string=dict(q='title/back')) assert res.status_code == 400
def test_aggregations(api_app, es, cds_jsonresolver, users, location, db, deposit_metadata, json_headers): """Test default project order.""" # project 1 (project_1, _, _) = new_project( api_app, es, cds_jsonresolver, users, location, db, deposit_metadata, project_data={ 'title': {'title': 'project 1'}, 'category': 'CERN', }, wait=False) project_1.commit() db.session.commit() # project 2 (project_2, video_1, video_2) = new_project( api_app, es, cds_jsonresolver, users, location, db, deposit_metadata, project_data={ 'title': {'title': 'alpha'}, 'description': 'fuu', 'category': 'CERN', 'type': 'FOOTER', }, wait=False) prepare_videos_for_publish([video_1, video_2]) project_2 = project_2.publish() project_2.commit() db.session.commit() # project 3 (project_3, _, _) = new_project( api_app, es, cds_jsonresolver, users, location, db, deposit_metadata, project_data={ 'title': {'title': 'zeta'}, }, wait=False) project_3['category'] = 'LHC' project_3.commit() db.session.commit() # project 4 (project_4, _, _) = new_project( api_app, es, cds_jsonresolver, users, location, db, deposit_metadata, project_data={ 'title': {'title': 'project 2'}, }, wait=False) project_4['category'] = 'ATLAS' project_4.commit() db.session.commit() sleep(2) def check_agg(agg, key, doc_count): [res] = list(filter(lambda x: x['key'] == key, agg['buckets'])) assert res['doc_count'] == doc_count with api_app.test_client() as client: login_user_via_session(client, email=User.query.get(users[0]).email) # test: get all res = client.get( url_for('invenio_deposit_rest.project_list'), headers=json_headers) assert res.status_code == 200 data = json.loads(res.data.decode('utf-8')) agg = data['aggregations'] check_agg(agg['category'], 'CERN', 2) check_agg(agg['category'], 'LHC', 1) check_agg(agg['category'], 'ATLAS', 1) assert len(agg['category']['buckets']) == 3 check_agg(agg['status'], 'draft', 3) check_agg(agg['status'], 'published', 1) assert len(agg['status']['buckets']) == 2 # test: category == 'CERN' res = client.get( url_for('invenio_deposit_rest.project_list', category='CERN'), headers=json_headers) assert res.status_code == 200 data = json.loads(res.data.decode('utf-8')) agg = data['aggregations'] check_agg(agg['category'], 'CERN', 2) assert len(agg['category']['buckets']) == 1 check_agg(agg['status'], 'draft', 1) check_agg(agg['status'], 'published', 1) assert len(agg['status']['buckets']) == 2 # test: category == 'CERN' res = client.get( url_for('invenio_deposit_rest.project_list', status='draft'), headers=json_headers) assert res.status_code == 200 data = json.loads(res.data.decode('utf-8')) agg = data['aggregations'] check_agg(agg['category'], 'CERN', 1) check_agg(agg['category'], 'LHC', 1) check_agg(agg['category'], 'ATLAS', 1) assert len(agg['category']['buckets']) == 3 check_agg(agg['status'], 'draft', 3) assert len(agg['status']['buckets']) == 1
def test_default_order(api_app, es, cds_jsonresolver, users, location, db, deposit_metadata, json_headers): """Test default project order.""" (project_1, _, _) = new_project(api_app, es, cds_jsonresolver, users, location, db, deposit_metadata, project_data={ 'title': {'title': 'project 1'} }, wait=False) project_1.commit() db.session.commit() (project_2, _, _) = new_project(api_app, es, cds_jsonresolver, users, location, db, deposit_metadata, project_data={ 'title': {'title': 'alpha'} }, wait=False) project_2.commit() db.session.commit() (project_3, _, _) = new_project(api_app, es, cds_jsonresolver, users, location, db, deposit_metadata, project_data={ 'title': {'title': 'zeta'} }, wait=False) project_3.commit() db.session.commit() (project_4, _, _) = new_project(api_app, es, cds_jsonresolver, users, location, db, deposit_metadata, project_data={ 'title': {'title': 'project 2'} }, wait=False) project_4.commit() db.session.commit() sleep(2) def check_order(data, orders): hits = [hit['metadata']['title']['title'] for hit in data['hits']['hits']] assert hits == orders with api_app.test_client() as client: login_user_via_session(client, email=User.query.get(users[0]).email) # test order: title descending res = client.get( url_for('invenio_deposit_rest.project_list', sort='-title_desc'), headers=json_headers) assert res.status_code == 200 data = json.loads(res.data.decode('utf-8')) check_order(data, ['zeta', 'project 2', 'project 1', 'alpha']) # test order: title ascending res = client.get( url_for('invenio_deposit_rest.project_list', sort='title_asc'), headers=json_headers) assert res.status_code == 200 data = json.loads(res.data.decode('utf-8')) check_order(data, ['alpha', 'project 1', 'project 2', 'zeta']) # test order: older first res = client.get( url_for('invenio_deposit_rest.project_list', sort='oldest'), headers=json_headers) res = client.get( url_for('invenio_deposit_rest.project_list', sort='oldest'), headers=json_headers) assert res.status_code == 200 data = json.loads(res.data.decode('utf-8')) check_order(data, ['project 1', 'alpha', 'zeta', 'project 2']) # test default order: newest first res = client.get( url_for('invenio_deposit_rest.project_list'), headers=json_headers) assert res.status_code == 200 data = json.loads(res.data.decode('utf-8')) check_order(data, ['project 2', 'zeta', 'alpha', 'project 1'])
def test_sync_owners(api_app, es, cds_jsonresolver, users, location, db, deposit_metadata, json_headers, json_partial_project_headers, video_deposit_metadata, json_partial_video_headers): """Test default project order.""" user_1 = User.query.get(users[0]) user_1_id = str(user_1.id) user_1_email = user_1.email user_2 = User.query.get(users[1]) user_2_id = str(user_2.id) user_2_email = user_2.email # user1 create a project (project, _, _) = new_project( api_app, es, cds_jsonresolver, users, location, db, deposit_metadata, project_data={ 'title': {'title': 'project 1'}, 'category': 'CERN', }, wait=False) assert project['_deposit']['owners'] == [users[0]] project_depid = project['_deposit']['id'] # user1 give to user2 access to the project with api_app.test_client() as client: login_user_via_session(client, email=user_1_email) project_dict = deepcopy(project.replace_refs()) del project_dict['_files'] project_dict['_access'] = {'update': [user_2_email]} res = client.put( url_for('invenio_deposit_rest.project_item', pid_value=project_depid), data=json.dumps(project_dict), headers=json_partial_project_headers) assert res.status_code == 200 # user2 enter a new video with api_app.test_client() as client: @identity_loaded.connect def load_email(sender, identity): if current_user.get_id() == user_2_id: identity.provides.update([UserNeed(user_2_email)]) login_user_via_session(client, email=user_2_email) video_metadata = deepcopy(video_deposit_metadata) video_metadata.update(_project_id=project['_deposit']['id']) res = client.post( url_for('invenio_deposit_rest.video_list'), data=json.dumps(video_metadata), headers=json_partial_video_headers) assert res.status_code == 201 data = json.loads(res.data.decode('utf-8')) video_depid = data['metadata']['_deposit']['id'] # user 2 try to access to the new video res = client.get(url_for('invenio_deposit_rest.video_item', pid_value=video_depid)) assert res.status_code == 200 data = json.loads(res.data.decode('utf-8')) # check user1 is the owner assert data['metadata']['_deposit']['created_by'] == int(user_1_id) # user1 try to access to the video entered by user2 with api_app.test_client() as client: login_user_via_session(client, email=user_1_email) res = client.get(url_for('invenio_deposit_rest.video_item', pid_value=video_depid)) assert res.status_code == 200
def test_preview_video(previewer_app, es, db, cds_jsonresolver, users, location, deposit_metadata, video, preview_func, publish, endpoint_template, ui_blueprint): """Test record video previewing.""" project = new_project(previewer_app, es, cds_jsonresolver, users, location, db, deposit_metadata) project, video_1, _ = project basename = 'test' filename_1 = '{}.mp4'.format(basename) filename_2 = '{}.invalid'.format(basename) deposit_filename = 'playlist.m3u8' bucket_id = video_1['_buckets']['deposit'] preview_func = import_string( 'cds.modules.previewer.views.{0}'.format(preview_func)) # Create objects obj = ObjectVersion.create(bucket=bucket_id, key=filename_1, stream=open(video, 'rb')) ObjectVersionTag.create(obj, 'context_type', 'master') ObjectVersionTag.create(obj, 'preview', True) ObjectVersion.create(bucket=bucket_id, key=filename_2, stream=open(video, 'rb')) success_list = ['new THEOplayer.Player', 'player.source'] if publish: login_user(User.query.get(users[0])) prepare_videos_for_publish([video_1]) video_1 = video_1.publish() assert video_1.status == 'published' pid, video_1 = video_1.fetch_published() # Get SMIL url new_bucket = RecordsBuckets.query.filter_by( record_id=video_1.id).one().bucket_id smil_obj = ObjectVersion.get(new_bucket, '{}.smil'.format(basename)) assert smil_obj file_url = url_for('invenio_records_ui.recid_files', pid_value=pid.pid_value, filename=obj.key) success_list.append(file_url) else: assert video_1.status == 'draft' pid = PersistentIdentifier.get('depid', video_1['_deposit']['id']) success_list.append(deposit_filename) def assert_preview(expected=None, exception=None, **query_params): with previewer_app.test_request_context(query_string=query_params): if exception is not None: with pytest.raises(exception): preview_func(pid, video_1) else: if 'filename' in query_params: filename = query_params['filename'] try: pid_value = pid.pid_value except AttributeError: pid_value = pid assert url_for( 'invenio_records_ui.{0}'.format(ui_blueprint), pid_value=pid_value, filename=filename, ) == endpoint_template.format(pid_value, filename) for exp in expected: assert exp in preview_func(pid, video_1) # Non-existent filename assert_preview(exception=NotFound, filename='non-existent') # Invalid extension assert_preview(expected=['Cannot preview file'], filename=filename_2) # Specific filename assert_preview(expected=success_list, filename=filename_1) # No filename (falls back to file with preview tag) assert_preview(expected=success_list)
def api_project(api_app, es, users, location, db, deposit_metadata): """New project with videos.""" return new_project(api_app, es, cds_jsonresolver, users, location, db, deposit_metadata)
def test_preview_video_html5(previewer_app, es, db, cds_jsonresolver, users, location, deposit_metadata, video, preview_func, publish, endpoint_template, ui_blueprint): """Test record video previewing.""" # Enable HTML5 player previewer_app.config['THEO_LICENCE_KEY'] = None project = new_project(previewer_app, es, cds_jsonresolver, users, location, db, deposit_metadata) project, video_1, _ = project basename = 'test' filename_1 = '{}.mp4'.format(basename) filename_2 = '{}.invalid'.format(basename) bucket_id = video_1['_buckets']['deposit'] preview_func = import_string( 'cds.modules.previewer.views.{0}'.format(preview_func)) # Create objects obj = ObjectVersion.create(bucket=bucket_id, key=filename_1, stream=open(video, 'rb')) ObjectVersionTag.create(obj, 'context_type', 'master') ObjectVersionTag.create(obj, 'preview', True) ObjectVersion.create(bucket=bucket_id, key=filename_2, stream=open(video, 'rb')) success_list = [ '<video', ] if publish: prepare_videos_for_publish([video_1]) video_1 = video_1.publish() assert video_1.status == 'published' pid, video_1 = video_1.fetch_published() else: assert video_1.status == 'draft' pid = PersistentIdentifier.get('depid', video_1['_deposit']['id']) def assert_preview(expected=None, exception=None, **query_params): with previewer_app.test_request_context(query_string=query_params): if exception is not None: with pytest.raises(exception): preview_func(pid, video_1) else: if 'filename' in query_params: filename = query_params['filename'] try: pid_value = pid.pid_value except AttributeError: pid_value = pid assert url_for( 'invenio_records_ui.{0}'.format(ui_blueprint), pid_value=pid_value, filename=filename, ) == endpoint_template.format(pid_value, filename) for exp in expected: assert exp in preview_func(pid, video_1) # Non-existent filename assert_preview(exception=NotFound, filename='non-existent') # Invalid extension assert_preview(expected=['Cannot preview file'], filename=filename_2) # Specific filename assert_preview(expected=success_list, filename=filename_1) # No filename (falls back to file with preview tag) assert_preview(expected=success_list)