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_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