87 lines
2.7 KiB
Crystal
87 lines
2.7 KiB
Crystal
# ===================
|
|
# ©AngelaMos | 2026
|
|
# bundle_spec.cr
|
|
# ===================
|
|
|
|
require "../../spec_helper"
|
|
require "compress/zip"
|
|
require "../../../src/cre/compliance/bundle"
|
|
require "../../../src/cre/audit/audit_log"
|
|
require "../../../src/cre/persistence/sqlite/sqlite_persistence"
|
|
|
|
private def fresh_persistence
|
|
persist = CRE::Persistence::Sqlite::SqlitePersistence.new(":memory:")
|
|
persist.migrate!
|
|
persist
|
|
end
|
|
|
|
describe CRE::Compliance::Bundle do
|
|
it "writes a zip with required files" do
|
|
persist = fresh_persistence
|
|
log = CRE::Audit::AuditLog.new(persist, Bytes.new(32, 0_u8), 1, 1024)
|
|
log.append("rotation.completed", "system", UUID.random, {"k" => "v"})
|
|
log.append("policy.violation", "system", UUID.random, {"r" => "stale"})
|
|
|
|
out_path = File.tempname("evidence", ".zip")
|
|
bundle = CRE::Compliance::Bundle.new(persist, "soc2")
|
|
bundle.write(out_path)
|
|
|
|
File.exists?(out_path).should be_true
|
|
|
|
names = [] of String
|
|
Compress::Zip::File.open(out_path) do |zip|
|
|
zip.entries.each { |e| names << e.filename }
|
|
end
|
|
|
|
names.should contain "audit_log.ndjson"
|
|
names.should contain "audit_batches.json"
|
|
names.should contain "control_mapping.json"
|
|
names.should contain "manifest.json"
|
|
names.should contain "README.md"
|
|
ensure
|
|
File.delete(out_path) if out_path && File.exists?(out_path)
|
|
persist.try(&.close)
|
|
end
|
|
|
|
it "manifest.json lists every file with sha256" do
|
|
persist = fresh_persistence
|
|
log = CRE::Audit::AuditLog.new(persist, Bytes.new(32, 0_u8), 1, 1024)
|
|
log.append("test", "system", nil, {"x" => "y"})
|
|
|
|
out_path = File.tempname("evidence-m", ".zip")
|
|
CRE::Compliance::Bundle.new(persist, "soc2").write(out_path)
|
|
|
|
manifest_text = ""
|
|
Compress::Zip::File.open(out_path) do |zip|
|
|
manifest_text = zip.entries.find!(&.filename.==("manifest.json")).open(&.gets_to_end)
|
|
end
|
|
|
|
parsed = JSON.parse(manifest_text)
|
|
parsed["framework"].as_s.should eq "soc2"
|
|
parsed["files"].as_a.size.should be > 0
|
|
parsed["files"].as_a.each do |f|
|
|
f["sha256"].as_s.size.should eq 64
|
|
end
|
|
ensure
|
|
File.delete(out_path) if out_path && File.exists?(out_path)
|
|
persist.try(&.close)
|
|
end
|
|
|
|
it "control_mapping.json carries the right framework controls" do
|
|
persist = fresh_persistence
|
|
out_path = File.tempname("evidence-cm", ".zip")
|
|
CRE::Compliance::Bundle.new(persist, "pci_dss").write(out_path)
|
|
|
|
cm = ""
|
|
Compress::Zip::File.open(out_path) do |zip|
|
|
cm = zip.entries.find!(&.filename.==("control_mapping.json")).open(&.gets_to_end)
|
|
end
|
|
|
|
parsed = JSON.parse(cm)
|
|
parsed["rotation.completed"].as_a.map(&.as_s).should contain "8.3.9"
|
|
ensure
|
|
File.delete(out_path) if out_path && File.exists?(out_path)
|
|
persist.try(&.close)
|
|
end
|
|
end
|