def test_plain_cancel_cannot_bypass_receipt_or_sending_guard(self): for stage, send_state in [('receipt_check', ''), ('uncertain', ''), ('unknown', ''), ('sending', ''), ('queued', 'unknown')]: self.state.update(stage=stage, send_state=send_state) result = self.bot.cancel_pending_replies([self.key]) self.assertEqual(result['protected'], [self.key]) self.assertFalse(result['deleted']) def test_new_task_cannot_receive_an_old_model_result_after_handoff(self): self.state.update(stage='generating', awaiting_review=False) self.bot._consume_database_update = mock.Mock() self.bot.report_progress = mock.Mock() def old_model_returns(*args, **kwargs): self.bot.handoff_pending_replies([self.key]) # A subsequent proven customer message is a different task object. self.bot._manual_handoffs[self.key]['resumed_at'] = 1 self.bot._cancelled_reply_sessions.clear() self.bot._pending_reply_sessions[self.key] = {'stage': 'queued', 'staged_user_text': '后续新问题'} return '旧模型回复' self.bot._generate_ai_reply_impl = mock.Mock(side_effect=old_model_returns) self.assertIsNone(self.bot._generate_ai_reply(self.fp, '旧问题')) self.assertNotIn('staged_reply_text', self.bot._pending_reply_sessions[self.key])