Skip to content

Commit e412324

Browse files
dbus: Add various tests to collection/item
1 parent ad39061 commit e412324

2 files changed

Lines changed: 187 additions & 0 deletions

File tree

client/src/dbus/collection.rs

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -306,4 +306,50 @@ mod tests {
306306
let service = Service::encrypted().await.unwrap();
307307
create_item(service, true).await;
308308
}
309+
310+
#[tokio::test]
311+
async fn test_attribute_search_patterns() {
312+
let service = Service::plain().await.unwrap();
313+
let collection = service.default_collection().await.unwrap();
314+
315+
let secret = crate::Secret::text("search test");
316+
317+
// Create items with different attributes
318+
let attrs1 = HashMap::from([("service", "email"), ("username", "user1")]);
319+
let item1 = collection
320+
.create_item("Email 1", &attrs1, secret.clone(), true, None)
321+
.await
322+
.unwrap();
323+
324+
let attrs2 = HashMap::from([("service", "email"), ("username", "user2")]);
325+
let item2 = collection
326+
.create_item("Email 2", &attrs2, secret.clone(), true, None)
327+
.await
328+
.unwrap();
329+
330+
let attrs3 = HashMap::from([("service", "web"), ("username", "user1")]);
331+
let item3 = collection
332+
.create_item("Web", &attrs3, secret.clone(), true, None)
333+
.await
334+
.unwrap();
335+
336+
// Search by service
337+
let search_email = HashMap::from([("service", "email")]);
338+
let email_items = collection.search_items(&search_email).await.unwrap();
339+
assert!(email_items.len() >= 2);
340+
341+
// Search by username
342+
let search_user1 = HashMap::from([("username", "user1")]);
343+
let user1_items = collection.search_items(&search_user1).await.unwrap();
344+
assert!(user1_items.len() >= 2);
345+
346+
// Search by both attributes
347+
let search_specific = HashMap::from([("service", "email"), ("username", "user1")]);
348+
let specific_items = collection.search_items(&search_specific).await.unwrap();
349+
assert!(specific_items.len() >= 1);
350+
351+
item1.delete(None).await.unwrap();
352+
item2.delete(None).await.unwrap();
353+
item3.delete(None).await.unwrap();
354+
}
309355
}

client/src/dbus/item.rs

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -191,3 +191,144 @@ impl<'a> Item<'a> {
191191
self.inner.inner().path()
192192
}
193193
}
194+
195+
#[cfg(test)]
196+
#[cfg(feature = "tokio")]
197+
mod tests {
198+
use std::collections::HashMap;
199+
200+
use crate::dbus::Service;
201+
202+
#[tokio::test]
203+
async fn test_item_label_mutation() {
204+
let service = Service::plain().await.unwrap();
205+
let collection = service.default_collection().await.unwrap();
206+
207+
let attributes = HashMap::from([("test", "label-mutation")]);
208+
let secret = crate::Secret::text("test secret");
209+
210+
let item = collection
211+
.create_item("Original Label", &attributes, secret, true, None)
212+
.await
213+
.unwrap();
214+
215+
let initial_label = item.label().await.unwrap();
216+
assert_eq!(initial_label, "Original Label");
217+
218+
item.set_label("Updated Label").await.unwrap();
219+
220+
let updated_label = item.label().await.unwrap();
221+
assert_eq!(updated_label, "Updated Label");
222+
223+
item.delete(None).await.unwrap();
224+
}
225+
226+
#[tokio::test]
227+
async fn test_item_secret_mutation() {
228+
let service = Service::plain().await.unwrap();
229+
let collection = service.default_collection().await.unwrap();
230+
231+
let attributes = HashMap::from([("test", "secret-mutation")]);
232+
let original_secret = crate::Secret::text("original secret");
233+
234+
let item = collection
235+
.create_item(
236+
"Secret Test",
237+
&attributes,
238+
original_secret.clone(),
239+
true,
240+
None,
241+
)
242+
.await
243+
.unwrap();
244+
245+
assert_eq!(item.secret().await.unwrap(), original_secret);
246+
247+
let new_secret = crate::Secret::text("updated secret");
248+
item.set_secret(new_secret.clone()).await.unwrap();
249+
250+
assert_eq!(item.secret().await.unwrap(), new_secret);
251+
252+
item.delete(None).await.unwrap();
253+
}
254+
255+
#[tokio::test]
256+
async fn test_text_secret_type() {
257+
let service = Service::plain().await.unwrap();
258+
let collection = service.default_collection().await.unwrap();
259+
260+
let text_attributes = HashMap::from([("type", "text-secret")]);
261+
let text_secret = crate::Secret::text("text password");
262+
let text_item = collection
263+
.create_item(
264+
"Text Secret",
265+
&text_attributes,
266+
text_secret.clone(),
267+
true,
268+
None,
269+
)
270+
.await
271+
.unwrap();
272+
273+
assert_eq!(text_item.secret().await.unwrap(), text_secret);
274+
text_item.delete(None).await.unwrap();
275+
}
276+
277+
#[tokio::test]
278+
async fn test_blob_secret_type() {
279+
let service = Service::plain().await.unwrap();
280+
let collection = service.default_collection().await.unwrap();
281+
282+
let blob_attributes = HashMap::from([("type", "blob-secret")]);
283+
let blob_secret = crate::Secret::blob(b"binary data");
284+
let blob_item = collection
285+
.create_item(
286+
"Blob Secret",
287+
&blob_attributes,
288+
blob_secret.clone(),
289+
true,
290+
None,
291+
)
292+
.await
293+
.unwrap();
294+
295+
let retrieved_secret = blob_item.secret().await.unwrap();
296+
297+
// TODO: gnome-keyring doesn't preserve content types - everything becomes
298+
// text/plain But the actual secret data should be preserved
299+
assert_eq!(retrieved_secret.as_bytes(), blob_secret.as_bytes());
300+
blob_item.delete(None).await.unwrap();
301+
}
302+
303+
#[tokio::test]
304+
async fn test_item_timestamps() {
305+
let service = Service::plain().await.unwrap();
306+
let collection = service.default_collection().await.unwrap();
307+
308+
let attributes = HashMap::from([("test", "timestamps")]);
309+
let secret = crate::Secret::text("timestamp test");
310+
311+
let item = collection
312+
.create_item("Timestamp Test", &attributes, secret, true, None)
313+
.await
314+
.unwrap();
315+
316+
let created = item.created().await.unwrap();
317+
let modified = item.modified().await.unwrap();
318+
319+
eprintln!("Created: {:?}, Modified: {:?}", created, modified);
320+
assert_eq!(created, modified);
321+
322+
tokio::time::sleep(std::time::Duration::from_secs(1)).await;
323+
item.set_label("Updated Label").await.unwrap();
324+
325+
// Allow time for D-Bus changes to propagate
326+
tokio::time::sleep(std::time::Duration::from_millis(100)).await;
327+
328+
let new_modified = item.modified().await.unwrap();
329+
assert!(new_modified > modified);
330+
assert_eq!(item.created().await.unwrap(), created);
331+
332+
item.delete(None).await.unwrap();
333+
}
334+
}

0 commit comments

Comments
 (0)