def test_last_sent_at_returns_datetime_when_last_sent(database_file: Path): sm = SentEmails(database_file) data = [ { "address": "*****@*****.**", "topic": "Something", "sent_at": datetime(2020, 4, 6, 0, 0, 0), }, { "address": "*****@*****.**", "topic": "Something", "sent_at": datetime(2020, 4, 8, 0, 0, 0), }, { "address": "*****@*****.**", "topic": "Something", "sent_at": datetime(2020, 4, 7, 0, 0, 0), }, { "address": "*****@*****.**", "topic": "Something", "sent_at": datetime(2020, 4, 9, 0, 0, 0), }, ] for d in data: sm.register(address=d["address"], topic=d["topic"], sent_at=d["sent_at"]) t = sm.last_sent_at(address="*****@*****.**", topic="Something") assert t == data[1]["sent_at"]
def test_sent_emails_are_returned_ordered_by_datetime(database_file: Path): sm = SentEmails(database_file) ordered_times = [ datetime(2019, 7, 5, 12, 0, 0, 0), datetime(2020, 1, 1, 0, 0, 0, 0), datetime(2020, 1, 1, 0, 0, 0, 1), datetime(2020, 1, 1, 0, 0, 0, 2), datetime(2020, 1, 1, 0, 15, 0, 1), datetime(2020, 1, 14, 0, 7, 0, 1), datetime(2020, 9, 1, 0, 15, 0, 1), datetime(2021, 1, 1, 0, 0, 0, 1), ] unordered_times = [ ordered_times[3], ordered_times[2], ordered_times[7], ordered_times[5], ordered_times[6], ordered_times[0], ordered_times[1], ordered_times[4], ] address = "*****@*****.**" topic = "Something" for t in unordered_times: sm.register(address=address, topic=topic, sent_at=t) ts = sm.sent_at(address=address, topic=topic) assert ts == ordered_times
def test_an_empty_list_is_returned_if_no_email_has_been_sent_for_topic( database_file: Path, ): sm = SentEmails(database_file) sm.register("*****@*****.**", "Something", datetime(2020, 1, 1, 0, 0, 0, 0)) ts = sm.sent_at("*****@*****.**", "Something else") assert len(list(ts)) == 0
def test_register_sent_email(database_file: Path): sent_emails = SentEmails(database_file) address = "*****@*****.**" topic = "Pay invoice 123" sent_at = datetime(2020, 9, 15, 12, 55, 17, 0) sent_emails.register(address=address, topic=topic, sent_at=sent_at) rows = _fetch_rows(database_file) assert len(rows) == 1 assert set(rows[0]) == {address, topic, sent_at}
def test_only_the_requested_address_and_topic_are_considered( database_file: Path): sm = SentEmails(database_file) data = [ { "address": "*****@*****.**", "topic": "Something", "sent_at": datetime(2020, 9, 15, 17, 0, 0), }, { "address": "*****@*****.**", "topic": "Something", "sent_at": datetime(2020, 9, 15, 18, 0, 0), }, { "address": "*****@*****.**", "topic": "Something else", "sent_at": datetime(2020, 9, 15, 19, 0, 0), }, { "address": "*****@*****.**", "topic": "Something", "sent_at": datetime(2020, 10, 15, 17, 0, 0), }, { "address": "*****@*****.**", "topic": "Something", "sent_at": datetime(2020, 10, 15, 18, 0, 0), }, { "address": "*****@*****.**", "topic": "Something else", "sent_at": datetime(2020, 10, 15, 19, 0, 0), }, ] for d in data: sm.register(**d) ts = sm.sent_at(address=data[0]["address"], topic=data[0]["topic"]) assert ts == [data[0]["sent_at"], data[3]["sent_at"]]
def test_database_table_is_not_recreated(database_file: Path): sm = SentEmails(database_file) sm.register( address="*****@*****.**", topic="Something", sent_at=datetime(2019, 5, 3, 23, 45, 56), ) sm2 = SentEmails(database_file) ts = sm2.sent_at(address="*****@*****.**", topic="Something") assert len(list(ts)) == 1
def test_the_same_datetime_can_occur_more_than_once(database_file): sm = SentEmails(database_file) sm.register( address="*****@*****.**", topic="Something", sent_at=datetime(2020, 7, 31, 9, 14, 8), ) sm.register( address="*****@*****.**", topic="Something", sent_at=datetime(2020, 7, 31, 9, 14, 8), ) sm.register( address="*****@*****.**", topic="Something", sent_at=datetime(2020, 7, 31, 9, 14, 8), ) ts = sm.sent_at(address="*****@*****.**", topic="Something") assert len(list(ts)) == 3
def email_sent_at(email_receiver: str, proposal_code: str) -> Optional[datetime]: return SentEmails.last_sent_at(SentEmails(os.environ["SENT_EMAILS_DB"]), email_receiver, _email_topic(proposal_code))
def log_to_database(email_receiver, proposal_code): now = datetime.now() sent_emails = SentEmails(os.environ["SENT_EMAILS_DB"]) sent_emails.register(email_receiver, _email_topic(proposal_code), now)
def test_an_empty_list_is_returned_if_database_is_empty(database_file: Path): sm = SentEmails(database_file) ts = sm.sent_at("*****@*****.**", "Something") assert len(list(ts)) == 0
def test_last_sent_at_returns_none_if_never_sent(database_file: Path): sm = SentEmails(database_file) t = sm.last_sent_at(address="*****@*****.**", topic="Something") assert t is None