use axum::extract::{Path, State}; use itertools::Itertools; use crate::{channel::app, test::fixtures}; #[tokio::test] pub async fn valid_channel() { // Set up the environment let app = fixtures::scratch_app().await; let channel = fixtures::channel::create(&app, &fixtures::now()).await; // Send the request let deleter = fixtures::identity::create(&app, &fixtures::now()).await; let response = super::handler( State(app.clone()), Path(channel.id.clone()), fixtures::now(), deleter, ) .await .expect("deleting a valid channel succeeds"); // Verify the response assert_eq!(channel.id, response.id); // Verify the semantics let snapshot = app.boot().snapshot().await.expect("boot always succeeds"); let created = snapshot .events .into_iter() .filter_map(fixtures::event::channel) .filter_map(fixtures::event::channel::created) .exactly_one() .expect("only one channel has been created"); // We don't expect `channel` to match the event exactly, as the name will have been // tombstoned and the channel given a `deleted_at` date. assert_eq!(channel.id, created.channel.id); } #[tokio::test] pub async fn invalid_channel_id() { // Set up the environment let app = fixtures::scratch_app().await; // Send the request let deleter = fixtures::identity::create(&app, &fixtures::now()).await; let channel = fixtures::channel::fictitious(); let super::Error(error) = super::handler( State(app.clone()), Path(channel.clone()), fixtures::now(), deleter, ) .await .expect_err("deleting a nonexistent channel fails"); // Verify the response assert!(matches!(error, app::DeleteError::NotFound(id) if id == channel)); } #[tokio::test] pub async fn channel_deleted() { // Set up the environment let app = fixtures::scratch_app().await; let channel = fixtures::channel::create(&app, &fixtures::now()).await; app.channels() .delete(&channel.id, &fixtures::now()) .await .expect("deleting a recently-sent channel succeeds"); // Send the request let deleter = fixtures::identity::create(&app, &fixtures::now()).await; let super::Error(error) = super::handler( State(app.clone()), Path(channel.id.clone()), fixtures::now(), deleter, ) .await .expect_err("deleting a deleted channel fails"); // Verify the response assert!(matches!(error, app::DeleteError::Deleted(id) if id == channel.id)); } #[tokio::test] pub async fn channel_expired() { // Set up the environment let app = fixtures::scratch_app().await; let channel = fixtures::channel::create(&app, &fixtures::ancient()).await; app.channels() .expire(&fixtures::now()) .await .expect("expiring channels always succeeds"); // Send the request let deleter = fixtures::identity::create(&app, &fixtures::now()).await; let super::Error(error) = super::handler( State(app.clone()), Path(channel.id.clone()), fixtures::now(), deleter, ) .await .expect_err("deleting an expired channel fails"); // Verify the response assert!(matches!(error, app::DeleteError::Deleted(id) if id == channel.id)); } #[tokio::test] pub async fn channel_purged() { // Set up the environment let app = fixtures::scratch_app().await; let channel = fixtures::channel::create(&app, &fixtures::ancient()).await; app.channels() .expire(&fixtures::old()) .await .expect("expiring channels always succeeds"); app.channels() .purge(&fixtures::now()) .await .expect("purging channels always succeeds"); // Send the request let deleter = fixtures::identity::create(&app, &fixtures::now()).await; let super::Error(error) = super::handler( State(app.clone()), Path(channel.id.clone()), fixtures::now(), deleter, ) .await .expect_err("deleting a purged channel fails"); // Verify the response 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::user::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 super::Error(error) = super::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)); }