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