summaryrefslogtreecommitdiff
path: root/src/channel/routes
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-10-23 01:21:59 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-10-23 01:23:31 -0400
commit08a2f47bcdd774a1e52ca77dc2377c8ca5f8a5f0 (patch)
tree8c7bb520762708968aaa8ba98750e7b548ac6c4a /src/channel/routes
parentdd78dcf2ef69f636e45c38791684099ed591e450 (diff)
Channel creation tests for expiry, conflicting names
Diffstat (limited to 'src/channel/routes')
-rw-r--r--src/channel/routes/test.rs98
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);
}