diff options
| author | DanConwayDev <DanConwayDev@protonmail.com> | 2023-11-01 00:00:00 +0000 |
|---|---|---|
| committer | DanConwayDev <DanConwayDev@protonmail.com> | 2023-11-01 00:00:00 +0000 |
| commit | 0753e0bcdd3d606f8f0226a3980bcd817117abaa (patch) | |
| tree | 8eab6115e2840cbf1c16de441e1168e3fdf18eb8 /tests | |
| parent | 1b740dd135aafb52b94b710b3ae24e4aaaa99632 (diff) | |
feat(claim) create basic event
replacable event with root-commit, name, description and relay tags
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/claim.rs | 331 |
1 files changed, 331 insertions, 0 deletions
diff --git a/tests/claim.rs b/tests/claim.rs new file mode 100644 index 0000000..ec62c0b --- /dev/null +++ b/tests/claim.rs | |||
| @@ -0,0 +1,331 @@ | |||
| 1 | use anyhow::Result; | ||
| 2 | use serial_test::serial; | ||
| 3 | use test_utils::{git::GitTestRepo, *}; | ||
| 4 | |||
| 5 | #[test] | ||
| 6 | fn when_no_main_or_master_branch_return_error() -> Result<()> { | ||
| 7 | let test_repo = GitTestRepo::new("notmain")?; | ||
| 8 | test_repo.populate()?; | ||
| 9 | let mut p = CliTester::new_from_dir(&test_repo.dir, ["claim"]); | ||
| 10 | p.expect("Error: no main or master branch")?; | ||
| 11 | Ok(()) | ||
| 12 | } | ||
| 13 | |||
| 14 | mod sends_repoistory_to_relays { | ||
| 15 | use futures::join; | ||
| 16 | use test_utils::relay::Relay; | ||
| 17 | |||
| 18 | use super::*; | ||
| 19 | |||
| 20 | static REPOSITORY_KIND: u64 = 30017; | ||
| 21 | |||
| 22 | fn prep_git_repo() -> Result<GitTestRepo> { | ||
| 23 | let test_repo = GitTestRepo::default(); | ||
| 24 | test_repo.populate()?; | ||
| 25 | Ok(test_repo) | ||
| 26 | } | ||
| 27 | |||
| 28 | fn cli_tester_claim(git_repo: &GitTestRepo) -> CliTester { | ||
| 29 | CliTester::new_from_dir( | ||
| 30 | &git_repo.dir, | ||
| 31 | [ | ||
| 32 | "--nsec", | ||
| 33 | TEST_KEY_1_NSEC, | ||
| 34 | "--password", | ||
| 35 | TEST_PASSWORD, | ||
| 36 | "--disable-cli-spinners", | ||
| 37 | "claim", | ||
| 38 | "--title", | ||
| 39 | "example-name", | ||
| 40 | "--description", | ||
| 41 | "example-description", | ||
| 42 | ], | ||
| 43 | ) | ||
| 44 | } | ||
| 45 | |||
| 46 | fn expect_msgs_first(p: &mut CliTester) -> Result<()> { | ||
| 47 | p.expect("searching for your details...\r\n")?; | ||
| 48 | p.expect("\r")?; | ||
| 49 | p.expect("logged in as fred\r\n")?; | ||
| 50 | // // p.expect("searching for existing claims on repository...\r\n")?; | ||
| 51 | p.expect("publishing repostory reference...\r\n")?; | ||
| 52 | Ok(()) | ||
| 53 | } | ||
| 54 | |||
| 55 | async fn prep_run_claim() -> Result<( | ||
| 56 | Relay<'static>, | ||
| 57 | Relay<'static>, | ||
| 58 | Relay<'static>, | ||
| 59 | Relay<'static>, | ||
| 60 | Relay<'static>, | ||
| 61 | )> { | ||
| 62 | let git_repo = prep_git_repo()?; | ||
| 63 | // fallback (51,52) user write (53, 55) repo (55, 56) | ||
| 64 | let (mut r51, mut r52, mut r53, mut r55, mut r56) = ( | ||
| 65 | Relay::new( | ||
| 66 | 8051, | ||
| 67 | None, | ||
| 68 | Some(&|relay, client_id, subscription_id, _| -> Result<()> { | ||
| 69 | relay.respond_events( | ||
| 70 | client_id, | ||
| 71 | &subscription_id, | ||
| 72 | &vec![ | ||
| 73 | generate_test_key_1_metadata_event("fred"), | ||
| 74 | generate_test_key_1_relay_list_event(), | ||
| 75 | ], | ||
| 76 | )?; | ||
| 77 | Ok(()) | ||
| 78 | }), | ||
| 79 | ), | ||
| 80 | Relay::new(8052, None, None), | ||
| 81 | Relay::new(8053, None, None), | ||
| 82 | Relay::new(8055, None, None), | ||
| 83 | Relay::new(8056, None, None), | ||
| 84 | ); | ||
| 85 | |||
| 86 | // // check relay had the right number of events | ||
| 87 | let cli_tester_handle = std::thread::spawn(move || -> Result<()> { | ||
| 88 | let mut p = cli_tester_claim(&git_repo); | ||
| 89 | p.expect_end_eventually()?; | ||
| 90 | for p in [51, 52, 53, 55, 56] { | ||
| 91 | relay::shutdown_relay(8000 + p)?; | ||
| 92 | } | ||
| 93 | Ok(()) | ||
| 94 | }); | ||
| 95 | |||
| 96 | // launch relay | ||
| 97 | let _ = join!( | ||
| 98 | r51.listen_until_close(), | ||
| 99 | r52.listen_until_close(), | ||
| 100 | r53.listen_until_close(), | ||
| 101 | r55.listen_until_close(), | ||
| 102 | r56.listen_until_close(), | ||
| 103 | ); | ||
| 104 | cli_tester_handle.join().unwrap()?; | ||
| 105 | Ok((r51, r52, r53, r55, r56)) | ||
| 106 | } | ||
| 107 | |||
| 108 | mod sent_to_correct_relays { | ||
| 109 | use super::*; | ||
| 110 | |||
| 111 | #[test] | ||
| 112 | #[serial] | ||
| 113 | fn only_1_repository_kind_event_sent_to_user_relays() -> Result<()> { | ||
| 114 | let (_, _, r53, r55, _) = futures::executor::block_on(prep_run_claim())?; | ||
| 115 | for relay in [&r53, &r55] { | ||
| 116 | assert_eq!( | ||
| 117 | relay | ||
| 118 | .events | ||
| 119 | .iter() | ||
| 120 | .filter(|e| e.kind.as_u64().eq(&REPOSITORY_KIND)) | ||
| 121 | .count(), | ||
| 122 | 1, | ||
| 123 | ); | ||
| 124 | } | ||
| 125 | Ok(()) | ||
| 126 | } | ||
| 127 | |||
| 128 | #[test] | ||
| 129 | #[serial] | ||
| 130 | fn only_1_repository_kind_event_sent_to_repo_relays() -> Result<()> { | ||
| 131 | let (_, _, _, r55, r56) = futures::executor::block_on(prep_run_claim())?; | ||
| 132 | for relay in [&r55, &r56] { | ||
| 133 | assert_eq!( | ||
| 134 | relay | ||
| 135 | .events | ||
| 136 | .iter() | ||
| 137 | .filter(|e| e.kind.as_u64().eq(&REPOSITORY_KIND)) | ||
| 138 | .count(), | ||
| 139 | 1, | ||
| 140 | ); | ||
| 141 | } | ||
| 142 | Ok(()) | ||
| 143 | } | ||
| 144 | |||
| 145 | #[test] | ||
| 146 | #[serial] | ||
| 147 | fn event_not_sent_to_fallback_relay() -> Result<()> { | ||
| 148 | let (r51, r52, _, _, _) = futures::executor::block_on(prep_run_claim())?; | ||
| 149 | for relay in [&r51, &r52] { | ||
| 150 | assert_eq!( | ||
| 151 | relay | ||
| 152 | .events | ||
| 153 | .iter() | ||
| 154 | .filter(|e| e.kind.as_u64().eq(&REPOSITORY_KIND)) | ||
| 155 | .count(), | ||
| 156 | 0, | ||
| 157 | ); | ||
| 158 | } | ||
| 159 | Ok(()) | ||
| 160 | } | ||
| 161 | } | ||
| 162 | |||
| 163 | mod tags { | ||
| 164 | use super::*; | ||
| 165 | |||
| 166 | #[test] | ||
| 167 | #[serial] | ||
| 168 | fn d_replaceable_event_identifier() -> Result<()> { | ||
| 169 | let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_claim())?; | ||
| 170 | for relay in [&r53, &r55, &r56] { | ||
| 171 | let event: &nostr::Event = relay | ||
| 172 | .events | ||
| 173 | .iter() | ||
| 174 | .find(|e| e.kind.as_u64().eq(&REPOSITORY_KIND)) | ||
| 175 | .unwrap(); | ||
| 176 | |||
| 177 | assert!(event.tags.iter().any(|t| t.as_vec()[0].eq("d") | ||
| 178 | && t.as_vec()[1].eq("9ee507fc4357d7ee16a5d8901bedcd103f23c17d"))); | ||
| 179 | } | ||
| 180 | Ok(()) | ||
| 181 | } | ||
| 182 | |||
| 183 | #[test] | ||
| 184 | #[serial] | ||
| 185 | fn root_commit() -> Result<()> { | ||
| 186 | let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_claim())?; | ||
| 187 | for relay in [&r53, &r55, &r56] { | ||
| 188 | let event: &nostr::Event = relay | ||
| 189 | .events | ||
| 190 | .iter() | ||
| 191 | .find(|e| e.kind.as_u64().eq(&REPOSITORY_KIND)) | ||
| 192 | .unwrap(); | ||
| 193 | |||
| 194 | // root commit 'r' tag with 'r-' prefix | ||
| 195 | assert!(event.tags.iter().any(|t| t.as_vec()[0].eq("r") | ||
| 196 | && t.as_vec()[1].eq("r-9ee507fc4357d7ee16a5d8901bedcd103f23c17d"))); | ||
| 197 | } | ||
| 198 | Ok(()) | ||
| 199 | } | ||
| 200 | |||
| 201 | #[test] | ||
| 202 | #[serial] | ||
| 203 | fn name() -> Result<()> { | ||
| 204 | let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_claim())?; | ||
| 205 | for relay in [&r53, &r55, &r56] { | ||
| 206 | let event: &nostr::Event = relay | ||
| 207 | .events | ||
| 208 | .iter() | ||
| 209 | .find(|e| e.kind.as_u64().eq(&REPOSITORY_KIND)) | ||
| 210 | .unwrap(); | ||
| 211 | |||
| 212 | assert!( | ||
| 213 | event | ||
| 214 | .tags | ||
| 215 | .iter() | ||
| 216 | .any(|t| t.as_vec()[0].eq("name") && t.as_vec()[1].eq("example-name")) | ||
| 217 | ); | ||
| 218 | } | ||
| 219 | Ok(()) | ||
| 220 | } | ||
| 221 | |||
| 222 | #[test] | ||
| 223 | #[serial] | ||
| 224 | fn description() -> Result<()> { | ||
| 225 | let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_claim())?; | ||
| 226 | for relay in [&r53, &r55, &r56] { | ||
| 227 | let event: &nostr::Event = relay | ||
| 228 | .events | ||
| 229 | .iter() | ||
| 230 | .find(|e| e.kind.as_u64().eq(&REPOSITORY_KIND)) | ||
| 231 | .unwrap(); | ||
| 232 | |||
| 233 | assert!( | ||
| 234 | event.tags.iter().any(|t| t.as_vec()[0].eq("description") | ||
| 235 | && t.as_vec()[1].eq("example-description")) | ||
| 236 | ); | ||
| 237 | } | ||
| 238 | Ok(()) | ||
| 239 | } | ||
| 240 | |||
| 241 | #[test] | ||
| 242 | #[serial] | ||
| 243 | fn relays() -> Result<()> { | ||
| 244 | let (_, _, r53, r55, r56) = futures::executor::block_on(prep_run_claim())?; | ||
| 245 | for relay in [&r53, &r55, &r56] { | ||
| 246 | let event: &nostr::Event = relay | ||
| 247 | .events | ||
| 248 | .iter() | ||
| 249 | .find(|e| e.kind.as_u64().eq(&REPOSITORY_KIND)) | ||
| 250 | .unwrap(); | ||
| 251 | |||
| 252 | let relay_tags = event | ||
| 253 | .tags | ||
| 254 | .iter() | ||
| 255 | .filter(|t| t.as_vec()[0].eq("relay")) | ||
| 256 | .collect::<Vec<&nostr::Tag>>(); | ||
| 257 | assert_eq!(relay_tags[0].as_vec()[1], "ws://localhost:8055"); | ||
| 258 | assert_eq!(relay_tags[1].as_vec()[1], "ws://localhost:8056"); | ||
| 259 | } | ||
| 260 | Ok(()) | ||
| 261 | } | ||
| 262 | } | ||
| 263 | |||
| 264 | mod cli_ouput { | ||
| 265 | use super::*; | ||
| 266 | |||
| 267 | async fn run_test_async() -> Result<()> { | ||
| 268 | let git_repo = prep_git_repo()?; | ||
| 269 | |||
| 270 | let (mut r51, mut r52, mut r53, mut r55, mut r56) = ( | ||
| 271 | Relay::new( | ||
| 272 | 8051, | ||
| 273 | None, | ||
| 274 | Some(&|relay, client_id, subscription_id, _| -> Result<()> { | ||
| 275 | relay.respond_events( | ||
| 276 | client_id, | ||
| 277 | &subscription_id, | ||
| 278 | &vec![ | ||
| 279 | generate_test_key_1_metadata_event("fred"), | ||
| 280 | generate_test_key_1_relay_list_event(), | ||
| 281 | ], | ||
| 282 | )?; | ||
| 283 | Ok(()) | ||
| 284 | }), | ||
| 285 | ), | ||
| 286 | Relay::new(8052, None, None), | ||
| 287 | Relay::new(8053, None, None), | ||
| 288 | Relay::new(8055, None, None), | ||
| 289 | Relay::new(8056, None, None), | ||
| 290 | ); | ||
| 291 | |||
| 292 | // // check relay had the right number of events | ||
| 293 | let cli_tester_handle = std::thread::spawn(move || -> Result<()> { | ||
| 294 | let mut p = cli_tester_claim(&git_repo); | ||
| 295 | expect_msgs_first(&mut p)?; | ||
| 296 | relay::expect_send_with_progress( | ||
| 297 | &mut p, | ||
| 298 | vec![ | ||
| 299 | (" [my-relay] [repo-relay] ws://localhost:8055", true, ""), | ||
| 300 | (" [my-relay] ws://localhost:8053", true, ""), | ||
| 301 | (" [repo-relay] ws://localhost:8056", true, ""), | ||
| 302 | ], | ||
| 303 | 1, | ||
| 304 | )?; | ||
| 305 | p.expect_end_with_whitespace()?; | ||
| 306 | for p in [51, 52, 53, 55, 56] { | ||
| 307 | relay::shutdown_relay(8000 + p)?; | ||
| 308 | } | ||
| 309 | Ok(()) | ||
| 310 | }); | ||
| 311 | |||
| 312 | // launch relay | ||
| 313 | let _ = join!( | ||
| 314 | r51.listen_until_close(), | ||
| 315 | r52.listen_until_close(), | ||
| 316 | r53.listen_until_close(), | ||
| 317 | r55.listen_until_close(), | ||
| 318 | r56.listen_until_close(), | ||
| 319 | ); | ||
| 320 | cli_tester_handle.join().unwrap()?; | ||
| 321 | Ok(()) | ||
| 322 | } | ||
| 323 | |||
| 324 | #[test] | ||
| 325 | #[serial] | ||
| 326 | fn check_cli_output() -> Result<()> { | ||
| 327 | futures::executor::block_on(run_test_async())?; | ||
| 328 | Ok(()) | ||
| 329 | } | ||
| 330 | } | ||
| 331 | } | ||