Files
VianoBugAnalysis/tests/test_model_context.py

68 lines
4.1 KiB
Python

import copy
import json
from pathlib import Path
from viano_bug_analysis.analysis.model_context import compact_context
from viano_bug_analysis.analysis.prompt import InterpretationPromptBuilder
from test_interpretation_quality import fixture
def test_compaction_preserves_evidence_and_keeps_identifier_domains_distinct():
path = 'original/' + 'a'*64 + '/report.json'
origin = {'source_ref':path,'author':'Tester','observed_at':'2026-10-08T13:00:00Z',
'snapshot_id':'backup:'+'d'*64,'time_scope':'snapshot_not_current_production'}
context={'sources':{
'O0001':{'kind':'observation','data':{'text':'No creatures despite goggles.', 'provenance':origin}},
'C0001':{'kind':'tester_comment','data':{'text':'Horde works.', 'provenance':copy.deepcopy(origin)}},
'F0001':{'kind':'fact','data':{'value':{'query':{'filters':[{'column':'entry','value':23487}]},
'result':{'truncated':True,'coverage':'filtered_rows','next_offset':8,'items':[{'row':{
'entry':23487,'path':path,'sha256':'e'*64,'name':'Wild Wolpertinger'}}]},'origin':origin}}},
'X0001':{'kind':'unread_reference','data':{'path':path,'sha256':'a'*64,'size':100}},
'X0002':{'kind':'unread_reference','data':{'path':'original/'+'b'*64+'/report.json','sha256':'b'*64,'size':200}}}}
before=copy.deepcopy(context)
result=compact_context(context)
assert context==before
assert set(result['sources'])==set(context['sources'])
for sid in context['sources']: assert result['sources'][sid]['kind']==context['sources'][sid]['kind']
assert result['sources']['O0001']['data']['text']==context['sources']['O0001']['data']['text']
assert result['sources']['C0001']['data']['text']=='Horde works.'
assert result['sources']['F0001']['data']['value']['result']==context['sources']['F0001']['data']['value']['result']
assert result['sources']['F0001']['data']['value']['query']==context['sources']['F0001']['data']['value']['query']
assert result['sources']['X0001']['data']['path']!=result['sources']['X0002']['data']['path']
metadata=result['shared_metadata'][result['sources']['O0001']['data']['provenance']['metadata_ref']]
assert metadata['author']=='Tester' and metadata['observed_at']==origin['observed_at']
assert metadata['time_scope']==origin['time_scope']
assert metadata['source_ref']==result['sources']['X0001']['data']['path']
assert result==compact_context(before)
def test_compact_prompt_keeps_all_readable_sources_and_previous_version_is_unchanged():
context=fixture()['context']
context['sources']['D0098']={'kind':'data_quality','case_pointer':'/interpretation_quality/names',
'data':{'name_binding_policy':'typed_name_bindings_v1'}}
builder=InterpretationPromptBuilder()
previous=builder.build(context)
before=copy.deepcopy(context)
assert previous['prompt_version']=='case_interpretation_resolved_v5'
context['sources']['D0099']={'kind':'data_quality','case_pointer':'/interpretation_quality/model_context',
'data':{'model_context_policy':'compact_storage_v1'}}
new=builder.build(context)
projected=json.loads(new['messages'][1]['content'])['input']
assert new['prompt_version']=='case_interpretation_resolved_v6'
assert set(projected['sources'])==set(context['sources'])
assert len(new['messages'][1]['content'])<len(previous['messages'][1]['content'])*0.8
for sid,source in context['sources'].items():
if source['kind'] in {'observation','report','tester_comment','tester_assumption','expectation'}:
for key in ('text','title','summary'):
assert projected['sources'][sid]['data'].get(key)==source['data'].get(key)
assert builder.build(before)==previous
assert before==json.loads(previous['messages'][1]['content'])['input']
def test_meaningful_long_source_paths_and_human_text_are_not_shortened():
path='src/very_long_but_meaningful_namespace/subsystem/another_component/visibility_handler.cpp'
text='a'*100
context={'sources':{'O0001':{'kind':'observation','data':{'text':text}},
'X0001':{'kind':'unread_reference','data':{'path':path}}}}
assert compact_context(context)==context