Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Delineate between daily / annual limit csv validation #339

Open
wants to merge 3 commits into
base: main
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
19 changes: 17 additions & 2 deletions notifications_utils/recipients.py
Original file line number Diff line number Diff line change
Expand Up @@ -89,7 +89,9 @@ def __init__(
max_initial_rows_shown=10,
safelist=None,
template=None,
remaining_messages=sys.maxsize,
remaining_messages=sys.maxsize, # TODO FF_ANNUAL_LIMIT removal - remove this param
remaining_daily_messages=sys.maxsize,
remaining_annual_messages=sys.maxsize,
international_sms=False,
max_rows=50000,
user_language="en",
Expand All @@ -104,6 +106,8 @@ def __init__(
self.template = template if isinstance(template, Template) else None
self.international_sms = international_sms
self.remaining_messages = remaining_messages
self.remaining_daily_messages = remaining_daily_messages
self.remaining_annual_messages = remaining_annual_messages
self.rows_as_list = None
self.max_rows = max_rows

Expand Down Expand Up @@ -162,7 +166,9 @@ def has_errors(self):
return bool(
self.missing_column_headers
or self.duplicate_recipient_column_headers
or self.more_rows_than_can_send
or self.more_rows_than_can_send # TODO FF_ANNUAL_LIMIT removal - Remove this check
or self.more_rows_than_can_send_this_year
or self.more_rows_than_can_send_today
or self.too_many_rows
or (not self.allowed_to_send_to)
or any(self.rows_with_errors)
Expand Down Expand Up @@ -229,10 +235,19 @@ def get_rows(self):
else:
yield None

# TODO FF_ANNUAL_LIMIT removal - remove this property
@property
def more_rows_than_can_send(self):
whabanks marked this conversation as resolved.
Show resolved Hide resolved
return len(self) > self.remaining_messages

@property
def more_rows_than_can_send_today(self):
return len(self) > self.remaining_daily_messages

@property
def more_rows_than_can_send_this_year(self):
return len(self) > self.remaining_annual_messages

@property
def sms_fragment_count(self):
if self.template_type != "sms":
Expand Down
2 changes: 1 addition & 1 deletion pyproject.toml
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
[tool.poetry]
name = "notifications-utils"
version = "53.0.2"
version = "53.0.3"
description = "Shared python code for Notification - Provides logging utils etc."
authors = ["Canadian Digital Service"]
license = "MIT license"
Expand Down
11 changes: 11 additions & 0 deletions tests/conftest.py
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
from contextlib import contextmanager
from unittest.mock import Mock

import pytest
Expand All @@ -9,6 +10,16 @@ class FakeService:
id = "1234"


@contextmanager
def set_config(app, name, value):
old_val = app.config.get(name)
app.config[name] = value
try:
yield
finally:
app.config[name] = old_val


@pytest.fixture
def app():
flask_app = Flask(__name__)
Expand Down
94 changes: 90 additions & 4 deletions tests/test_recipient_csv.py
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,8 @@
from notifications_utils.template import SMSMessageTemplate
from ordered_set import OrderedSet

from tests.conftest import set_config


def _index_rows(rows):
return set(row.index for row in rows)
Expand Down Expand Up @@ -873,17 +875,100 @@ def test_ignores_leading_whitespace_in_file(character, name):
assert not recipients.has_errors


def test_error_if_too_many_email_recipients():
def test_error_if_too_many_email_recipients_for_year(app):
with set_config(app, "FF_ANNUAL_LIMIT", True):
recipients = RecipientCSV(
"email address,\[email protected],\[email protected],\[email protected],",
placeholders=["email_address"],
template_type="email",
remaining_annual_messages=2,
)
assert recipients.has_errors
assert recipients.more_rows_than_can_send_this_year


def test_error_if_too_many_sms_recipients_for_year(app):
with set_config(app, "FF_ANNUAL_LIMIT", True):
recipients = RecipientCSV(
"phone number,\n6502532222,\n6502532222,\n6502532222,",
placeholders=["phone_number"],
template_type="sms",
template=SMSMessageTemplate(
{"content": "test message", "template_type": "sms"},
sender=None,
prefix=None,
),
remaining_annual_messages=2,
)
assert recipients.has_errors
assert recipients.more_rows_than_can_send_this_year


def test_dont_error_if_too_many_recipients_not_specified_for_year(app):
with set_config(app, "FF_ANNUAL_LIMIT", True):
recipients = RecipientCSV(
"phone number,\n6502532222,\n6502532222,\n6502532222,", placeholders=["phone_number"], template_type="sms"
)
assert not recipients.has_errors
assert not recipients.more_rows_than_can_send_this_year


def test_error_if_too_many_email_recipients_for_today(app):
with set_config(app, "FF_ANNUAL_LIMIT", True):
recipients = RecipientCSV(
"email address,\[email protected],\[email protected],\[email protected],",
placeholders=["email_address"],
template_type="email",
remaining_daily_messages=2,
)
assert recipients.has_errors
assert recipients.more_rows_than_can_send_today


def test_error_if_too_many_sms_recipients_for_today(app):
with set_config(app, "FF_ANNUAL_LIMIT", True):
recipients = RecipientCSV(
"phone number,\n6502532222,\n6502532222,\n6502532222,",
placeholders=["phone_number"],
template_type="sms",
template=SMSMessageTemplate(
{"content": "test message", "template_type": "sms"},
sender=None,
prefix=None,
),
remaining_daily_messages=2,
)
assert recipients.has_errors
assert recipients.more_rows_than_can_send_today


def test_dont_error_if_too_many_recipients_not_specified_for_today(app):
with set_config(app, "FF_ANNUAL_LIMIT", True):
recipients = RecipientCSV(
"phone number,\n6502532222,\n6502532222,\n6502532222,", placeholders=["phone_number"], template_type="sms"
)
assert not recipients.has_errors
assert not recipients.more_rows_than_can_send_today


# TODO: FF_ANNUAL_LIMIT removal - remove this test
def test_error_if_too_many_email_recipients(app):
recipients = RecipientCSV(
"email address,\[email protected],\[email protected],\[email protected],",
placeholders=["email_address"],
template_type="email",
"phone number,\n6502532222,\n6502532222,\n6502532222,",
placeholders=["phone_number"],
template_type="sms",
template=SMSMessageTemplate(
{"content": "test message", "template_type": "sms"},
sender=None,
prefix=None,
),
remaining_messages=2,
)
assert recipients.has_errors
assert recipients.more_rows_than_can_send


# TODO: FF_ANNUAL_LIMIT removal - remove this test
def test_error_if_too_many_sms_recipients():
recipients = RecipientCSV(
"phone number,\n6502532222,\n6502532222,\n6502532222,",
Expand All @@ -900,6 +985,7 @@ def test_error_if_too_many_sms_recipients():
assert recipients.more_rows_than_can_send


# TODO: FF_ANNUAL_LIMIT removal - remove this test
def test_dont_error_if_too_many_recipients_not_specified():
recipients = RecipientCSV(
"phone number,\n6502532222,\n6502532222,\n6502532222,", placeholders=["phone_number"], template_type="sms"
Expand Down
Loading