summaryrefslogtreecommitdiff
path: root/src/channel/routes
diff options
context:
space:
mode:
authorOwen Jacobson <owen@grimoire.ca>2024-10-30 01:07:12 -0400
committerOwen Jacobson <owen@grimoire.ca>2024-10-30 01:07:12 -0400
commit36e659e971d091cfcbe370f5e45a0d01102d2e83 (patch)
treeb820f037590d9923ef8cbe8d8a2a9d73b4ed1be6 /src/channel/routes
parent2bac295504960ac4a18d7c19513160363f587f01 (diff)
Prevent deletion of non-empty channels.
Diffstat (limited to 'src/channel/routes')
-rw-r--r--src/channel/routes/channel/delete.rs9
-rw-r--r--src/channel/routes/channel/test/delete.rs34
2 files changed, 37 insertions, 6 deletions
diff --git a/src/channel/routes/channel/delete.rs b/src/channel/routes/channel/delete.rs
index 2d2b5f1..9c093c1 100644
--- a/src/channel/routes/channel/delete.rs
+++ b/src/channel/routes/channel/delete.rs
@@ -36,14 +36,19 @@ impl IntoResponse for Response {
#[derive(Debug, thiserror::Error)]
#[error(transparent)]
-pub struct Error(#[from] pub app::Error);
+pub struct Error(#[from] pub app::DeleteError);
impl IntoResponse for Error {
fn into_response(self) -> response::Response {
let Self(error) = self;
#[allow(clippy::match_wildcard_for_single_variants)]
match error {
- app::Error::NotFound(_) | app::Error::Deleted(_) => NotFound(error).into_response(),
+ app::DeleteError::NotFound(_) | app::DeleteError::Deleted(_) => {
+ NotFound(error).into_response()
+ }
+ app::DeleteError::NotEmpty(_) => {
+ (StatusCode::CONFLICT, error.to_string()).into_response()
+ }
other => Internal::from(other).into_response(),
}
}
diff --git a/src/channel/routes/channel/test/delete.rs b/src/channel/routes/channel/test/delete.rs
index 0371b0a..77a0b03 100644
--- a/src/channel/routes/channel/test/delete.rs
+++ b/src/channel/routes/channel/test/delete.rs
@@ -55,7 +55,7 @@ pub async fn invalid_channel_id() {
// Verify the response
- assert!(matches!(error, app::Error::NotFound(id) if id == channel));
+ assert!(matches!(error, app::DeleteError::NotFound(id) if id == channel));
}
#[tokio::test]
@@ -84,7 +84,7 @@ pub async fn channel_deleted() {
// Verify the response
- assert!(matches!(error, app::Error::Deleted(id) if id == channel.id));
+ assert!(matches!(error, app::DeleteError::Deleted(id) if id == channel.id));
}
#[tokio::test]
@@ -113,7 +113,7 @@ pub async fn channel_expired() {
// Verify the response
- assert!(matches!(error, app::Error::Deleted(id) if id == channel.id));
+ assert!(matches!(error, app::DeleteError::Deleted(id) if id == channel.id));
}
#[tokio::test]
@@ -147,5 +147,31 @@ pub async fn channel_purged() {
// Verify the response
- assert!(matches!(error, app::Error::NotFound(id) if id == channel.id));
+ assert!(matches!(error, app::DeleteError::NotFound(id) if id == channel.id));
+}
+
+#[tokio::test]
+pub async fn channel_not_empty() {
+ // Set up the environment
+
+ let app = fixtures::scratch_app().await;
+ let channel = fixtures::channel::create(&app, &fixtures::now()).await;
+ let sender = fixtures::login::create(&app, &fixtures::now()).await;
+ fixtures::message::send(&app, &channel, &sender, &fixtures::now()).await;
+
+ // Send the request
+
+ let deleter = fixtures::identity::create(&app, &fixtures::now()).await;
+ let delete::Error(error) = delete::handler(
+ State(app.clone()),
+ Path(channel.id.clone()),
+ fixtures::now(),
+ deleter,
+ )
+ .await
+ .expect_err("deleting a channel with messages fails");
+
+ // Verify the response
+
+ assert!(matches!(error, app::DeleteError::NotEmpty(id) if id == channel.id));
}