upleb.uk

Public git repos — served from a NIP-34 GRASP relay at git.upleb.uk

summaryrefslogtreecommitdiff
path: root/test_utils/src
diff options
context:
space:
mode:
Diffstat (limited to 'test_utils/src')
-rw-r--r--test_utils/src/git.rs12
-rw-r--r--test_utils/src/lib.rs54
-rw-r--r--test_utils/src/relay.rs27
3 files changed, 53 insertions, 40 deletions
diff --git a/test_utils/src/git.rs b/test_utils/src/git.rs
index 474fc59..5942a54 100644
--- a/test_utils/src/git.rs
+++ b/test_utils/src/git.rs
@@ -9,7 +9,7 @@ use std::{
9 9
10use anyhow::{Context, Result}; 10use anyhow::{Context, Result};
11use git2::{Branch, Oid, RepositoryInitOptions, Signature, Time}; 11use git2::{Branch, Oid, RepositoryInitOptions, Signature, Time};
12use nostr::nips::nip01::Coordinate; 12use nostr::nips::{nip01::Coordinate, nip19::Nip19Coordinate};
13use nostr_sdk::{Kind, RelayUrl, ToBech32}; 13use nostr_sdk::{Kind, RelayUrl, ToBech32};
14 14
15use crate::generate_repo_ref_event; 15use crate::generate_repo_ref_event;
@@ -23,10 +23,12 @@ pub struct GitTestRepo {
23impl Default for GitTestRepo { 23impl Default for GitTestRepo {
24 fn default() -> Self { 24 fn default() -> Self {
25 let repo_event = generate_repo_ref_event(); 25 let repo_event = generate_repo_ref_event();
26 let coordinate = Coordinate { 26 let coordinate = Nip19Coordinate {
27 kind: Kind::GitRepoAnnouncement, 27 coordinate: Coordinate {
28 public_key: repo_event.pubkey, 28 kind: Kind::GitRepoAnnouncement,
29 identifier: repo_event.tags.identifier().unwrap().to_string(), 29 public_key: repo_event.pubkey,
30 identifier: repo_event.tags.identifier().unwrap().to_string(),
31 },
30 relays: vec![ 32 relays: vec![
31 RelayUrl::parse("ws://localhost:8055").unwrap(), 33 RelayUrl::parse("ws://localhost:8055").unwrap(),
32 RelayUrl::parse("ws://localhost:8056").unwrap(), 34 RelayUrl::parse("ws://localhost:8056").unwrap(),
diff --git a/test_utils/src/lib.rs b/test_utils/src/lib.rs
index 5c8d7a5..66d0df5 100644
--- a/test_utils/src/lib.rs
+++ b/test_utils/src/lib.rs
@@ -1,4 +1,5 @@
1use std::{ 1use std::{
2 collections::HashSet,
2 ffi::OsStr, 3 ffi::OsStr,
3 path::{Path, PathBuf}, 4 path::{Path, PathBuf},
4 str::FromStr, 5 str::FromStr,
@@ -8,13 +9,13 @@ use std::{
8 9
9use anyhow::{Context, Result, bail, ensure}; 10use anyhow::{Context, Result, bail, ensure};
10use dialoguer::theme::{ColorfulTheme, Theme}; 11use dialoguer::theme::{ColorfulTheme, Theme};
11use futures::executor::block_on; 12use futures::{executor::block_on, future::join_all};
12use git::GitTestRepo; 13use git::GitTestRepo;
13use git2::{Signature, Time}; 14use git2::{Signature, Time};
14use nostr::{self, Kind, Tag, nips::nip65::RelayMetadata}; 15use nostr::{self, Kind, Tag, nips::nip65::RelayMetadata};
15use nostr_database::NostrEventsDatabase; 16use nostr_database::NostrEventsDatabase;
16use nostr_lmdb::NostrLMDB; 17use nostr_lmdb::NostrLMDB;
17use nostr_sdk::{Client, NostrSigner, TagStandard, serde_json}; 18use nostr_sdk::{Client, Event, NostrSigner, TagStandard, serde_json};
18use once_cell::sync::Lazy; 19use once_cell::sync::Lazy;
19use rexpect::session::{Options, PtySession}; 20use rexpect::session::{Options, PtySession};
20use strip_ansi_escapes::strip_str; 21use strip_ansi_escapes::strip_str;
@@ -139,7 +140,7 @@ pub fn make_event_old_or_change_user(
139 &keys.public_key(), 140 &keys.public_key(),
140 &unsigned.created_at, 141 &unsigned.created_at,
141 &unsigned.kind, 142 &unsigned.kind,
142 &unsigned.tags.clone().to_vec(), 143 &unsigned.tags.clone(),
143 &unsigned.content, 144 &unsigned.content,
144 )); 145 ));
145 146
@@ -1107,14 +1108,24 @@ pub async fn get_events_from_cache(
1107 git_repo_path: &Path, 1108 git_repo_path: &Path,
1108 filters: Vec<nostr::Filter>, 1109 filters: Vec<nostr::Filter>,
1109) -> Result<Vec<nostr::Event>> { 1110) -> Result<Vec<nostr::Event>> {
1110 Ok(get_local_cache_database(git_repo_path) 1111 let db = get_local_cache_database(git_repo_path).await?;
1111 .await? 1112
1112 .query(filters.clone()) 1113 let query_results = join_all(filters.into_iter().map(|filter| async {
1113 .await 1114 db.query(filter).await.context(
1114 .context(
1115 "failed to execute query on opened git repo nostr cache database .git/nostr-cache.lmdb", 1115 "failed to execute query on opened git repo nostr cache database .git/nostr-cache.lmdb",
1116 )? 1116 )
1117 .to_vec()) 1117 }))
1118 .await;
1119
1120 // no Event is being mutated, just new items added to the set
1121 #[allow(clippy::mutable_key_type)]
1122 let mut events: HashSet<Event> = HashSet::new();
1123
1124 for result in query_results {
1125 events.extend(result?);
1126 }
1127
1128 Ok(events.into_iter().collect())
1118} 1129}
1119 1130
1120pub fn get_proposal_branch_name( 1131pub fn get_proposal_branch_name(
@@ -1436,19 +1447,18 @@ fn get_first_proposal_event_id() -> Result<nostr::EventId> {
1436 Handle::current().block_on(client.add_relay("ws://localhost:8055"))?; 1447 Handle::current().block_on(client.add_relay("ws://localhost:8055"))?;
1437 Handle::current().block_on(client.connect_relay("ws://localhost:8055"))?; 1448 Handle::current().block_on(client.connect_relay("ws://localhost:8055"))?;
1438 let proposals = Handle::current() 1449 let proposals = Handle::current()
1439 .block_on(client.fetch_events( 1450 .block_on(
1440 vec![ 1451 client.fetch_events(
1441 nostr::Filter::default() 1452 nostr::Filter::default()
1442 .kind(nostr::Kind::GitPatch) 1453 .kind(nostr::Kind::GitPatch)
1443 .custom_tag( 1454 .custom_tags(nostr::SingleLetterTag::lowercase(nostr::Alphabet::T), vec![
1444 nostr::SingleLetterTag::lowercase(nostr::Alphabet::T), 1455 "root",
1445 vec!["root"], 1456 ]),
1446 ), 1457 Duration::from_millis(500),
1447 ], 1458 ),
1448 Some(Duration::from_millis(500)), 1459 )?
1449 ))?
1450 .to_vec(); 1460 .to_vec();
1451 Handle::current().block_on(client.disconnect())?; 1461 Handle::current().block_on(client.disconnect());
1452 1462
1453 let proposal_1_id = proposals 1463 let proposal_1_id = proposals
1454 .iter() 1464 .iter()
diff --git a/test_utils/src/relay.rs b/test_utils/src/relay.rs
index 634b2d6..e820651 100644
--- a/test_utils/src/relay.rs
+++ b/test_utils/src/relay.rs
@@ -48,7 +48,7 @@ impl<'a> Relay<'a> {
48 let ok_json = RelayMessage::Ok { 48 let ok_json = RelayMessage::Ok {
49 event_id: event.id, 49 event_id: event.id,
50 status: error.is_none(), 50 status: error.is_none(),
51 message: error.unwrap_or("").to_string(), 51 message: error.unwrap_or("").to_string().into(),
52 } 52 }
53 .as_json(); 53 .as_json();
54 // bail!(format!("{}", &ok_json)); 54 // bail!(format!("{}", &ok_json));
@@ -63,7 +63,7 @@ impl<'a> Relay<'a> {
63 let responder = self.clients.get(&client_id).unwrap(); 63 let responder = self.clients.get(&client_id).unwrap();
64 64
65 Ok(responder.send(simple_websockets::Message::Text( 65 Ok(responder.send(simple_websockets::Message::Text(
66 RelayMessage::EndOfStoredEvents(subscription_id).as_json(), 66 RelayMessage::EndOfStoredEvents(std::borrow::Cow::Borrowed(&subscription_id)).as_json(),
67 ))) 67 )))
68 } 68 }
69 69
@@ -79,8 +79,8 @@ impl<'a> Relay<'a> {
79 for event in events { 79 for event in events {
80 let res = responder.send(simple_websockets::Message::Text( 80 let res = responder.send(simple_websockets::Message::Text(
81 RelayMessage::Event { 81 RelayMessage::Event {
82 subscription_id: subscription_id.clone(), 82 subscription_id: std::borrow::Cow::Borrowed(subscription_id),
83 event: Box::new(event.clone()), 83 event: std::borrow::Cow::Borrowed(event),
84 } 84 }
85 .as_json(), 85 .as_json(),
86 )); 86 ));
@@ -156,12 +156,14 @@ impl<'a> Relay<'a> {
156 } 156 }
157 } 157 }
158 158
159 if let Ok((subscription_id, filters)) = get_nreq(&message) { 159 if let Ok((subscription_id, filter)) = get_nreq(&message) {
160 self.reqs.push(filters.clone()); 160 self.reqs.push(vec![filter.clone()]);
161 if let Some(listner) = self.req_listener { 161 if let Some(listner) = self.req_listener {
162 listner(self, client_id, subscription_id, filters)?; 162 listner(self, client_id, subscription_id, vec![filter.clone()])?;
163 } else { 163 } else {
164 self.respond_standard_req(client_id, &subscription_id, &filters)?; 164 self.respond_standard_req(client_id, &subscription_id, &[
165 filter.clone()
166 ])?;
165 // self.respond_eose(client_id, subscription_id)?; 167 // self.respond_eose(client_id, subscription_id)?;
166 } 168 }
167 // respond with events 169 // respond with events
@@ -198,8 +200,7 @@ fn get_nevent(message: &simple_websockets::Message) -> Result<nostr::Event> {
198 if let simple_websockets::Message::Text(s) = message.clone() { 200 if let simple_websockets::Message::Text(s) = message.clone() {
199 let cm_result = ClientMessage::from_json(s); 201 let cm_result = ClientMessage::from_json(s);
200 if let Ok(ClientMessage::Event(event)) = cm_result { 202 if let Ok(ClientMessage::Event(event)) = cm_result {
201 let e = *event; 203 return Ok(event.into_owned());
202 return Ok(e.clone());
203 } 204 }
204 } 205 }
205 bail!("not nostr event") 206 bail!("not nostr event")
@@ -207,15 +208,15 @@ fn get_nevent(message: &simple_websockets::Message) -> Result<nostr::Event> {
207 208
208fn get_nreq( 209fn get_nreq(
209 message: &simple_websockets::Message, 210 message: &simple_websockets::Message,
210) -> Result<(nostr::SubscriptionId, Vec<nostr::Filter>)> { 211) -> Result<(nostr::SubscriptionId, nostr::Filter)> {
211 if let simple_websockets::Message::Text(s) = message.clone() { 212 if let simple_websockets::Message::Text(s) = message.clone() {
212 let cm_result = ClientMessage::from_json(s); 213 let cm_result = ClientMessage::from_json(s);
213 if let Ok(ClientMessage::Req { 214 if let Ok(ClientMessage::Req {
214 subscription_id, 215 subscription_id,
215 filters, 216 filter,
216 }) = cm_result 217 }) = cm_result
217 { 218 {
218 return Ok((subscription_id, filters)); 219 return Ok((subscription_id.into_owned(), filter.into_owned()));
219 } 220 }
220 } 221 }
221 bail!("not nostr event") 222 bail!("not nostr event")