use pdfluent::prelude::*;
const SAMPLE: &str = "tests/fixtures/sample.pdf";
fn enterprise_doc(path: &str) -> PdfDocument {
PdfDocument::open_with(
path,
pdfluent::OpenOptions::new().with_license_key("tier:enterprise"),
)
.expect("open")
}
fn enterprise_from_bytes(bytes: &[u8]) -> PdfDocument {
PdfDocument::from_bytes_with(
bytes,
pdfluent::OpenOptions::new().with_license_key("tier:enterprise"),
)
.expect("reparse")
}
#[test]
fn encrypt_with_aes256_completes_and_serialises() {
let mut doc = enterprise_doc(SAMPLE);
doc.encrypt(
EncryptOptions::aes256()
.with_user_password("user-pw")
.with_owner_password("owner-pw"),
)
.expect("encrypt");
let bytes = doc.to_bytes().expect("to_bytes after encrypt");
assert!(
bytes.starts_with(b"%PDF-"),
"serialised output retains %PDF- header",
);
let lopdf_doc = lopdf::Document::load_mem(&bytes).expect("lopdf parse");
assert!(
pdf_manip::encrypt::is_encrypted(&lopdf_doc),
"output is marked as encrypted by pdf_manip::is_encrypted",
);
}
#[test]
fn encrypt_output_refuses_reparse_without_password() {
let mut doc = enterprise_doc(SAMPLE);
doc.encrypt(
EncryptOptions::aes256()
.with_user_password("secret")
.with_owner_password("secret"),
)
.expect("encrypt");
let bytes = doc.to_bytes().expect("to_bytes");
let reloaded_lopdf = lopdf::Document::load_mem(&bytes).expect("lopdf parse");
assert!(pdf_manip::encrypt::is_encrypted(&reloaded_lopdf));
}
#[test]
fn encrypt_honours_print_only_preset() {
let mut doc = enterprise_doc(SAMPLE);
doc.encrypt(
EncryptOptions::aes256()
.with_user_password("u")
.with_owner_password("o")
.with_permissions(Permissions::print_only()),
)
.expect("encrypt print_only");
}
#[test]
fn signatures_empty_on_unsigned_doc() {
let doc = enterprise_doc(SAMPLE);
let sigs = doc.signatures().expect("signatures");
assert!(sigs.is_empty(), "sample.pdf has no signatures");
}
#[test]
fn verify_signatures_all_valid_on_unsigned_doc_vacuous_true() {
let doc = enterprise_doc(SAMPLE);
let report = doc.verify_signatures().expect("verify");
assert!(!report.is_signed(), "sample.pdf is not signed");
assert!(report.all_valid(), "vacuous-true on empty");
}
#[test]
fn sign_with_missing_pfx_file_fails_clean() {
let result = Pkcs12Signer::from_pfx_file("/nonexistent/pdfluent-test.p12", "pw");
let err = result.expect_err("missing PFX file must error");
assert!(
matches!(
err,
pdfluent::Error::FileNotFound { .. }
| pdfluent::Error::Io { .. }
| pdfluent::Error::InvalidSignature { .. }
),
"expected a clean error for missing PFX file, got {err:?}",
);
}
#[test]
fn redact_text_removes_matches() {
let mut doc = enterprise_doc(SAMPLE);
doc.redact("fixture", RedactOptions::new())
.expect("redact text");
let bytes = doc.to_bytes().expect("to_bytes after redact");
let _reloaded = enterprise_from_bytes(&bytes);
}
#[test]
fn redact_text_honours_on_pages_scope() {
let mut doc = enterprise_doc(SAMPLE);
doc.redact("fixture", RedactOptions::new().on_pages(&[1]))
.expect("redact on page 1");
}
#[test]
fn redact_region_marks_and_applies() {
let mut doc = enterprise_doc(SAMPLE);
doc.redact_region(1, [50.0, 700.0, 400.0, 740.0])
.expect("redact_region");
let bytes = doc.to_bytes().expect("to_bytes");
let _reloaded = enterprise_from_bytes(&bytes);
}
#[test]
fn redact_region_invalid_page_errors() {
let mut doc = enterprise_doc(SAMPLE);
let err = doc.redact_region(99, [0.0, 0.0, 100.0, 100.0]).unwrap_err();
assert!(matches!(err, pdfluent::Error::InvalidPdf { .. }));
}
#[test]
fn decrypt_with_wrong_password_returns_decryption_failed() {
let mut doc = enterprise_doc(SAMPLE);
doc.encrypt(
EncryptOptions::aes256()
.with_user_password("right-password")
.with_owner_password("right-password"),
)
.expect("encrypt");
let bytes = doc.to_bytes().expect("to_bytes");
let lopdf_doc = lopdf::Document::load_mem(&bytes).expect("lopdf parse");
let _ = lopdf_doc; }