"""Invariant tests for the real book source/build, no simulated external data.""" import unittest,json,hashlib,re,zipfile from pathlib import Path from build_drowned_book import prepare,D class DrownedBook(unittest.TestCase): @classmethod def setUpClass(cls): cls.raw=(D/'moby-dick-source.txt').read_text(encoding='utf-8-sig');cls.t,cls.r,cls.c,cls.a=prepare(cls.raw) def test_original_source_license_intact(self): self.assertTrue('*** START OF THE PROJECT GUTENBERG EBOOK' in self.raw);self.assertTrue('START: FULL LICENSE' in self.raw and 'THE FULL PROJECT GUTENBERG™ LICENSE' in self.raw) def test_frontmatter_removed_and_whole_narrative_preserved(self): self.assertEqual(self.t[:6],['CHAPTER','1.','Loomings.','Call','me','Ishmael.']);self.assertIn('Epilogue',self.t);self.assertNotIn('Gutenberg',self.t);self.assertEqual(len(self.c),136) def test_exact_fifty_thousand_no_replacement(self): ix=[i for i in range(len(self.t)) if self.r['fish'][i]<50000];self.assertEqual(len(ix),50000);self.assertEqual(len(set(ix)),50000) expected=' '.join(self.t[i] for i in ix)+'\n';self.assertEqual((D/'drowned-50000.txt').read_text(encoding='utf-8'),expected);self.assertEqual(len(expected.split()),50000) def test_both_ranks_are_permutations(self): for ranks in self.r.values():self.assertEqual(sorted(ranks),list(range(len(self.t)))) def test_tides_nested_and_endpoints_reversible(self): for name in self.r: sets=[{i for i,r in enumerate(self.r[name]) if r(.*?)',s,re.S).group(1));self.assertEqual(data['tokens'],self.t);self.assertEqual(data['ranks'],self.r) def test_no_runtime_network_tracking_or_external_script(self): s=(D/'instrument.template.html').read_text(encoding='utf-8');self.assertIn("connect-src 'none'",s);self.assertNotRegex(s,r']+src=|fetch\(|XMLHttpRequest|WebSocket|localStorage|sendBeacon|serviceWorker') def test_kit_unzips_and_has_rebuild_source(self): with zipfile.ZipFile(D/'drowned-book-kit.zip') as z: self.assertIsNone(z.testzip()) for n in ['DROWN-MOBY-DICK.html','build_drowned_book.py','moby-dick-source.txt','drowned-50000.txt','LICENSE.txt']:self.assertEqual(z.read(n),(D/n).read_bytes()) if __name__=='__main__': suite=unittest.defaultTestLoader.loadTestsFromTestCase(DrownedBook);result=unittest.TextTestRunner(verbosity=2).run(suite) report={'suite':'actual downloaded source/build invariants','testsRun':result.testsRun,'failures':len(result.failures),'errors':len(result.errors),'passed':result.wasSuccessful(),'publicAudienceEvidence':None} (D/'unit-test-receipt.json').write_text(json.dumps(report,indent=2),encoding='utf-8');raise SystemExit(0 if result.wasSuccessful() else 1)