tests/gateway/test_weixin_typing.py::TestEnsureTypingTicket::test_returns_cached_ticket_when_fresh tests/gateway/test_weixin_typing.py::TestEnsureTypingTicket::test_refreshes_when_ticket_expired tests/gateway/test_weixin_typing.py::TestEnsureTypingTicket::test_refreshes_when_no_cached_ticket tests/gateway/test_weixin_typing.py::TestEnsureTypingTicket::test_uses_stored_context_token_when_available tests/gateway/test_weixin_typing.py::TestEnsureTypingTicket::test_returns_none_when_no_session tests/gateway/test_weixin_typing.py::TestEnsureTypingTicket::test_returns_none_when_getconfig_fails tests/gateway/test_weixin_typing.py::TestEnsureTypingTicket::test_returns_none_when_getconfig_returns_empty_ticket tests/gateway/test_weixin_typing.py::TestEnsureTypingTicket::test_stop_typing_refreshes_ticket tests/gateway/test_weixin_typing.py::TestEnsureTypingTicket::test_send_typing_refreshes_ticket tests/gateway/test_weixin_typing.py::TestTypingTicketCache::test_returns_ticket_when_fresh tests/gateway/test_weixin_typing.py::TestTypingTicketCache::test_returns_none_when_expired tests/gateway/test_weixin_typing.py::TestTypingTicketCache::test_returns_none_when_missing tests/gateway/test_weixin_typing.py::TestTypingTicketCache::test_expired_entry_is_removed_from_cache