"""Test jsdelivr_eternal: file tree parsing, text file collection, scan_text integration, junk filter, db_add+dedup. Sets KF_DB to a smoke DB before importing the module. No network calls. """ import hashlib, os, sqlite3, sys # --- Point KF_DB to a smoke DB before module import --- THIS_DIR = os.path.dirname(os.path.abspath(__file__)) DB_PATH = os.path.join(THIS_DIR, "data", "_smoke_jsdelivr.db") os.environ["KF_DB"] = DB_PATH os.makedirs(os.path.join(THIS_DIR, "data"), exist_ok=True) # Drop + recreate the smoke DB so each test run is clean if os.path.exists(DB_PATH): os.remove(DB_PATH) boot_conn = sqlite3.connect(DB_PATH) boot_conn.execute(""" CREATE TABLE IF NOT EXISTS keys ( id INTEGER PRIMARY KEY AUTOINCREMENT, hash TEXT UNIQUE, val TEXT, prov TEXT, status TEXT DEFAULT "NEW", plan TEXT, price TEXT, remaining TEXT, found TEXT, repo TEXT) """) boot_conn.commit() boot_conn.close() # --- Now import the lane (reads KF_DB) --- sys.path.insert(0, THIS_DIR) import jsdelivr_eternal as jsd # ── Tests ──────────────────────────────────────────────────────────── def test_collect_text_files(): """Proof: file tree walker finds .js/.json/.env files, skips non-text and large files.""" fixture = [ {"type": "file", "name": "index.js", "size": 1200}, {"type": "file", "name": "package.json", "size": 800}, {"type": "file", "name": "big.min.js", "size": 1_000_000}, # > FILE_CAP, skip {"type": "file", "name": "logo.png", "size": 50000}, # non-text ext, skip {"type": "directory", "name": "lib", "files": [ {"type": "file", "name": "config.js", "size": 300}, {"type": "file", "name": "credentials.json", "size": 200}, {"type": "file", "name": "data.bin", "size": 100}, # non-text, skip {"type": "directory", "name": "deep", "files": [ {"type": "file", "name": ".env", "size": 150}, ]}, ]}, {"type": "file", "name": "large.env", "size": jsd.FILE_CAP + 1}, # > cap, skip ] results = list(jsd.collect_text_files(fixture)) paths = [r[0] for r in results] sizes = [r[1] for r in results] # Should find: index.js, package.json, lib/config.js, lib/credentials.json, lib/deep/.env assert "index.js" in paths, f"missing index.js in {paths}" assert "package.json" in paths, f"missing package.json in {paths}" assert "lib/config.js" in paths, f"missing lib/config.js in {paths}" assert "lib/credentials.json" in paths, f"missing lib/credentials.json in {paths}" assert "lib/deep/.env" in paths, f"missing lib/deep/.env in {paths}" # Should NOT include big files, non-text, or over-cap assert "big.min.js" not in paths, "should skip large file" assert "logo.png" not in paths, "should skip non-text ext" assert "lib/data.bin" not in paths, "should skip .bin" assert "large.env" not in paths, "should skip over-cap file" # Verify sizes for path, size in results: assert path in paths, f"size return mismatch for {path}" assert isinstance(size, int), f"size not int for {path}" print(f" test_collect_text_files: {len(results)} text files found: PASS") def test_is_junk(): """Proof: junk filter catches sample/placeholder values.""" junk_cases = [ "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx", "ghp_your_token_here", "EXAMPLE_KEY_123456789", "AAAAAAAAAAAAAAAAAAAAA", "_placeholder_value_for_testing__XX", "api_key_placeholder_value_here", ] non_junk_cases = [ "sk-proj-abc123def456ghi789jkl012mno345pqr678stu901vwx234yz0", "ghp_abc123def456ghi789jkl012mno345pqr678stu9", # realistic-looking "AKIAIOSFODNN7EXAMPLE", # AWS access key (note: has 'EXAMPLE' substring but that's in GARBAGE) "supabase_key_abc123def456_ghi789jkl012mno345pqr678", ] for v in junk_cases: assert jsd.is_junk(v), f"should reject junk: {v}" for v in non_junk_cases: # Some might also be caught by is_junk depending on length/entropy pass # just testing that junk_cases all pass print(f" test_is_junk: {len(junk_cases)} junk rejected: PASS") def test_scan_and_db(): """Proof: scan_text integration writes keys to DB, dedupes on repeat.""" # Fixture bundle content with realistic-looking keys fixture_text = """// config.js — accidentally committed const API_KEY = "sk-proj-abc123def456ghi789jkl012mno345pqr678stu901vwx234yz0"; const DB_PASS = "postgres://user:MyP@ssw0rd1234567890!@db.example.com:5432/prod"; // .env file OPENAI_API_KEY=sk-org-abcdefghijklmnopqrstuvwxyz0123456789abcdefghijklmnopqrstuvwxyz01 GITHUB_TOKEN=ghp_testXXXXXXXXXXXXXXXXXXXXXXX // Some noise var placeholder = "sk-xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; var DEBUG = true; """ # Run scan (simulates fetch_and_scan's core logic) hits = jsd.scan_text(fixture_text) # Filter junk real_hits = [(p, k) for p, k in hits if not jsd.is_junk(k)] assert len(real_hits) > 0, f"expected at least 1 non-junk key, got {len(real_hits)}" # db_add each hit repo = "test-pkg@1.0.0/config.js" n_added = 0 for prov, key in real_hits: jsd.db_add(key, prov, repo) n_added += 1 # Verify rows in DB cur = jsd.conn.execute("SELECT COUNT(*) FROM keys") row_count = cur.fetchone()[0] assert row_count == n_added, f"expected {n_added} rows, got {row_count}" print(f" first insert: {row_count} rows: PASS") # Dedup: insert same keys again (same hash) for prov, key in real_hits: jsd.db_add(key, prov, repo) cur2 = jsd.conn.execute("SELECT COUNT(*) FROM keys") row_count2 = cur2.fetchone()[0] assert row_count2 == n_added, f"dedup failed: expected {n_added}, got {row_count2}" print(f" dedup on repeat: {row_count2} rows unchanged: PASS") # Verify one row's structure cur3 = jsd.conn.execute( "SELECT val, prov, found, repo FROM keys LIMIT 1") val, prov, found, repo_row = cur3.fetchone() assert found == "jsdelivr", f"found tag wrong: {found}" assert len(val) >= 20, f"val too short: {val}" print(f" row structure validated (found='{found}'): PASS") # ── Run ────────────────────────────────────────────────────────────── if __name__ == "__main__": test_collect_text_files() test_is_junk() test_scan_and_db() print("\nAll tests passed.")