afterhours-shift-manager/tests/slack_bot/test_parse_date.py
seahaven-openswe[bot] eb78a98de0
[#133] Expand /oncall date parser to accept more formats (#137)
* Expand /oncall date parser to accept more formats

Users entering everyday forms like 7/3/26 hit a generic parse
failure because the parser only accepted four-digit years and a
bare m/d. Add two-digit-year and month-name (with optional
ordinal/year) formats, treating explicit-year inputs as fixed and
keeping the year-less roll-forward for bare m/d. Update the help
text and per-command parse hints to match.

Refs: #133

* Add dash 4-digit year format and pin year boundary

Dash inputs like 7-3-2026 previously returned None because only the
slash variant had a 4-digit-year format. Add %m-%d-%Y so dash and slash
behave alike, and pin the two-digit-year century boundary with a test.

Refs: #133

---------

Co-authored-by: amoussa1229 <166072409+amoussa1229@users.noreply.github.com>
2026-06-26 15:07:02 -04:00

124 lines
3.7 KiB
Python
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

"""Tests for slack-bot parse_date — flexible date parsing."""
from freezegun import freeze_time
# All frozen to Monday 2026-06-01 (ET 08:00).
FROZEN = "2026-06-01 12:00:00"
@freeze_time(FROZEN)
def test_today(slackbot_app):
assert slackbot_app.parse_date("today").strftime("%Y-%m-%d") == "2026-06-01"
@freeze_time(FROZEN)
def test_tomorrow(slackbot_app):
assert slackbot_app.parse_date("tomorrow").strftime("%Y-%m-%d") == "2026-06-02"
@freeze_time(FROZEN)
def test_future_day_name(slackbot_app):
# Friday of the same week.
assert slackbot_app.parse_date("friday").strftime("%Y-%m-%d") == "2026-06-05"
@freeze_time(FROZEN)
def test_same_day_name_jumps_a_week(slackbot_app):
# Monday on a Monday → next Monday, never today.
assert slackbot_app.parse_date("monday").strftime("%Y-%m-%d") == "2026-06-08"
@freeze_time(FROZEN)
def test_iso_date(slackbot_app):
assert slackbot_app.parse_date("2026-07-04").strftime("%Y-%m-%d") == "2026-07-04"
@freeze_time(FROZEN)
def test_month_slash_day(slackbot_app):
assert slackbot_app.parse_date("7/4").strftime("%Y-%m-%d") == "2026-07-04"
@freeze_time(FROZEN)
def test_month_dash_day(slackbot_app):
assert slackbot_app.parse_date("7-4").strftime("%Y-%m-%d") == "2026-07-04"
@freeze_time(FROZEN)
def test_past_month_day_wraps_to_next_year(slackbot_app):
# Jan 1 is well in the past → assume next year.
assert slackbot_app.parse_date("1/1").year == 2027
@freeze_time(FROZEN)
def test_case_insensitive(slackbot_app):
assert slackbot_app.parse_date(" FRIDAY ").strftime("%Y-%m-%d") == "2026-06-05"
@freeze_time(FROZEN)
def test_two_digit_year_slash(slackbot_app):
assert slackbot_app.parse_date("7/3/26").strftime("%Y-%m-%d") == "2026-07-03"
@freeze_time(FROZEN)
def test_two_digit_year_padded(slackbot_app):
assert slackbot_app.parse_date("07/03/26").strftime("%Y-%m-%d") == "2026-07-03"
@freeze_time(FROZEN)
def test_two_digit_year_dash(slackbot_app):
assert slackbot_app.parse_date("7-3-26").strftime("%Y-%m-%d") == "2026-07-03"
@freeze_time(FROZEN)
def test_four_digit_year_dash(slackbot_app):
assert slackbot_app.parse_date("7-3-2026").strftime("%Y-%m-%d") == "2026-07-03"
@freeze_time(FROZEN)
def test_two_digit_year_century_boundary(slackbot_app):
# Python's %y maps 00–68 → 2000s and 69–99 → 1900s. Pin it so nobody
# "fixes" the ambiguity by accident later.
assert slackbot_app.parse_date("12/31/99").year == 1999
assert slackbot_app.parse_date("1/1/68").year == 2068
@freeze_time(FROZEN)
def test_two_digit_year_past_not_rolled(slackbot_app):
# Explicit two-digit year in the past stays put — no roll-forward.
assert slackbot_app.parse_date("1/1/26").strftime("%Y-%m-%d") == "2026-01-01"
@freeze_time(FROZEN)
def test_month_name_short(slackbot_app):
assert slackbot_app.parse_date("jul 3").strftime("%Y-%m-%d") == "2026-07-03"
@freeze_time(FROZEN)
def test_month_name_full(slackbot_app):
assert slackbot_app.parse_date("july 3").strftime("%Y-%m-%d") == "2026-07-03"
@freeze_time(FROZEN)
def test_month_name_with_year(slackbot_app):
assert slackbot_app.parse_date("july 3 2026").strftime("%Y-%m-%d") == "2026-07-03"
@freeze_time(FROZEN)
def test_month_name_ordinal(slackbot_app):
assert slackbot_app.parse_date("july 3rd").strftime("%Y-%m-%d") == "2026-07-03"
@freeze_time(FROZEN)
def test_month_name_past_wraps_to_next_year(slackbot_app):
# Year-less month name in the past rolls forward, like m/d.
assert slackbot_app.parse_date("jan 1").year == 2027
@freeze_time(FROZEN)
def test_eastern_tz_stamped(slackbot_app):
assert slackbot_app.parse_date("7/3/26").tzinfo is not None
@freeze_time(FROZEN)
def test_invalid_returns_none(slackbot_app):
assert slackbot_app.parse_date("notaday") is None