import copy import json from test_case_builder import case_setup from test_case_interpreter import built_case, gateway from test_hypothesis_builder import interpreted_case, ProposalAdapter, run from viano_bug_analysis.analysis import HypothesisBuilder from viano_bug_analysis.llm import ProviderResponse from viano_bug_analysis.llm.answer_recovery import PATCH_PROMPT from viano_bug_analysis.package import PackageReader def test_duplicate_title_reuses_full_proposals_and_passes_registry_replay(interpreted_case): store,*_=interpreted_case class Adapter(ProposalAdapter): async def generate(self,config,request,**kwargs): if request['prompt_version']==PATCH_PROMPT: self.requests.append(copy.deepcopy(request)) return ProviderResponse({'replacement':'Stored state after interaction'},'fixture',10,5) return await super().generate(config,request,**kwargs) def duplicate(payload,context):payload['hypotheses'][1]['title']=payload['hypotheses'][0]['title'] adapter=Adapter(duplicate);builder=HypothesisBuilder(store,gateway(adapter)) result=run(builder) assert result.status=='COMPLETED' and len(adapter.requests)==2 old_size=sum(len(m['content']) for m in adapter.requests[0]['messages']) patch_size=sum(len(m['content']) for m in adapter.requests[1]['messages']) assert patch_size < old_size / 2 with PackageReader(result.package) as reader: document=json.loads(reader.read_bytes(result.hypotheses_ref)) assert document['hypotheses'][1]['proposal']['title']=='Stored state after interaction' assert len(document['hypotheses'])==3 assert run(builder).reused and len(adapter.requests)==2