diff options
| author | Owen Jacobson <owen@grimoire.ca> | 2024-10-23 01:21:59 -0400 |
|---|---|---|
| committer | Owen Jacobson <owen@grimoire.ca> | 2024-10-23 01:23:31 -0400 |
| commit | 08a2f47bcdd774a1e52ca77dc2377c8ca5f8a5f0 (patch) | |
| tree | 8c7bb520762708968aaa8ba98750e7b548ac6c4a /src | |
| parent | dd78dcf2ef69f636e45c38791684099ed591e450 (diff) | |
Channel creation tests for expiry, conflicting names
Diffstat (limited to 'src')
| -rw-r--r-- | src/channel/routes/test.rs | 98 |
1 files changed, 81 insertions, 17 deletions
diff --git a/src/channel/routes/test.rs b/src/channel/routes/test.rs index 77f283b..216eba1 100644 --- a/src/channel/routes/test.rs +++ b/src/channel/routes/test.rs @@ -6,6 +6,7 @@ use futures::stream::StreamExt as _; use super::post; use crate::{ channel::app, + name::Name, test::fixtures::{self, future::Immediately as _}, }; @@ -87,6 +88,39 @@ async fn duplicate_name() { } #[tokio::test] +async fn conflicting_canonical_name() { + // Set up the environment + + let app = fixtures::scratch_app().await; + let creator = fixtures::identity::create(&app, &fixtures::now()).await; + + let existing_name = Name::from("rijksmuseum"); + app.channels() + .create(&existing_name, &fixtures::now()) + .await + .expect("creating a channel in an empty environment succeeds"); + + let conflicting_name = Name::from("r\u{0133}ksmuseum"); + + // Call the endpoint + + let request = post::Request { + name: conflicting_name.clone(), + }; + let post::Error(error) = + post::handler(State(app.clone()), creator, fixtures::now(), Json(request)) + .await + .expect_err("duplicate channel name should fail the request"); + + // Verify the structure of the response + + assert!(matches!( + error, + app::CreateError::DuplicateName(name) if conflicting_name == name + )); +} + +#[tokio::test] async fn name_reusable_after_delete() { // Set up the environment @@ -119,7 +153,7 @@ async fn name_reusable_after_delete() { let post::Response(response) = post::handler(State(app.clone()), creator, fixtures::now(), Json(request)) .await - .expect("new channel in an empty app"); + .expect("creation succeeds after original channel deleted"); // Verify the structure of the response @@ -127,9 +161,6 @@ async fn name_reusable_after_delete() { // Verify the semantics - let snapshot = app.boot().snapshot().await.expect("boot always succeeds"); - assert!(snapshot.channels.iter().any(|channel| channel == &response)); - let channel = app .channels() .get(&response.id) @@ -137,21 +168,54 @@ async fn name_reusable_after_delete() { .expect("searching for channels by ID never fails") .expect("the newly-created channel exists"); assert_eq!(response, channel); +} - let mut events = app - .events() - .subscribe(None) - .await - .expect("subscribing never fails") - .filter_map(fixtures::channel::events) - .filter_map(fixtures::channel::created) - .filter(|event| future::ready(event.channel == response)); +#[tokio::test] +async fn name_reusable_after_expiry() { + // Set up the environment - let event = events - .next() - .immediately() + let app = fixtures::scratch_app().await; + let creator = fixtures::identity::create(&app, &fixtures::ancient()).await; + let name = fixtures::channel::propose(); + + // Call the endpoint (first time) + + let request = post::Request { name: name.clone() }; + let post::Response(_) = post::handler( + State(app.clone()), + creator.clone(), + fixtures::ancient(), + Json(request), + ) + .await + .expect("new channel in an empty app"); + + // Delete the channel + + app.channels() + .expire(&fixtures::now()) .await - .expect("creation event published"); + .expect("expiry always succeeds"); - assert_eq!(event.channel, response); + // Call the endpoint (second time) + + let request = post::Request { name: name.clone() }; + let post::Response(response) = + post::handler(State(app.clone()), creator, fixtures::now(), Json(request)) + .await + .expect("creation succeeds after original channel expired"); + + // Verify the structure of the response + + assert_eq!(name, response.name); + + // Verify the semantics + + let channel = app + .channels() + .get(&response.id) + .await + .expect("searching for channels by ID never fails") + .expect("the newly-created channel exists"); + assert_eq!(response, channel); } |
