Ctrl K
ComunidadGuías…

tests/test_gbrain_verifier.py

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
"""Execute the real Bun verifier against an isolated read-only SQL adapter."""
import json
import os
from pathlib import Path
import shutil
import subprocess
import tempfile
import unittest

from _isolation import isolated_env

ROOT = Path(__file__).resolve().parents[1]
BUN = shutil.which('bun')


@unittest.skipUnless(BUN, 'Bun runtime required for the TypeScript verifier')
class VerifierProtocol(unittest.TestCase):
    def setUp(self):
        self.tmp = tempfile.TemporaryDirectory()
        self.addCleanup(self.tmp.cleanup)
        self.root = Path(self.tmp.name)
        files = {
            'src/core/config.ts': 'export function loadConfig() { return {database_url: "fixture"}; }',
            'src/core/markdown.ts': 'export function parseMarkdown(content) { return JSON.parse(content); }',
            'src/core/chunkers/recursive.ts': 'export function chunkText(text) { return [{text}]; }',
            'node_modules/postgres/src/index.js': '''
import {readFileSync} from 'node:fs';
export default function postgres() {
  const data = JSON.parse(readFileSync(process.env.FIXTURE_DB, 'utf8'));
  return {
    async begin(mode, callback) {
      if (mode !== 'read only' || data.unavailable) throw new Error('not readable');
      return callback(async (parts) => {
        const query = parts.join('?');
        if (!query.startsWith('SELECT')) throw new Error('write attempted');
        if (query.includes('FROM pages')) return data.pages;
        if (query.includes('FROM tags')) return data.tags;
        if (query.includes('FROM content_chunks')) return data.chunks;
        if (query === 'SELECT 1') return [{one: 1}];
        throw new Error('unknown query');
      });
    },
    async end() {},
  };
}
''',
        }
        for name, content in files.items():
            path = self.root / name
            path.parent.mkdir(parents=True, exist_ok=True)
            path.write_text(content, encoding='utf-8')
        self.expected = {'compiled_truth': 'Current body', 'timeline': 'Current history',
                         'frontmatter': {'id': '2016309053379772746', 'category': 'tech'},
                         'title': 'Evidence', 'type': 'knowledge-card', 'tags': ['fixture']}
        self.data = {'pages': [{'id': 1, **self.expected}], 'tags': [{'tag': 'fixture'}],
                     'chunks': [
                         {'chunk_index': 0, 'chunk_text': 'Current body', 'chunk_source': 'compiled_truth', 'embedded': True},
                         {'chunk_index': 1, 'chunk_text': 'Current history', 'chunk_source': 'timeline', 'embedded': True},
                     ]}

    def run_verifier(self, content=None, probe=False):
        db = self.root / 'db.json'
        db.write_text(json.dumps(self.data), encoding='utf-8')
        result = subprocess.run(
            [BUN, 'run', str(ROOT / 'scripts/gbrain_verify.ts'), *(['--probe'] if probe else ['--stdin', 'fixture'])],
            input=json.dumps(self.expected) if content is None else content,
            text=True, encoding='utf-8', capture_output=True, timeout=15,
            env=isolated_env(self.root, PATH=os.environ.get('PATH', ''),
                             GBRAIN_DIR=str(self.root), FIXTURE_DB=str(db)))
        return result.returncode, json.loads(result.stdout)['status']

    def test_matching_body_history_metadata_and_chunks_are_verified(self):
        self.assertEqual(self.run_verifier(), (0, 'verified'))

    def test_stale_history_is_not_verified(self):
        self.data['pages'][0]['timeline'] = 'Old history'
        self.assertEqual(self.run_verifier(), (1, 'mismatch'))

    def test_missing_or_stale_chunks_are_not_verified(self):
        for corruption in ('missing', 'stale', 'unembedded'):
            with self.subTest(corruption=corruption):
                chunks = [dict(c) for c in self.data['chunks']]
                if corruption == 'missing':
                    self.data['chunks'].pop()
                elif corruption == 'stale':
                    self.data['chunks'][1]['chunk_text'] = 'Old history'
                else:
                    self.data['chunks'][1]['embedded'] = False
                self.assertEqual(self.run_verifier(), (1, 'mismatch'))
                self.data['chunks'] = chunks

    def test_source_metadata_must_agree(self):
        self.data['pages'][0]['frontmatter'] = {'id': 'rounded-wrong-id', 'category': 'tech'}
        self.assertEqual(self.run_verifier(), (1, 'mismatch'))

    def test_probe_and_failures_have_distinct_protocol_states(self):
        self.assertEqual(self.run_verifier(probe=True), (0, 'ready'))
        self.assertEqual(self.run_verifier(content='invalid json'), (3, 'invalid_card'))
        self.data['unavailable'] = True
        self.assertEqual(self.run_verifier(probe=True), (2, 'unavailable'))


if __name__ == '__main__':
    unittest.main()