add retroactive check for yesterday's missed habits on /today
Users often only realize a habit was missed the next day; a same-day-only check made it impossible to record it after the fact.
This commit is contained in:
@@ -123,6 +123,33 @@ def test_get_today_items_excludes_habits_not_scheduled_today(db_session, test_us
|
||||
assert quit_items == []
|
||||
|
||||
|
||||
# ---- get_yesterday_missed_items ----
|
||||
|
||||
|
||||
def test_get_yesterday_missed_items_includes_unchecked_scheduled_habit(db_session, test_user):
|
||||
habit = _make_habit(db_session, test_user.id, name="어제 놓친 습관")
|
||||
|
||||
missed = log_service.get_yesterday_missed_items(db_session, test_user.id)
|
||||
assert [item.habit_id for item in missed] == [habit.id]
|
||||
|
||||
|
||||
def test_get_yesterday_missed_items_excludes_already_checked(db_session, test_user):
|
||||
habit = _make_habit(db_session, test_user.id)
|
||||
_check(db_session, habit.id, date.today() - timedelta(days=1))
|
||||
|
||||
missed = log_service.get_yesterday_missed_items(db_session, test_user.id)
|
||||
assert missed == []
|
||||
|
||||
|
||||
def test_get_yesterday_missed_items_excludes_habits_not_scheduled_yesterday(db_session, test_user):
|
||||
yesterday = date.today() - timedelta(days=1)
|
||||
other_day_mask = 1 << ((yesterday.weekday() + 1) % 7) # 어제가 아닌 요일 하나만 선택
|
||||
_make_habit(db_session, test_user.id, weekdays_mask=other_day_mask)
|
||||
|
||||
missed = log_service.get_yesterday_missed_items(db_session, test_user.id)
|
||||
assert missed == []
|
||||
|
||||
|
||||
# ---- get_habit_stats: completion_rate ----
|
||||
|
||||
|
||||
|
||||
@@ -1,4 +1,7 @@
|
||||
from datetime import date, timedelta
|
||||
|
||||
from app.models.habit import ALL_WEEKDAYS_MASK, HabitType
|
||||
from app.models.habit_log import HabitLog
|
||||
from app.schemas.habit import HabitCreate
|
||||
from app.services import habit_service
|
||||
|
||||
@@ -38,3 +41,31 @@ def test_toggle_today_page_for_other_users_habit_returns_404(auth_client, db_ses
|
||||
|
||||
response = auth_client.post(f"/today/{others_habit.id}/toggle")
|
||||
assert response.status_code == 404
|
||||
|
||||
|
||||
def test_today_page_shows_yesterday_missed_habit(auth_client, db_session, test_user):
|
||||
_make_habit(db_session, test_user.id, name="어제 놓친 습관")
|
||||
|
||||
response = auth_client.get("/today")
|
||||
assert response.status_code == 200
|
||||
assert "어제 놓친 습관" in response.text
|
||||
|
||||
|
||||
def test_toggle_yesterday_page_creates_log_for_yesterday(auth_client, db_session, test_user):
|
||||
habit = _make_habit(db_session, test_user.id, name="어제 습관")
|
||||
|
||||
response = auth_client.post(f"/today/{habit.id}/toggle-yesterday")
|
||||
assert response.status_code == 200
|
||||
|
||||
yesterday = date.today() - timedelta(days=1)
|
||||
log = db_session.query(HabitLog).filter_by(habit_id=habit.id, log_date=yesterday).one()
|
||||
assert log is not None
|
||||
# 체크되었으니 더 이상 "어제 놓친 습관" 목록에 나오지 않아야 한다.
|
||||
assert "어제 놓친 습관" not in response.text
|
||||
|
||||
|
||||
def test_toggle_yesterday_page_for_other_users_habit_returns_404(auth_client, db_session, other_user):
|
||||
others_habit = _make_habit(db_session, other_user.id, name="남의 습관")
|
||||
|
||||
response = auth_client.post(f"/today/{others_habit.id}/toggle-yesterday")
|
||||
assert response.status_code == 404
|
||||
|
||||
Reference in New Issue
Block a user