#[test]
fn license_info_defaults_to_trial_without_key() {
let info = pdfluent::license_info();
assert!(info.capabilities.contains(pdfluent::Capability::PdfParse));
if info.tier == pdfluent::Tier::Trial {
assert!(info.output_is_marked);
} else {
assert!(!info.output_is_marked);
}
}
#[test]
fn tier_trial_grants_minimum_surface_only() {
use pdfluent::Capability as C;
let caps = pdfluent::Tier::Trial.capabilities();
for cap in [
C::PdfParse,
C::PdfWrite,
C::PageOps,
C::TextExtract,
C::AcroFormRead,
C::PdfaValidate,
] {
assert!(caps.contains(cap), "Trial must grant {cap:?}");
}
for cap in [
C::RenderRaster,
C::DigitalSignatureSign,
C::Redaction,
C::OcrTesseract,
C::Html2Pdf,
C::AirGapped,
C::OemRedistribution,
] {
assert!(!caps.contains(cap), "Trial must not grant {cap:?}");
}
}
#[test]
fn tier_developer_excludes_signing_but_includes_core() {
use pdfluent::Capability as C;
let caps = pdfluent::Tier::Developer.capabilities();
assert!(caps.contains(C::PdfParse));
assert!(caps.contains(C::PdfWrite));
assert!(caps.contains(C::TextExtract));
assert!(caps.contains(C::EncryptionRead));
assert!(!caps.contains(C::EncryptionWrite));
assert!(!caps.contains(C::DigitalSignatureSign));
assert!(!caps.contains(C::OcrTesseract));
}
#[test]
fn tier_team_includes_signing_and_pdfa() {
use pdfluent::Capability as C;
let caps = pdfluent::Tier::Team.capabilities();
assert!(caps.contains(C::DigitalSignatureSign));
assert!(caps.contains(C::DigitalSignatureVerify));
assert!(caps.contains(C::PdfaValidate));
assert!(caps.contains(C::Redaction));
assert!(!caps.contains(C::OcrTesseract));
}
#[test]
fn tier_enterprise_includes_everything() {
use pdfluent::Capability as C;
let caps = pdfluent::Tier::Enterprise.capabilities();
for cap in [
C::PdfParse,
C::DigitalSignatureSign,
C::OcrTesseract,
C::Html2Pdf,
C::AirGapped,
C::OemRedistribution,
] {
assert!(caps.contains(cap), "Enterprise must grant {cap:?}");
}
}
#[test]
fn license_key_invalid_format_returns_invalid_license() {
let err = pdfluent::set_license_key("not-a-valid-format").unwrap_err();
assert!(
matches!(err, pdfluent::Error::InvalidLicense { .. }),
"expected InvalidLicense, got {err:?}",
);
}
#[test]
fn license_key_unknown_tier_returns_invalid_license() {
let err = pdfluent::set_license_key("tier:platinum").unwrap_err();
assert!(matches!(err, pdfluent::Error::InvalidLicense { .. }));
}
#[test]
fn error_feature_not_in_tier_has_structured_fields() {
let err = pdfluent::Error::FeatureNotInTier {
capability: pdfluent::Capability::AirGapped,
current_tier: pdfluent::Tier::Developer,
required_tier: pdfluent::Tier::Enterprise,
};
let rendered = format!("{err}");
assert!(
rendered.contains("AirGapped"),
"capability in Display: {rendered}",
);
assert!(
rendered.contains("Developer"),
"current_tier in Display: {rendered}",
);
assert!(
rendered.contains("Enterprise"),
"required_tier in Display: {rendered}",
);
assert!(
rendered.contains("pricing") || rendered.contains("Upgrade"),
"upgrade hint in Display: {rendered}",
);
assert_eq!(err.code(), "E-LICENSE-FEATURE-NOT-IN-TIER");
}