diff --git a/api/organisations/tasks.py b/api/organisations/tasks.py index 25efa8911804..e4132b5509ae 100644 --- a/api/organisations/tasks.py +++ b/api/organisations/tasks.py @@ -3,6 +3,7 @@ from datetime import timedelta from app_analytics.influxdb_wrapper import get_current_api_usage +from dateutil.relativedelta import relativedelta from django.conf import settings from django.core.mail import send_mail from django.db.models import F, Max, Q @@ -154,7 +155,7 @@ def charge_for_api_call_count_overages(): # Get the period where we're interested in any new API usage # notifications for the relevant billing period (ie, this month). - api_usage_notified_at = now - timedelta(days=30) + api_usage_notified_at = now - relativedelta(months=1) # Since we're only interested in monthly billed accounts, set a wide # threshold to catch as many billing periods that could be roughly diff --git a/api/tests/unit/organisations/test_unit_organisations_tasks.py b/api/tests/unit/organisations/test_unit_organisations_tasks.py index a96d7c6ce1f6..4f8d7d081053 100644 --- a/api/tests/unit/organisations/test_unit_organisations_tasks.py +++ b/api/tests/unit/organisations/test_unit_organisations_tasks.py @@ -5,6 +5,7 @@ import pytest from core.helpers import get_current_site_url +from dateutil.relativedelta import relativedelta from django.core.mail.message import EmailMultiAlternatives from django.template.loader import render_to_string from django.utils import timezone @@ -834,10 +835,19 @@ def test_charge_for_api_call_count_overages_scale_up( organisation.subscription.subscription_id = "fancy_sub_id23" organisation.subscription.plan = "scale-up-v2" organisation.subscription.save() + + # In order to cover an edge case found in production use, we make the + # notification date just outside the previous 30 days, because we want + # to make sure that we cover the case where someone with very high usage + # is notified in the first day of their subscription period (in a 31-day + # month). + notification_date = now - (timedelta(days=30) + timedelta(minutes=30)) + assert notification_date > now - relativedelta(months=1) + OrganisationAPIUsageNotification.objects.create( organisation=organisation, percent_usage=100, - notified_at=now, + notified_at=notification_date, ) mocker.patch("organisations.chargebee.chargebee.chargebee.Subscription.retrieve")