def test_on_patron_update(): """Test patron resolvers.""" indexer = _get_mock() pid = "2" patron = Patron.get_patron(pid) PatronIndexer().index(patron) referenced = _assert_origin(indexer, PATRON_PID_TYPE, pid) # should re-index loans n_loans = 3 # from test data _assert_contains(referenced, CIRCULATION_LOAN_PID_TYPE) # should re-index document request n_doc_req = 1 # from test data _assert_contains(referenced, DOCUMENT_REQUEST_PID_TYPE) # should re-index acq n_acq = 1 # from test data _assert_contains(referenced, ORDER_PID_TYPE) # should re-index ill n_ill = 3 # from test data _assert_contains(referenced, BORROWING_REQUEST_PID_TYPE) expected_total = n_loans + n_doc_req + n_acq + n_ill assert len(referenced) == expected_total
def test_email_on_overdue_loans(app_with_mail, db, users, testdata, mocker): """Test that an email is sent for a loan that is overdue.""" mocker.patch( "invenio_app_ils.patrons.api.Patron.get_patron", return_value=Patron(users["patron1"].id), ) def prepare_data(): """Prepare data.""" days = current_app.config[ "ILS_CIRCULATION_MAIL_OVERDUE_REMINDER_INTERVAL"] loans = testdata["loans"] recs = [] now = arrow.utcnow() def new_end_date(loan, date): loan["end_date"] = date.date().isoformat() loan["state"] = "ITEM_ON_LOAN" loan.commit() recs.append(loan) # overdue loans date = now - timedelta(days=days) new_end_date(loans[0], date) date = now - timedelta(days=days * 2) new_end_date(loans[1], date) # not overdue or overdue but not to be notified remaining_not_overdue = loans[2:] for loan in remaining_not_overdue: days = random.choice([-1, 0, 1]) date = now - timedelta(days=days) new_end_date(loan, date) db.session.commit() indexer = RecordIndexer() for rec in recs: indexer.index(rec) current_search.flush_and_refresh(index="*") prepare_data() with app_with_mail.extensions["mail"].record_messages() as outbox: assert len(outbox) == 0 send_overdue_loans_mail_reminder.apply_async() assert len(outbox) == 2
def test_email_on_expiring_loans(app_with_mail, db, users, testdata, mocker): """Test that an email is sent for a loan that is about to expire.""" mocker.patch( "invenio_app_ils.patrons.api.Patron.get_patron", return_value=Patron(users["patron1"].id), ) def prepare_data(): """Prepare data.""" max_days = current_app.config["ILS_CIRCULATION_LOAN_WILL_EXPIRE_DAYS"] loans = testdata["loans"] recs = [] now = arrow.utcnow() def new_end_date(loan, date): loan["end_date"] = date.date().isoformat() loan["state"] = "ITEM_ON_LOAN" loan.commit() recs.append(loan) # expiring loans date = now + timedelta(days=max_days) new_end_date(loans[0], date) new_end_date(loans[1], date) new_end_date(loans[2], date) # not expiring remaining_not_overdue = loans[3:] for loan in remaining_not_overdue: days = random.choice([-2, -1, max_days + 1, max_days + 2]) date = now + timedelta(days=days) new_end_date(loan, date) db.session.commit() indexer = RecordIndexer() for rec in recs: indexer.index(rec) current_search.flush_and_refresh(index="*") prepare_data() with app_with_mail.extensions["mail"].record_messages() as outbox: assert len(outbox) == 0 send_expiring_loans_mail_reminder.apply_async() assert len(outbox) == 3
def test_email_on_overdue_loans(app_with_mail, db, users, testdata, mocker, client, json_headers): """Test that an email is sent for a loan that is overdue.""" mocker.patch( "invenio_app_ils.patrons.api.Patron.get_patron", return_value=Patron(users["patron1"].id), ) def prepare_data(): """Prepare data.""" days = current_app.config[ "ILS_CIRCULATION_MAIL_OVERDUE_REMINDER_INTERVAL"] loans = testdata["loans"] recs = [] now = arrow.utcnow() def new_end_date(loan, date): loan["end_date"] = date.date().isoformat() loan["state"] = "ITEM_ON_LOAN" loan.commit() recs.append(loan) # overdue loans date = now - timedelta(days=days) new_end_date(loans[0], date) date = now - timedelta(days=days * 2) new_end_date(loans[1], date) # not overdue date = now - timedelta(days=-1) new_end_date(loans[2], date) # not overdue or overdue but not to be notified remaining_not_overdue = loans[3:] for loan in remaining_not_overdue: days = random.choice([-1, 0, 1]) date = now - timedelta(days=days) new_end_date(loan, date) db.session.commit() indexer = RecordIndexer() for rec in recs: indexer.index(rec) current_search.flush_and_refresh(index="*") user_login(client, "librarian", users) # test individual overdue loan prepare_data() loans = testdata["loans"] email_url = url_for( "invenio_app_ils_circulation.loanid_email", pid_value=loans[0]["pid"], ) res = client.post(email_url, headers=json_headers) assert res.status_code == 202 # test individual not overdue loan email_url = url_for( "invenio_app_ils_circulation.loanid_email", pid_value=loans[2]["pid"], ) res = client.post(email_url, headers=json_headers) assert res.status_code == 400 user_logout(client) # test all loans with app_with_mail.extensions["mail"].record_messages() as outbox: assert len(outbox) == 0 send_overdue_loans_mail_reminder.apply_async() assert len(outbox) == 2