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
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
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
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
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
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
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
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
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
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
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
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'
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
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'
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)
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)
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)