Cybersecurity-Projects/PROJECTS/intermediate/credential-rotation-enforcer/spec/unit/compliance/bundle_spec.cr

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