@@ -52,6 +52,7 @@ def _envelope(
5252 * ,
5353 context_documents : list [int ] | None = None ,
5454 voice_analysis_summary : dict | None = None ,
55+ end_reason : str = "MAX_QUESTIONS_REACHED" ,
5556) -> bytes :
5657 env = {
5758 "messageId" : "fb-1" ,
@@ -65,7 +66,7 @@ def _envelope(
6566 "mode" : "TECHNICAL" ,
6667 "jobCategory" : "BACKEND" ,
6768 "totalQuestionCount" : 2 ,
68- "endReason" : "MAX_QUESTIONS_REACHED" ,
69+ "endReason" : end_reason ,
6970 "messages" : [
7071 {
7172 "id" : 100 ,
@@ -131,6 +132,26 @@ async def test_consumer_generates_feedback_and_publishes_callback():
131132 assert publisher .publish .await_args .kwargs ["message_type" ] == "callback.feedback"
132133
133134
135+ @pytest .mark .asyncio
136+ async def test_consumer_accepts_pool_exhausted_end_reason ():
137+ # 회귀: Core 가 POOL_EXHAUSTED 로 종료해도 파싱 실패(DLQ) 없이 피드백 생성돼야 한다.
138+ generator = _generator ()
139+ publisher = MagicMock ()
140+ publisher .publish = AsyncMock ()
141+ consumer = FeedbackConsumer (
142+ generator = generator ,
143+ publisher = publisher ,
144+ idempotency = LruIdempotencyStore (max_size = 10 ),
145+ callback_routing_key = "callback.feedback" ,
146+ core_client = MagicMock (),
147+ embedder = None ,
148+ )
149+ await consumer .handle (_StubMessage (_envelope (end_reason = "POOL_EXHAUSTED" )))
150+
151+ generator .generate .assert_awaited_once ()
152+ publisher .publish .assert_awaited_once ()
153+
154+
134155@pytest .mark .asyncio
135156async def test_consumer_calls_rag_when_documents_and_embedder_present ():
136157 generator = _generator ()
0 commit comments