defmodule VavPipeline.MesorahTest do @moduledoc """ The second scroll (bishe'arecha §IV): pinned, hashed, read-only; its citations coupled like verses. """ use ExUnit.Case, async: false import Plug.Test alias VavPipeline.{Bedikah, Mesorah} alias VavPipeline.BigdeiKodesh.Router @opts Router.init([]) test "the tree on disk hashes to the builder's integrity.sha256 and to the pin" do root = Mesorah.root() assert File.dir?(root), "mesorah snapshot not built at #{root}" {:ok, hash} = Mesorah.compute_tree_hash(root) assert hash == File.read!(Path.join(root, "integrity.sha256")) |> String.trim() assert hash == Mesorah.expected_hash() assert :ok = Mesorah.verify_integrity() end test "the index names every work with its version, licence and hash; every licence is open" do index = Mesorah.index() assert map_size(index["works"]) >= 100 for {_slug, w} <- index["works"], {_lang, v} <- w["versions"] do assert v["license"] in ["Public Domain", "PD", "CC0", "CC-BY", "CC-BY-SA"], w["title"] assert String.length(v["sha256"]) == 64 end assert index["works"]["rashi_on_devarim"]["schema"]["sectionNames"] == ["Chapter", "Verse", "Comment"] end test "a changed byte is a different scroll" do temp = Path.join(System.tmp_dir!(), "mesorah_test_#{System.unique_integer([:positive])}") File.mkdir_p!(Path.join(temp, "works/x")) File.write!(Path.join(temp, "works/x/he.json"), "{\"text\":[\"a\"]}") File.write!(Path.join(temp, "index.json"), "{}") {:ok, h1} = Mesorah.compute_tree_hash(temp) File.write!(Path.join(temp, "works/x/he.json"), "{\"text\":[\"b\"]}") {:ok, h2} = Mesorah.compute_tree_hash(temp) refute h1 == h2 File.rm_rf!(temp) assert {:error, _} = Mesorah.compute_tree_hash(temp) end test "a citation the scroll has couples to the passage; one it lacks couples to nothing" do examination = %{ "claims" => [], "references" => [], "roots" => [], "hebrew" => [], "mesorah_references" => [ %{"as_written" => "Rashi on Devarim 6:5", "ref" => "rashi_on_devarim_6_5", "work" => "rashi_on_devarim", "address" => [6, 5], "found" => true, "languages" => ["en", "he"]}, %{"as_written" => "Rashi on Devarim 99:1", "ref" => "rashi_on_devarim_99_1", "work" => "rashi_on_devarim", "address" => [99, 1], "found" => false, "languages" => []} ] } trace = Bedikah.coupling_trace(examination) assert "coupled(reference(rashi_on_devarim_6_5), mesorah(rashi_on_devarim, [6,5]))" in trace assert "coupled(reference(rashi_on_devarim_99_1), not_in_mesorah)" in trace end test "readiness carries the scroll's check" do conn = conn(:get, "/kodesh/health") |> Router.call(@opts) body = Jason.decode!(conn.resp_body) assert body["checks"]["mesorah_hash"] in ["pass", "fail"] assert body["checks"]["mesorah_hash"] == "pass" end end