Pytest: mocking datetime date
examples/pytest/years-passed/app.py
import datetime import math def get_years_passed_category(date_string): date = datetime.date.fromisoformat(date_string) time_passed = datetime.date.today() - date years_passed = time_passed.days // 365 years_passed_start_and_end_range_tuples_to_category = { (0, 1): "Less than 1 year", (1, 5): "1 - 5 years", (5, 10): "5 - 10 years", (10, 20): "10 - 20 years", (20, 30): "20 - 30 years", (30, math.inf): "More than 30 years" } for (start, end), category in years_passed_start_and_end_range_tuples_to_category.items(): if start <= years_passed < end: return category raise ValueError(f"Could not find a years_passed_category for '{date_string}'")
examples/pytest/years-passed/use_app.py
import app for date in ['2000-01-01', '1990-06-02', '2020-01-01']: cat = app.get_years_passed_category(date) print(f"{date} : {cat}")
examples/pytest/years-passed/test_app.py
import app import datetime import pytest def test_app(monkeypatch): mydt = datetime.date class MyDate(): def today(): return mydt(2021, 2, 15) def fromisoformat(date_str): return mydt.fromisoformat(date_str) monkeypatch.setattr(app.datetime, 'date', MyDate) assert app.get_years_passed_category('1990-06-02') == 'More than 30 years' assert app.get_years_passed_category('2000-01-01') == '20 - 30 years' assert app.get_years_passed_category('2011-01-01') == '10 - 20 years' assert app.get_years_passed_category('2016-01-01') == '5 - 10 years' assert app.get_years_passed_category('2020-01-01') == '1 - 5 years' assert app.get_years_passed_category('2021-02-14') == 'Less than 1 year' assert app.get_years_passed_category('2021-02-15') == 'Less than 1 year' with pytest.raises(Exception) as err: app.get_years_passed_category('2021-02-16') assert err.type == ValueError assert str(err.value) == "Could not find a years_passed_category for '2021-02-16'"