コード例 #1
0
def patron_sion_no_email(app, roles, patron_type_grown_sion, patron_sion_data):
    """Create Sion patron without sending reset password instruction."""
    ptrn = Patron.create(data=patron_sion_data,
                         delete_pid=False,
                         dbcommit=True,
                         reindex=True)
    flush_index(PatronsSearch.Meta.index)
    return ptrn
コード例 #2
0
def system_librarian_sion(app, roles, lib_sion, system_librarian_sion_data):
    """Create Sion system librarian record."""
    ptrn = Patron.create(data=system_librarian_sion_data,
                         delete_pid=False,
                         dbcommit=True,
                         reindex=True)
    flush_index(PatronsSearch.Meta.index)
    return ptrn
コード例 #3
0
def user_patron_no_email(app, roles, library, patron_type, user_patron_data):
    """."""
    ptrn = Patron.create(data=user_patron_data,
                         delete_pid=False,
                         dbcommit=True,
                         reindex=True)
    flush_index(PatronsSearch.Meta.index)
    return ptrn
コード例 #4
0
def librarian_martigny(app, roles, lib_martigny, librarian_martigny_data):
    """Create Martigny librarian record."""
    ptrn = Patron.create(data=librarian_martigny_data,
                         delete_pid=False,
                         dbcommit=True,
                         reindex=True)
    flush_index(PatronsSearch.Meta.index)
    return ptrn
コード例 #5
0
def librarian_sion_no_email(app, roles, lib_sion, librarian_sion_data):
    """Create sion librarian without sending reset password instruction."""
    ptrn = Patron.create(data=librarian_sion_data,
                         delete_pid=False,
                         dbcommit=True,
                         reindex=True)
    flush_index(PatronsSearch.Meta.index)
    return ptrn
コード例 #6
0
def patron2_martigny_no_email(app, roles, patron_type_adults_martigny,
                              patron2_martigny_data):
    """Create Martigny patron without sending reset password instruction."""
    ptrn = Patron.create(data=patron2_martigny_data,
                         delete_pid=False,
                         dbcommit=True,
                         reindex=True)
    flush_index(PatronsSearch.Meta.index)
    return ptrn
コード例 #7
0
def patron_sion(app, roles, lib_sion, patron_type_grown_sion,
                patron_sion_data):
    """Create Sion patron record."""
    ptrn = Patron.create(data=patron_sion_data,
                         delete_pid=False,
                         dbcommit=True,
                         reindex=True)
    flush_index(PatronsSearch.Meta.index)
    return ptrn
コード例 #8
0
def system_librarian_martigny_no_email(app, roles, lib_martigny,
                                       system_librarian_martigny_data):
    """Create Martigny system librarian without sending reset password."""
    ptrn = Patron.create(data=system_librarian_martigny_data,
                         delete_pid=False,
                         dbcommit=True,
                         reindex=True)
    flush_index(PatronsSearch.Meta.index)
    return ptrn
コード例 #9
0
def patron2_martigny(app, roles, lib_martigny, patron_type_adults_martigny,
                     patron2_martigny_data):
    """Create Martigny patron record."""
    ptrn = Patron.create(data=patron2_martigny_data,
                         delete_pid=False,
                         dbcommit=True,
                         reindex=True)
    flush_index(PatronsSearch.Meta.index)
    return ptrn
コード例 #10
0
def user_patron_specific(app, roles, library, user_librarian_type,
                         user_patron_data_specific):
    """."""
    ptrn = Patron.create(
        data=user_patron_data_specific,
        delete_pid=False,
        dbcommit=True,
        reindex=True)
    flush_index(PatronsSearch.Meta.index)
    return ptrn
コード例 #11
0
def sip2_patron_martigny_no_email(app, roles, patron_type_children_martigny,
                                  sip2_patron_martigny_data):
    """Create Martigny patron without sending reset password instruction."""
    # create patron account
    patron = Patron.create(data=sip2_patron_martigny_data,
                           delete_pid=False,
                           dbcommit=True,
                           reindex=True)

    flush_index(PatronsSearch.Meta.index)
    return patron
コード例 #12
0
def test_patron_create(app, roles, librarian_martigny_data_tmp,
                       mailbox):
    """Test Patron creation."""
    ds = app.extensions['invenio-accounts'].datastore
    email = librarian_martigny_data_tmp.get('email')
    assert not ds.find_user(email=email)
    assert len(mailbox) == 0
    ptrn = Patron.create(
        librarian_martigny_data_tmp,
        dbcommit=True,
        delete_pid=True
    )
    user = ds.find_user(email=email)
    assert user
    user_roles = [r.name for r in user.roles]
    assert set(user_roles) == set(ptrn.get('roles'))
    assert len(mailbox) == 1
    assert ptrn.get('email') in mailbox[0].recipients
    assert ptrn == librarian_martigny_data_tmp
    assert ptrn.get('pid') == '1'

    ptrn = Patron.get_record_by_pid('1')
    assert ptrn == librarian_martigny_data_tmp

    fetched_pid = patron_id_fetcher(ptrn.id, ptrn)
    assert fetched_pid.pid_value == '1'
    assert fetched_pid.pid_type == 'ptrn'

    # set librarian
    roles = ['librarian']
    ptrn.update({'roles': roles}, dbcommit=True)
    user_roles = [r.name for r in user.roles]
    assert set(user_roles) == set(roles)
    roles = Patron.available_roles
    ptrn.update({'roles': Patron.available_roles}, dbcommit=True)
    user_roles = [r.name for r in user.roles]
    assert set(user_roles) == set(Patron.available_roles)

    # remove patron
    ptrn.delete()
    # user still exist in the invenio db
    user = ds.find_user(email=email)
    assert user
    # all roles has been removed
    assert not user.roles
    assert len(mailbox) == 1
    # patron does not exists anymore
    ptrn = Patron.get_record_by_pid('1')
    assert ptrn is None
    ptrn = Patron.get_record_by_pid('1', with_deleted=True)
    assert ptrn == {}
    assert ptrn.persistent_identifier.pid_value == '1'
コード例 #13
0
def patron_martigny(
        app,
        roles,
        lib_martigny,
        patron_type_children_martigny,
        patron_martigny_data):
    """Create Martigny patron record."""
    ptrn = Patron.get_record_by_pid(patron_martigny_data.get('pid'))
    if ptrn:
        ptrn = ptrn.update(
            data=patron_martigny_data,
            dbcommit=True,
            reindex=True
        )
    else:
        ptrn = Patron.create(
            data=patron_martigny_data,
            delete_pid=False,
            dbcommit=True,
            reindex=True)
    flush_index(PatronsSearch.Meta.index)
    return ptrn
コード例 #14
0
def test_patron_create(app, roles, librarian_martigny_data_tmp,
                       patron_type_adults_martigny, mailbox):
    """Test Patron creation."""
    ds = app.extensions['invenio-accounts'].datastore
    email = librarian_martigny_data_tmp.get('email')
    assert not ds.find_user(email=email)
    assert len(mailbox) == 0

    wrong_librarian_martigny_data_tmp = deepcopy(librarian_martigny_data_tmp)
    wrong_librarian_martigny_data_tmp.pop('first_name')
    with pytest.raises(ValidationError):
        ptrn = Patron.create(
            wrong_librarian_martigny_data_tmp,
            dbcommit=True,
            delete_pid=True
        )

    wrong_librarian_martigny_data_tmp = deepcopy(librarian_martigny_data_tmp)
    wrong_librarian_martigny_data_tmp.pop('library')
    with pytest.raises(RecordValidationError):
        ptrn = Patron.create(
            wrong_librarian_martigny_data_tmp,
            dbcommit=True,
            delete_pid=True
        )

    wrong_librarian_martigny_data_tmp = deepcopy(librarian_martigny_data_tmp)
    wrong_librarian_martigny_data_tmp['subscriptions'] = [{
        'start_date': '2000-01-01',
        'end_date': '2001-01-01',
        'patron_type': {'$ref': 'https://ils.rero.ch/api/patron_types/xxx'},
        'patron_transaction': {
            '$ref': 'https://ils.rero.ch/api/patron_transactions/xxx'
        },
    }]
    with pytest.raises(RecordValidationError):
        ptrn = Patron.create(
            wrong_librarian_martigny_data_tmp,
            dbcommit=True,
            delete_pid=True
        )

    ptrn = Patron.create(
        librarian_martigny_data_tmp,
        dbcommit=True,
        delete_pid=False
    )
    user = ds.find_user(email=email)
    assert user
    user_roles = [r.name for r in user.roles]
    assert set(user_roles) == set(ptrn.get('roles'))
    assert len(mailbox) == 1
    assert re.search(r'localhost/lost-password', mailbox[0].body)
    assert ptrn.get('email') in mailbox[0].recipients
    assert ptrn == librarian_martigny_data_tmp
    assert ptrn.get('pid') == 'ptrn2'

    ptrn = Patron.get_record_by_pid('ptrn2')
    assert ptrn == librarian_martigny_data_tmp

    fetched_pid = patron_id_fetcher(ptrn.id, ptrn)
    assert fetched_pid.pid_value == 'ptrn2'
    assert fetched_pid.pid_type == 'ptrn'

    # set librarian
    roles = ['librarian']
    ptrn.update({'roles': roles}, dbcommit=True)
    user_roles = [r.name for r in user.roles]
    assert set(user_roles) == set(roles)
    roles = Patron.available_roles
    data = {
        'roles': Patron.available_roles,
        'patron_type': {'$ref': 'https://ils.rero.ch/api/patron_types/ptty2'}
    }
    ptrn.update(data, dbcommit=True)
    user_roles = [r.name for r in user.roles]
    assert set(user_roles) == set(Patron.available_roles)

    # remove patron
    ptrn.delete()
    # user still exist in the invenio db
    user = ds.find_user(email=email)
    assert user
    # all roles has been removed
    assert not user.roles
    assert len(mailbox) == 1
    # patron does not exists anymore
    ptrn = Patron.get_record_by_pid('ptrn2')
    assert ptrn is None
    ptrn = Patron.get_record_by_pid('ptrn2', with_deleted=True)
    assert ptrn == {}
    assert ptrn.persistent_identifier.pid_value == 'ptrn2'
コード例 #15
0
def test_patron_create(app, roles, lib_martigny, librarian_martigny_data_tmp,
                       patron_type_adults_martigny, mailbox):
    """Test Patron creation."""
    ds = app.extensions['invenio-accounts'].datastore
    email = librarian_martigny_data_tmp.get('email')

    # sanity checks
    assert len(mailbox) == 0
    assert User.query.count() == 0
    assert UserProfile.query.count() == 0
    l_martigny_data_tmp = librarian_martigny_data_tmp
    librarian_martigny_data_tmp = create_user_from_data(
        librarian_martigny_data_tmp)
    # wrong_librarian_martigny_data_tmp = deepcopy(librarian_martigny_data_tmp)
    # wrong_librarian_martigny_data_tmp.pop('first_name')
    # with pytest.raises(ValidationError):
    #     ptrn = Patron.create(
    #         wrong_librarian_martigny_data_tmp,
    #         dbcommit=True,
    #         delete_pid=True
    #     )

    wrong_librarian_martigny_data_tmp = deepcopy(librarian_martigny_data_tmp)
    wrong_librarian_martigny_data_tmp.pop('libraries')
    with pytest.raises(ValidationError):
        ptrn = Patron.create(wrong_librarian_martigny_data_tmp,
                             dbcommit=True,
                             delete_pid=True)

    wrong_librarian_martigny_data_tmp = deepcopy(librarian_martigny_data_tmp)
    wrong_librarian_martigny_data_tmp.setdefault(
        'patron', {
            'expiration_date': '2023-10-07',
            'barcode': ['2050124311'],
            'type': {
                '$ref': 'https://bib.rero.ch/api/patron_types/ptty2'
            },
            'communication_channel': 'email',
            'communication_language': 'ita'
        })
    wrong_librarian_martigny_data_tmp['patron']['subscriptions'] = [{
        'start_date':
        '2000-01-01',
        'end_date':
        '2001-01-01',
        'patron_type': {
            '$ref': 'https://bib.rero.ch/api/patron_types/xxx'
        },
        'patron_transaction': {
            '$ref': 'https://bib.rero.ch/api/patron_transactions/xxx'
        },
    }]
    with pytest.raises(ValidationError):
        ptrn = Patron.create(wrong_librarian_martigny_data_tmp,
                             dbcommit=True,
                             delete_pid=True)

    # no data has been created
    assert len(mailbox) == 0
    # assert User.query.count() == 0
    # assert UserProfile.query.count() == 0

    ptrn = Patron.create(librarian_martigny_data_tmp,
                         dbcommit=True,
                         delete_pid=False)
    user = User.query.filter_by(id=ptrn.get('user_id')).first()
    user_id = ptrn.get('user_id')
    assert user
    assert user.active
    for field in [
            'first_name', 'last_name', 'street', 'postal_code', 'city',
            'username', 'home_phone'
    ]:
        assert getattr(user.profile, field) == l_martigny_data_tmp.get(field)
    user.profile.birth_date == datetime.strptime(
        l_martigny_data_tmp.get('birth_date'), '%Y-%m-%d')
    user_roles = [r.name for r in user.roles]
    assert set(user_roles) == set(ptrn.get('roles'))
    # TODO: make these checks during the librarian POST creation
    # assert len(mailbox) == 1
    # assert re.search(r'localhost/lost-password', mailbox[0].body)
    # assert re.search(
    #     r'Someone requested that the password' +
    #     ' for your RERO ID account be reset.', mailbox[0].body
    # )
    # assert re.search(
    #     r'Best regards', mailbox[0].body
    # )
    # assert ptrn.get('email') in mailbox[0].recipients
    librarian_martigny_data_tmp['user_id'] = 1
    assert ptrn == librarian_martigny_data_tmp
    assert ptrn.get('pid') == 'ptrn2'

    ptrn = Patron.get_record_by_pid('ptrn2')
    # assert ptrn == librarian_martigny_data_tmp

    fetched_pid = patron_id_fetcher(ptrn.id, ptrn)
    assert fetched_pid.pid_value == 'ptrn2'
    assert fetched_pid.pid_type == 'ptrn'

    # set librarian
    roles = ['librarian']
    ptrn.update({'roles': roles}, dbcommit=True)
    user_roles = [r.name for r in user.roles]
    assert set(user_roles) == set(roles)
    roles = Patron.available_roles
    data = {
        'roles': Patron.available_roles,
        'patron': {
            'expiration_date': '2023-10-07',
            'barcode': ['2050124311'],
            'type': {
                '$ref': 'https://bib.rero.ch/api/patron_types/ptty2'
            },
            'communication_channel': 'email',
            'communication_language': 'ita'
        }
    }
    ptrn.update(data, dbcommit=True)
    user_roles = [r.name for r in user.roles]
    assert set(user_roles) == set(Patron.available_roles)

    # remove patron
    ptrn.delete(False, True, True)
    # user still exist in the invenio db
    user = ds.find_user(email=email)
    assert user
    # all roles has been removed
    assert not user.roles
    # assert len(mailbox) == 1
    # patron does not exists anymore
    ptrn = Patron.get_record_by_pid('ptrn2')
    assert ptrn is None
    ptrn = Patron.get_record_by_pid('ptrn2', with_deleted=True)
    assert ptrn == {}
    assert ptrn.persistent_identifier.pid_value == 'ptrn2'
    # remove patron
    ptrn.delete(True, True, True)
    # clean up the user
    ds.delete_user(user)
コード例 #16
0
def test_patron_create_without_email(app, roles, patron_type_children_martigny,
                                     patron_martigny_data_tmp, mailbox):
    """Test Patron creation without an email."""
    patron_martigny_data_tmp = deepcopy(patron_martigny_data_tmp)

    # no data has been created
    mailbox.clear()
    del patron_martigny_data_tmp['email']

    patron_martigny_data_tmp = \
        create_user_from_data(patron_martigny_data_tmp)

    # comminication channel require at least one email
    patron_martigny_data_tmp['patron']['communication_channel'] = 'email'
    with pytest.raises(ValidationError):
        ptrn = Patron.create(patron_martigny_data_tmp,
                             dbcommit=True,
                             delete_pid=True)

    # create a patron without email
    patron_martigny_data_tmp['patron']['communication_channel'] = 'mail'
    ptrn = Patron.create(patron_martigny_data_tmp,
                         dbcommit=True,
                         delete_pid=True)
    # user has been created
    user = User.query.filter_by(id=ptrn.get('user_id')).first()
    assert user
    assert not user.email
    assert user == ptrn.user
    assert user.active
    assert len(mailbox) == 0

    # # add an email of a non existing user
    # patron_martigny_data_tmp['email'] = '*****@*****.**'
    # ptrn.replace(
    #     data=patron_martigny_data_tmp,
    #     dbcommit=True
    # )
    # # the user remains the same
    # assert user == ptrn.user
    # assert user.email == patron_martigny_data_tmp['email']
    # assert user.active
    # assert len(mailbox) == 0

    # # update with a new email in the system
    # patron_martigny_data_tmp['email'] = '*****@*****.**'
    # ptrn.replace(
    #     data=patron_martigny_data_tmp,
    #     dbcommit=True
    # )
    # # the user remains the same
    # assert user == ptrn.user
    # assert user.email == patron_martigny_data_tmp['email']
    # assert user.active
    # assert len(mailbox) == 0

    # # remove the email
    # del patron_martigny_data_tmp['email']
    # ptrn.replace(
    #     data=patron_martigny_data_tmp,
    #     dbcommit=True
    # )
    # assert user == ptrn.user
    # assert not user.email
    # assert user.active
    # assert len(mailbox) == 0

    # # create a new invenio user in the system
    # rero_id_user = create_test_user(email='*****@*****.**', active=True)

    # # update the patron with the email of the freshed create invenio user
    # patron_martigny_data_tmp['email'] = '*****@*****.**'
    # patron_martigny_data_tmp['username'] = '******'
    # ptrn.replace(
    #     data=patron_martigny_data_tmp,
    #     dbcommit=True
    # )
    # # the user linked with the patron has been changed
    # assert rero_id_user == ptrn.user
    # # the username is updated on both user profile and patron
    # assert rero_id_user.profile.username == ptrn.get('username') == 'reroid'

    # clean up created users
    ds = app.extensions['invenio-accounts'].datastore
    ds.delete_user(user)
コード例 #17
0
ファイル: test_patrons_api.py プロジェクト: BadrAly/rero-ils
def test_patron_create_without_email(app, roles, patron_type_children_martigny,
                                     patron_martigny_data_tmp, mailbox):
    """Test Patron creation without an email."""
    patron_martigny_data_tmp = deepcopy(patron_martigny_data_tmp)

    # no data has been created
    mailbox.clear()

    # create a patron without email
    del patron_martigny_data_tmp['email']
    ptrn = Patron.create(patron_martigny_data_tmp,
                         dbcommit=True,
                         delete_pid=True)
    # user has been created
    user = User.query.filter_by(id=ptrn.get('user_id')).first()
    assert user
    assert not user.email
    assert user == ptrn.user
    assert user.active
    assert len(mailbox) == 0

    # add an email of a non existing user
    patron_martigny_data_tmp['email'] = '*****@*****.**'
    ptrn.replace(data=patron_martigny_data_tmp, dbcommit=True)
    # the user remains the same
    assert user == ptrn.user
    assert user.email == patron_martigny_data_tmp['email']
    assert user.active
    assert len(mailbox) == 0

    # update with a new email in the system
    patron_martigny_data_tmp['email'] = '*****@*****.**'
    ptrn.replace(data=patron_martigny_data_tmp, dbcommit=True)
    # the user remains the same
    assert user == ptrn.user
    assert user.email == patron_martigny_data_tmp['email']
    assert user.active
    assert len(mailbox) == 0

    # remove the email
    del patron_martigny_data_tmp['email']
    ptrn.replace(data=patron_martigny_data_tmp, dbcommit=True)
    assert user == ptrn.user
    assert not user.email
    assert user.active
    assert len(mailbox) == 0

    # create a new invenio user in the system
    rero_id_user = create_test_user(email='*****@*****.**', active=True)

    # update the patron with the email of the freshed create invenio user
    patron_martigny_data_tmp['email'] = '*****@*****.**'
    patron_martigny_data_tmp['username'] = '******'
    ptrn.replace(data=patron_martigny_data_tmp, dbcommit=True)
    # the user linked with the patron has been changed
    assert rero_id_user == ptrn.user
    # the username is updated on both user profile and patron
    assert rero_id_user.profile.username == ptrn.get('username') == 'reroid'

    # clean up created users
    ds = app.extensions['invenio-accounts'].datastore
    ds.delete_user(user)
    ds.delete_user(rero_id_user)