"""Non-prod must not call Slack or 3CX.""" from unittest.mock import MagicMock from shared.effects import prod_side_effects_enabled from shared.holiday_flow import activate from shared.side_effects import slack_call, slack_token, update_3cx_routing def test_missing_stage_keeps_prod_effects(monkeypatch): monkeypatch.delenv("STAGE", raising=False) assert prod_side_effects_enabled() is True def test_dev_stage_disables_effects(monkeypatch): monkeypatch.setenv("STAGE", "dev") assert prod_side_effects_enabled() is False def test_dev_slack_token_does_not_read_secrets(monkeypatch): monkeypatch.setenv("STAGE", "dev") monkeypatch.setenv( "SLACK_BOT_TOKEN_SECRET", "afterhours-shift-manager/slack-bot-token" ) read = MagicMock(side_effect=AssertionError("secret read")) monkeypatch.setattr("shared.side_effects.get_secret", read) assert slack_token() is None read.assert_not_called() def test_dev_slack_call_does_not_post(monkeypatch): monkeypatch.setenv("STAGE", "dev") post = MagicMock(side_effect=AssertionError("slack post")) monkeypatch.setattr("shared.side_effects.requests.post", post) assert slack_call("chat.postMessage", "xoxb-token", channel="C0APATP612N") is False post.assert_not_called() def test_dev_skips_3cx_even_when_queue_is_configured(monkeypatch): monkeypatch.setenv("STAGE", "dev") monkeypatch.setenv("QUEUE_NUMBER", "801") monkeypatch.setenv("TCX_SECRET_PREFIX", "afterhours-shift-manager/3cx-") route = MagicMock(side_effect=AssertionError("3cx")) monkeypatch.setattr("shared.side_effects.update_queue_routing", route) update_3cx_routing("101") route.assert_not_called() def test_dev_holiday_activate_does_not_build_a_client(monkeypatch): monkeypatch.setenv("STAGE", "dev") factory = MagicMock(side_effect=AssertionError("3cx client")) result = activate(MagicMock(), "2026-07-04", client_factory=factory) assert result["skipped"] == "non_prod" factory.assert_not_called()