from __future__ import annotations import json import sys from pathlib import Path ROOT = Path(__file__).resolve().parents[1] SRC = ROOT / 'src' for candidate in (ROOT, SRC): if str(candidate) not in sys.path: sys.path.insert(0, str(candidate)) from app_kit.config import load_app_config from app_kit.storage import SQLiteStore from apps._base import _process_uploaded_files from apps.p4_food_waste.app import create_project_spec def _prepare_env(monkeypatch, tmp_path: Path) -> None: monkeypatch.setenv('APP_ROOT_DIR', str(ROOT)) monkeypatch.setenv('ARTIFACT_DIR', str(tmp_path / 'artifacts')) monkeypatch.setenv('SQLITE_PATH', str(tmp_path / 'sqlite' / 'p4.sqlite3')) def test_upload_processing_creates_trace_artifact_and_record(tmp_path, monkeypatch) -> None: _prepare_env(monkeypatch, tmp_path) spec = create_project_spec() config = load_app_config(spec.key, data_subdir=spec.data_subdir) store = SQLiteStore(config.sqlite_path, config.artifact_dir) note_path = tmp_path / 'note.txt' receipt_path = tmp_path / 'receipt.txt' note_path.write_text( 'Weekly household notes with leafy greens and fruit waste. Several leftovers were forgotten.', encoding='utf-8', ) receipt_path.write_text( 'Receipt summary: leafy greens, fruit, bread\nItem list: groceries and leftovers.', encoding='utf-8', ) try: output, status = _process_uploaded_files([str(note_path), str(receipt_path)], spec, store, config) records = store.list_records(spec.key) finally: store.close() assert status == '✅ Processed 2 document(s) successfully.' assert output assert not output.startswith('❌') assert len(records) == 1 record = records[0] assert record['project'] == spec.key assert record['pack_id'].startswith('upload_') payload = json.loads(record['json_blob']) assert payload['waste_category'] assert payload['receipt_table'] trace_paths = sorted((Path(config.artifact_dir) / 'traces').glob('app-upload-*.json')) assert trace_paths, 'expected an app-upload trace artifact to be written' trace = json.loads(trace_paths[-1].read_text(encoding='utf-8')) assert trace['kind'] == 'app-upload' assert trace['project'] == spec.key assert trace['file_count'] == 2 assert trace['pack_id'].startswith('upload_')