"""Tests for the 18+ age gate on user registration.""" from datetime import date, timedelta import pytest from app.routers.auth import calculate_age class TestCalculateAge: """Unit tests for the calculate_age helper.""" def test_exactly_18(self): """A person born exactly 18 years ago today is 18.""" today = date(2025, 6, 15) dob = today.replace(year=today.year - 18) assert calculate_age(dob, today=today) == 18 def test_just_turned_18(self): """A person who turned 18 yesterday is 18.""" today = date(2025, 6, 15) dob = today.replace(year=today.year - 18) - timedelta(days=1) assert calculate_age(dob, today=today) == 18 def test_one_day_short_of_18(self): """A person born one day after their 18th birthday is 17.""" today = date(2025, 6, 15) dob = today.replace(year=today.year - 18) + timedelta(days=1) assert calculate_age(dob, today=today) == 17 def test_17_years_old(self): """A person who is 17 years old today is 17.""" today = date(2025, 6, 15) dob = date(2008, 6, 15) assert calculate_age(dob, today=today) == 17 def test_65_years_old(self): """A person who is 65 is correctly calculated.""" today = date(2025, 6, 15) dob = today.replace(year=today.year - 65) assert calculate_age(dob, today=today) == 65 def test_newborn(self): """A newborn is 0.""" today = date(2025, 6, 15) dob = today assert calculate_age(dob, today=today) == 0 def test_birthday_not_yet_this_year(self): """Person born Dec 31, 2000 — on Jan 1, 2025 they are still 24.""" dob = date(2000, 12, 31) assert calculate_age(dob, today=date(2025, 1, 1)) == 24 def test_birthday_today(self): """Person born Dec 31, 2000 — on Dec 31, 2024 they turn 24.""" dob = date(2000, 12, 31) assert calculate_age(dob, today=date(2024, 12, 31)) == 24 class TestRegisterRequestDateValidation: """Tests for the RegisterRequest date_of_birth field validator.""" @pytest.mark.parametrize( "dob", [ "2000-01-01", "1990-12-31", "2004-02-29", # leap day ], ) def test_valid_dates(self, dob): """Valid YYYY-MM-DD dates pass validation.""" from app.routers.auth import RegisterRequest req = RegisterRequest(username="u", email="u@example.com", password="p", date_of_birth=dob) assert req.date_of_birth == dob @pytest.mark.parametrize( "dob", [ "01-01-2000", "2000/01/01", "2000-13-01", "2000-00-10", "not-a-date", "", ], ) def test_invalid_dates_rejected(self, dob): """Invalid dates are rejected by the validator.""" from app.routers.auth import RegisterRequest with pytest.raises(ValueError): RegisterRequest(username="u", email="u@example.com", password="p", date_of_birth=dob)