Cybersecurity-Projects/PROJECTS/intermediate/credential-rotation-enforcer/spec/unit/domain/credential_spec.cr

82 lines
2.2 KiB
Crystal

# ===================
# ©AngelaMos | 2026
# credential_spec.cr
# ===================
require "../../spec_helper"
require "../../../src/cre/domain/credential"
describe CRE::Domain::Credential do
it "constructs with required fields" do
c = CRE::Domain::Credential.new(
id: UUID.random,
external_id: "arn:aws:secretsmanager:us-east-1:1:secret:db-prod",
kind: CRE::Domain::CredentialKind::AwsSecretsmgr,
name: "db-prod",
tags: {"env" => "prod"} of String => String,
)
c.kind.aws_secretsmgr?.should be_true
c.tag(:env).should eq "prod"
end
it "returns nil for missing tag" do
c = CRE::Domain::Credential.new(
id: UUID.random,
external_id: "x",
kind: CRE::Domain::CredentialKind::EnvFile,
name: "n",
tags: {} of String => String,
)
c.tag(:env).should be_nil
end
it "supports kind predicates" do
c = CRE::Domain::Credential.new(
id: UUID.random,
external_id: "x",
kind: CRE::Domain::CredentialKind::GithubPat,
name: "n",
tags: {} of String => String,
)
c.kind.github_pat?.should be_true
c.kind.env_file?.should be_false
end
it "tag() accepts both string and symbol keys" do
c = CRE::Domain::Credential.new(
id: UUID.random, external_id: "x",
kind: CRE::Domain::CredentialKind::EnvFile,
name: "n", tags: {"foo" => "bar"} of String => String,
)
c.tag("foo").should eq "bar"
c.tag(:foo).should eq "bar"
end
it "rotation_anchor falls back to created_at when never rotated" do
created = Time.utc - 3.days
c = CRE::Domain::Credential.new(
id: UUID.random,
external_id: "x",
kind: CRE::Domain::CredentialKind::EnvFile,
name: "n",
tags: {} of String => String,
created_at: created,
)
c.rotation_anchor.should eq created
end
it "rotation_anchor uses last_rotated_at once set" do
rotated = Time.utc - 1.hour
c = CRE::Domain::Credential.new(
id: UUID.random,
external_id: "x",
kind: CRE::Domain::CredentialKind::EnvFile,
name: "n",
tags: {} of String => String,
created_at: Time.utc - 30.days,
last_rotated_at: rotated,
)
c.rotation_anchor.should eq rotated
end
end