//! Appeal workflow tests: suspended user submits appeal. //! //! The `suspended` flag is stored in the session, so after suspending a user //! via direct SQL we must log out + log back in to pick up the new state. use crate::harness::TestHarness; #[tokio::test] async fn appeal_requires_auth() { let mut h = TestHarness::new().await; let resp = h .client .post_form("/api/users/me/appeal", "appeal_text=Please+unsuspend+me") .await; assert!( resp.status.is_client_error() || resp.status.is_redirection(), "Unauthenticated appeal should be rejected: {} {}", resp.status, resp.text ); } #[tokio::test] async fn appeal_non_suspended_user_rejected() { let mut h = TestHarness::new().await; let _user_id = h.signup("appealok", "appealok@test.com", "password123").await; let resp = h .client .post_form("/api/users/me/appeal", "appeal_text=I+want+to+appeal") .await; assert!( resp.status.is_client_error(), "Non-suspended user appeal should be rejected: {} {}", resp.status, resp.text ); } #[tokio::test] async fn appeal_empty_text_rejected() { let mut h = TestHarness::new().await; let user_id = h.signup("appealempty", "appealempty@test.com", "password123").await; h.suspend_user(user_id).await; // Re-login to pick up suspended state in session h.client.post_form("/logout", "").await; h.login("appealempty", "password123").await; let resp = h .client .post_form("/api/users/me/appeal", "appeal_text=") .await; assert!( resp.status.is_client_error(), "Empty appeal text should be rejected: {} {}", resp.status, resp.text ); } #[tokio::test] async fn appeal_too_long_rejected() { let mut h = TestHarness::new().await; let user_id = h.signup("appeallong", "appeallong@test.com", "password123").await; h.suspend_user(user_id).await; h.client.post_form("/logout", "").await; h.login("appeallong", "password123").await; let long_text = "a".repeat(2001); let resp = h .client .post_form( "/api/users/me/appeal", &format!("appeal_text={}", long_text), ) .await; assert!( resp.status.is_client_error(), "Appeal text >2000 chars should be rejected: {} {}", resp.status, resp.text ); } #[tokio::test] async fn appeal_suspended_user_succeeds() { let mut h = TestHarness::new().await; let _user_id = h.signup("appealgood", "appealgood@test.com", "password123").await; h.suspend_user(_user_id).await; h.client.post_form("/logout", "").await; h.login("appealgood", "password123").await; let resp = h .client .post_form( "/api/users/me/appeal", "appeal_text=I+believe+this+was+a+mistake", ) .await; assert!( resp.status.is_success() || resp.status == 204, "Suspended user appeal should succeed: {} {}", resp.status, resp.text ); }