mirror of
https://github.com/Sea-Haven-Industries/afterhours-shift-manager.git
synced 2026-09-30 10:13:11 +00:00
Saturday night stays in the week that ends Saturday, and the first Flex close skips dates already sent.
126 lines
4.6 KiB
Python
126 lines
4.6 KiB
Python
"""Tests for slack-bot module-level helpers."""
|
|
|
|
from unittest.mock import MagicMock
|
|
|
|
from freezegun import freeze_time
|
|
|
|
# Monday 2026-06-01 08:00 ET → weekday, active shift is night.
|
|
MON = "2026-06-01 12:00:00"
|
|
SAT_DATE = "2026-06-06"
|
|
|
|
|
|
class TestShiftTiming:
|
|
def test_shift_start_weekday_night_is_5pm(self, slackbot_app):
|
|
assert slackbot_app._shift_start("2026-06-03", "night").hour == 17
|
|
|
|
def test_shift_start_weekend_day_is_8am(self, slackbot_app):
|
|
assert slackbot_app._shift_start("2026-06-06", "day").hour == 8
|
|
|
|
@freeze_time("2026-06-01 22:00:00") # 18:00 ET
|
|
def test_shift_started_true_after_start(self, slackbot_app):
|
|
assert slackbot_app._shift_started("2026-06-01", "night") is True
|
|
|
|
@freeze_time(MON) # 08:00 ET
|
|
def test_shift_started_false_before_start(self, slackbot_app):
|
|
assert slackbot_app._shift_started("2026-06-01", "night") is False
|
|
|
|
@freeze_time(MON)
|
|
def test_within_drop_lock_for_today(self, slackbot_app):
|
|
assert slackbot_app._within_drop_lock("2026-06-01", "night") is True
|
|
|
|
@freeze_time(MON) # tomorrow 17:00 is ~33h away
|
|
def test_not_within_lock_tomorrow_morning(self, slackbot_app):
|
|
assert slackbot_app._within_drop_lock("2026-06-02", "night") is False
|
|
|
|
@freeze_time("2026-06-01 22:00:00") # 18:00 ET, tomorrow 17:00 now <24h
|
|
def test_within_lock_once_under_24h(self, slackbot_app):
|
|
assert slackbot_app._within_drop_lock("2026-06-02", "night") is True
|
|
|
|
|
|
class TestShowPay:
|
|
@freeze_time("2026-06-08 12:00:00") # Monday 08:00 ET
|
|
def test_falls_back_to_legacy_monday_key(self, slackbot_app, schedule):
|
|
schedule.save_pay_record(
|
|
"2026-06-01",
|
|
{
|
|
"week_start": "2026-06-01",
|
|
"breakdown": [
|
|
{
|
|
"date": "2026-06-01",
|
|
"date_label": "Jun 1",
|
|
"day": "Mon",
|
|
"name": "Alice",
|
|
"extension": "114",
|
|
"rate": 50,
|
|
}
|
|
],
|
|
"totals": {
|
|
"Alice": {
|
|
"shifts": 1,
|
|
"total": 50,
|
|
"extension": "114",
|
|
"rate": 50,
|
|
}
|
|
},
|
|
},
|
|
)
|
|
respond = MagicMock()
|
|
slackbot_app._show_pay(respond, schedule)
|
|
header = respond.call_args.kwargs["blocks"][0]["text"]["text"]
|
|
assert "Jun 1 to Jun 7" in header
|
|
|
|
|
|
class TestIsToday:
|
|
@freeze_time(MON)
|
|
def test_true_for_today(self, slackbot_app):
|
|
assert slackbot_app.is_today("2026-06-01") is True
|
|
|
|
@freeze_time(MON)
|
|
def test_false_for_other_day(self, slackbot_app):
|
|
assert slackbot_app.is_today("2026-06-02") is False
|
|
|
|
|
|
class TestIsActiveShiftType:
|
|
@freeze_time(MON)
|
|
def test_weekday_active_is_night(self, slackbot_app):
|
|
assert slackbot_app._is_active_shift_type("night") is True
|
|
assert slackbot_app._is_active_shift_type("day") is False
|
|
|
|
|
|
class TestShiftTypeLabel:
|
|
def test_weekday_has_no_label(self, slackbot_app):
|
|
assert slackbot_app._shift_type_label("Wednesday", "night") == ""
|
|
|
|
def test_weekend_day(self, slackbot_app):
|
|
assert slackbot_app._shift_type_label("Saturday", "day") == " (Day)"
|
|
|
|
def test_weekend_night(self, slackbot_app):
|
|
assert slackbot_app._shift_type_label("Saturday", "night") == " (Night)"
|
|
|
|
|
|
class TestFindEmployeeShift:
|
|
def test_weekday_night_match(self, slackbot_app, schedule, seed):
|
|
seed.weekly("Wednesday", "114", "Alice")
|
|
found = slackbot_app._find_employee_shift(
|
|
schedule, "2026-06-03", "Wednesday", "114"
|
|
)
|
|
assert found == ("114", "Alice", "weekly", "night")
|
|
|
|
def test_weekend_day_match(self, slackbot_app, schedule, seed):
|
|
seed.weekly("Saturday", "200", "Alice", shift_type="day")
|
|
found = slackbot_app._find_employee_shift(schedule, SAT_DATE, "Saturday", "200")
|
|
assert found == ("200", "Alice", "weekly", "day")
|
|
|
|
def test_weekend_night_match(self, slackbot_app, schedule, seed):
|
|
seed.weekly("Saturday", "201", "Bob", shift_type="night")
|
|
found = slackbot_app._find_employee_shift(schedule, SAT_DATE, "Saturday", "201")
|
|
assert found == ("201", "Bob", "weekly", "night")
|
|
|
|
def test_not_assigned_returns_none(self, slackbot_app, schedule, seed):
|
|
seed.weekly("Wednesday", "114", "Alice")
|
|
assert (
|
|
slackbot_app._find_employee_shift(
|
|
schedule, "2026-06-03", "Wednesday", "999"
|
|
)
|
|
is None
|
|
)
|