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
Beispiel #2
0
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
Beispiel #3
0
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'])
Beispiel #4
0
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
Beispiel #5
0
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)