use nostr::{Event, EventBuilder, Keys, Kind, PublicKey, RelayUrl};
use nrc_mls_storage::NostrMlsStorageProvider;
use openmls::group::GroupId;
use crate::groups::NostrGroupConfigData;
use crate::NostrMls;
pub fn create_test_group_members() -> (Keys, Vec<Keys>, Vec<PublicKey>) {
let creator = Keys::generate();
let member1 = Keys::generate();
let member2 = Keys::generate();
let creator_pk = creator.public_key();
let members = vec![member1, member2];
let admins = vec![creator_pk, members[0].public_key()];
(creator, members, admins)
}
pub fn create_key_package_event<Storage>(nostr_mls: &NostrMls<Storage>, member_keys: &Keys) -> Event
where
Storage: NostrMlsStorageProvider,
{
let relays = vec![RelayUrl::parse("wss://test.relay").unwrap()];
let (key_package_hex, tags) = nostr_mls
.create_key_package_for_event(&member_keys.public_key(), relays)
.expect("Failed to create key package");
EventBuilder::new(Kind::MlsKeyPackage, key_package_hex)
.tags(tags.to_vec())
.sign_with_keys(member_keys)
.expect("Failed to sign event")
}
pub fn create_key_package_event_with_key<Storage>(
nostr_mls: &NostrMls<Storage>,
pubkey: &PublicKey,
signing_keys: &Keys,
) -> Event
where
Storage: NostrMlsStorageProvider,
{
let relays = vec![RelayUrl::parse("wss://test.relay").unwrap()];
let (key_package_hex, tags) = nostr_mls
.create_key_package_for_event(pubkey, relays)
.expect("Failed to create key package");
EventBuilder::new(Kind::MlsKeyPackage, key_package_hex)
.tags(tags.to_vec())
.sign_with_keys(signing_keys)
.expect("Failed to sign event")
}
pub fn create_nostr_group_config_data(admins: Vec<PublicKey>) -> NostrGroupConfigData {
let relays = vec![RelayUrl::parse("wss://test.relay").unwrap()];
let image_url = "https://example.com/test.png".to_string();
let image_key = nostr::SecretKey::generate().as_secret_bytes().to_owned();
let image_nonce = [3u8; 12].to_vec();
let name = "Test Group".to_owned();
let description = "A test group for basic testing".to_owned();
NostrGroupConfigData::new(
name,
description,
Some(image_url),
Some(image_key),
Some(image_nonce),
relays,
admins,
)
}
pub fn create_test_group<Storage>(
nostr_mls: &NostrMls<Storage>,
creator: &Keys,
members: &[Keys],
admins: &[PublicKey],
) -> GroupId
where
Storage: NostrMlsStorageProvider,
{
let creator_pk = creator.public_key();
let mut initial_key_package_events = Vec::new();
for member_keys in members {
let key_package_event = create_key_package_event(nostr_mls, member_keys);
initial_key_package_events.push(key_package_event);
}
let create_result = nostr_mls
.create_group(
&creator_pk,
initial_key_package_events,
create_nostr_group_config_data(admins.to_vec()),
)
.expect("Failed to create group");
let group_id = create_result.group.mls_group_id.clone();
nostr_mls
.merge_pending_commit(&group_id)
.expect("Failed to merge pending commit");
group_id
}
pub fn create_test_rumor(sender_keys: &Keys, content: &str) -> nostr::UnsignedEvent {
EventBuilder::new(Kind::TextNote, content).build(sender_keys.public_key())
}