post_profile.rs (2827B)
1 #[path = "../src/test_fixtures.rs"] 2 mod test_fixtures; 3 4 use nostr::{Keys as RadrootsNostrKeys, SecretKey as RadrootsNostrSecretKey}; 5 use radroots_blossom::{BlobDescriptor, BlobUrl, MediaType, Sha256}; 6 use radroots_event::{ 7 media::AuthoredImage, 8 post::{ 9 AuthoredAsk, AuthoredPhotoUpdate, AuthoredPostImage, AuthoredUpdate, PostImageDimensions, 10 }, 11 }; 12 use radroots_nostr::event::{ 13 Timestamp as RadrootsNostrTimestamp, build_ask as build_ask_event, 14 build_photo_update as build_photo_update_event, build_update as build_update_event, 15 }; 16 17 #[test] 18 fn typed_post_builders_preserve_strict_wire_profiles() { 19 let keys = RadrootsNostrKeys::new( 20 RadrootsNostrSecretKey::from_hex(test_fixtures::FIXTURE_ALICE_SECRET_KEY_HEX).unwrap(), 21 ); 22 let created_at = RadrootsNostrTimestamp::from_secs(1_784_347_200); 23 let update = AuthoredUpdate::new("Farm update").unwrap(); 24 let event = build_update_event(&update) 25 .unwrap() 26 .custom_created_at(created_at) 27 .sign_with_keys(&keys) 28 .unwrap(); 29 assert_eq!(event.kind.as_u16(), 1); 30 assert!(event.tags.is_empty()); 31 assert_eq!(event.created_at, created_at); 32 assert!(event.verify().is_ok()); 33 34 let image = authored_image(); 35 let photo = 36 AuthoredPhotoUpdate::new(format!("Harvest {}", image.url()), vec![image.clone()]).unwrap(); 37 let event = build_photo_update_event(&photo) 38 .unwrap() 39 .custom_created_at(created_at) 40 .sign_with_keys(&keys) 41 .unwrap(); 42 assert_eq!(event.tags.len(), 1); 43 assert_eq!(event.tags.iter().next().unwrap().as_slice()[0], "imeta"); 44 assert!(event.verify().is_ok()); 45 46 let ask = AuthoredAsk::new(format!("Is this ready? {}", image.url()), vec![image]).unwrap(); 47 let event = build_ask_event(&ask) 48 .unwrap() 49 .custom_created_at(created_at) 50 .sign_with_keys(&keys) 51 .unwrap(); 52 assert_eq!(event.tags.len(), 2); 53 let tags = event.tags.iter().collect::<Vec<_>>(); 54 assert_eq!(tags[0].as_slice(), ["t", "radroots-ask"]); 55 assert_eq!(tags[1].as_slice()[0], "imeta"); 56 assert!(event.verify().is_ok()); 57 } 58 59 fn authored_image() -> AuthoredPostImage { 60 let bytes = b"strawberries"; 61 let hash = Sha256::digest(bytes); 62 let media_type = MediaType::parse("image/webp").unwrap(); 63 let descriptor = BlobDescriptor::new( 64 BlobUrl::parse(&format!("https://media.example/{hash}.webp")).unwrap(), 65 hash, 66 bytes.len() as u64, 67 media_type.clone(), 68 1_784_347_200, 69 ) 70 .unwrap() 71 .approve_reference() 72 .unwrap() 73 .verify_bytes(bytes, &media_type) 74 .unwrap(); 75 AuthoredPostImage::new( 76 AuthoredImage::try_from(descriptor).unwrap(), 77 PostImageDimensions::new(1200, 900).unwrap(), 78 "Harvest", 79 ) 80 .unwrap() 81 }