"""Tests for slack-bot _handle_swap.""" from freezegun import freeze_time MON = "2026-06-01 12:00:00" def _setup(seed): seed.roster("114", "Alice", slack_user_id="U_ALICE") seed.roster("115", "Bob", slack_user_id="U_BOB") seed.weekly("Monday", "114", "Alice") # Alice is on the Monday shift @freeze_time(MON) def test_swap_to_mention( slackbot_app, schedule, seed, respond, client, routing_spy, text_of ): _setup(seed) slackbot_app._handle_swap( respond, schedule, "U_ALICE", "swap today <@U_BOB>", "C1", client, None ) override = schedule.get_override("2026-06-01") assert override["extension"] == "115" and override["name"] == "Bob" assert "Swapped" in text_of(respond) routing_spy.assert_called_once_with("115") client.chat_postMessage.assert_called_once() @freeze_time(MON) def test_swap_to_extension(slackbot_app, schedule, seed, respond, client, routing_spy): _setup(seed) slackbot_app._handle_swap( respond, schedule, "U_ALICE", "swap today 115", "C1", client, None ) assert schedule.get_override("2026-06-01")["extension"] == "115" @freeze_time(MON) def test_swap_not_your_shift( slackbot_app, schedule, seed, respond, client, routing_spy, text_of ): seed.roster("114", "Alice", slack_user_id="U_ALICE") seed.roster("115", "Bob", slack_user_id="U_BOB") seed.weekly("Monday", "115", "Bob") # Bob's shift, not Alice's slackbot_app._handle_swap( respond, schedule, "U_ALICE", "swap today <@U_BOB>", "C1", client, None ) assert "not your shift" in text_of(respond).lower() routing_spy.assert_not_called() @freeze_time(MON) def test_swap_target_mention_unregistered( slackbot_app, schedule, seed, respond, client, text_of ): seed.roster("114", "Alice", slack_user_id="U_ALICE") seed.weekly("Monday", "114", "Alice") slackbot_app._handle_swap( respond, schedule, "U_ALICE", "swap today <@U_GHOST>", "C1", client, None ) assert "isn't registered" in text_of(respond) @freeze_time(MON) def test_swap_target_extension_not_found( slackbot_app, schedule, seed, respond, client, text_of ): seed.roster("114", "Alice", slack_user_id="U_ALICE") seed.weekly("Monday", "114", "Alice") slackbot_app._handle_swap( respond, schedule, "U_ALICE", "swap today 999", "C1", client, None ) assert "not found" in text_of(respond).lower() @freeze_time(MON) def test_swap_past_date(slackbot_app, schedule, seed, respond, client, text_of): _setup(seed) slackbot_app._handle_swap( respond, schedule, "U_ALICE", "swap 2026-05-01 <@U_BOB>", "C1", client, None ) assert "past" in text_of(respond).lower() @freeze_time(MON) def test_swap_unregistered_requester(slackbot_app, schedule, respond, client, text_of): slackbot_app._handle_swap( respond, schedule, "U_NOBODY", "swap today 115", "C1", client, None ) assert "not registered" in text_of(respond).lower() @freeze_time(MON) def test_swap_usage(slackbot_app, schedule, respond, client, text_of): slackbot_app._handle_swap( respond, schedule, "U_ALICE", "swap today", "C1", client, None ) assert "Usage" in text_of(respond)