"""The pending list must survive stdout piping and must not rewrite snapshots."""
import hashlib
import json
from pathlib import Path
import subprocess
import unittest

HERE = Path(__file__).resolve().parent


class PendingOutputTest(unittest.TestCase):
    def run_pending(self, *args):
        files = [HERE / 'SNAPSHOT.md', HERE / 'summary.json']
        before = [hashlib.sha256(p.read_bytes()).hexdigest() for p in files]
        raw = subprocess.check_output(['node', str(HERE / 'build_progress_snapshot.mjs'), '--pending', *args])
        self.assertTrue(raw.endswith(b'\n'))
        rows = json.loads(raw)
        self.assertIsInstance(rows, list)
        self.assertTrue(all(row['category'] == 'not_tested' for row in rows))
        self.assertEqual(before, [hashlib.sha256(p.read_bytes()).hexdigest() for p in files])
        return rows

    def test_full_piped_output_equals_each_repository_filter(self):
        all_rows = self.run_pending()
        for repo in ('store', 'ai_api', 'unreviewed'):
            self.assertEqual([r for r in all_rows if r['repo'] == repo], self.run_pending(repo))

    def test_invalid_repository_is_rejected(self):
        result = subprocess.run(['node', str(HERE / 'build_progress_snapshot.mjs'), '--pending', 'invalid'], capture_output=True)
        self.assertNotEqual(0, result.returncode)
        self.assertEqual(b'', result.stdout)


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