Revamp desktop usability and multiline fields

This commit is contained in:
2026-08-10 22:06:16 +02:00
parent 40b15a9713
commit aeb18b488f
12 changed files with 1283 additions and 545 deletions

View File

@@ -79,7 +79,7 @@ fn complex_documents_round_trip_with_storage_owned_metadata() -> TestResult {
document.password().expect("password").value(),
"pässwörd".as_bytes()
);
assert_eq!(document.fields().len(), 12);
assert_eq!(document.fields().len(), 11);
let kinds = document
.fields()
@@ -100,7 +100,6 @@ fn complex_documents_round_trip_with_storage_owned_metadata() -> TestResult {
EntryFieldKind::Note,
EntryFieldKind::Note,
EntryFieldKind::Field,
EntryFieldKind::Note,
]
);
assert_eq!(document.fields()[1].metadata().name(), Some("username"));
@@ -125,7 +124,10 @@ fn complex_documents_round_trip_with_storage_owned_metadata() -> TestResult {
assert!(document.fields()[5].value().is_empty());
assert_ne!(document.fields()[4].id(), document.fields()[5].id());
assert_eq!(document.fields()[10].metadata().name(), Some(""));
assert_eq!(document.fields()[10].value(), "".as_bytes());
assert_eq!(
document.fields()[10].value(),
"\r\nunrecognized line".as_bytes()
);
assert_eq!(
document.fields()[6].metadata().sensitivity(),
EntrySensitivity::Sensitive
@@ -148,6 +150,36 @@ fn complex_documents_round_trip_with_storage_owned_metadata() -> TestResult {
Ok(())
}
#[test]
fn named_multiline_fields_are_one_lossless_logical_field() -> TestResult {
let fixture = FixtureSet::load()?;
let store = fixture.materialize_store("basic")?;
let repository = Repository::open(store.path())?;
let keys = KeyStore::load(fixture.path("keys"))?;
let mut secrets = FixtureSecrets::all(&fixture);
let plaintext = b"password\ncomments: Recovery codes:\none\ntwo\nurl: https://example.test\n";
write_plaintext(&repository, &keys, "documents/multiline", plaintext)?;
let service = EntryDocumentService::new(&repository, &keys);
let mut document = service.open("documents/multiline", &mut secrets)?;
assert_eq!(document.serialize().expose(), plaintext);
assert_eq!(document.fields().len(), 3);
let comments = &document.fields()[1];
assert_eq!(comments.metadata().name(), Some("comments"));
assert_eq!(comments.value(), b"Recovery codes:\none\ntwo");
assert_eq!(
document.copy_field_value(comments.id())?.expose(),
b"Recovery codes:\none\ntwo"
);
document.replace_field_value(comments.id(), b"New heading\nalpha\nbeta".to_vec())?;
assert_eq!(
document.serialize().expose(),
b"password\ncomments: New heading\nalpha\nbeta\nurl: https://example.test\n"
);
Ok(())
}
#[test]
fn pass_otp_only_entries_keep_typed_metadata_in_the_first_line() -> TestResult {
let fixture = FixtureSet::load()?;
@@ -189,7 +221,7 @@ fn field_ids_survive_updates_removal_and_reordering() -> TestResult {
&repository,
&keys,
"documents/editable",
b"password\nusername: alice\nnote one\nnote two\n",
b"password\nusername: alice\nnote: one\nnote: two\n",
)?;
let service = EntryDocumentService::new(&repository, &keys);
let mut document = service.open("documents/editable", &mut secrets)?;
@@ -223,7 +255,7 @@ fn field_ids_survive_updates_removal_and_reordering() -> TestResult {
assert_eq!(document.fields()[2].id(), note_two_id);
assert_eq!(
document.serialize().expose(),
"password\nusername: bob\nnote two\nemail: bob@例.test\n".as_bytes()
"password\nusername: bob\nnote: two\nemail: bob@例.test\n".as_bytes()
);
let mut empty = service.open("documents/missing", &mut secrets)?;