@@ -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