Skip to main content

max / makenotwork

3.1 KB · 113 lines History Blame Raw
1 //! Appeal workflow tests: suspended user submits appeal.
2 //!
3 //! The `suspended` flag is stored in the session, so after suspending a user
4 //! via direct SQL we must log out + log back in to pick up the new state.
5
6 use crate::harness::TestHarness;
7
8 #[tokio::test]
9 async fn appeal_requires_auth() {
10 let mut h = TestHarness::new().await;
11
12 let resp = h
13 .client
14 .post_form("/api/users/me/appeal", "appeal_text=Please+unsuspend+me")
15 .await;
16 assert!(
17 resp.status.is_client_error() || resp.status.is_redirection(),
18 "Unauthenticated appeal should be rejected: {} {}",
19 resp.status,
20 resp.text
21 );
22 }
23
24 #[tokio::test]
25 async fn appeal_non_suspended_user_rejected() {
26 let mut h = TestHarness::new().await;
27 let _user_id = h
28 .signup("appealok", "appealok@test.com", "password123")
29 .await;
30
31 let resp = h
32 .client
33 .post_form("/api/users/me/appeal", "appeal_text=I+want+to+appeal")
34 .await;
35 assert!(
36 resp.status.is_client_error(),
37 "Non-suspended user appeal should be rejected: {} {}",
38 resp.status,
39 resp.text
40 );
41 }
42
43 #[tokio::test]
44 async fn appeal_empty_text_rejected() {
45 let mut h = TestHarness::new().await;
46 let user_id = h
47 .signup("appealempty", "appealempty@test.com", "password123")
48 .await;
49 h.suspend_user(user_id).await;
50 // Re-login to pick up suspended state in session
51 h.client.post_form("/logout", "").await;
52 h.login("appealempty", "password123").await;
53
54 let resp = h
55 .client
56 .post_form("/api/users/me/appeal", "appeal_text=")
57 .await;
58 assert!(
59 resp.status.is_client_error(),
60 "Empty appeal text should be rejected: {} {}",
61 resp.status,
62 resp.text
63 );
64 }
65
66 #[tokio::test]
67 async fn appeal_too_long_rejected() {
68 let mut h = TestHarness::new().await;
69 let user_id = h
70 .signup("appeallong", "appeallong@test.com", "password123")
71 .await;
72 h.suspend_user(user_id).await;
73 h.client.post_form("/logout", "").await;
74 h.login("appeallong", "password123").await;
75
76 let long_text = "a".repeat(2001);
77 let resp = h
78 .client
79 .post_form("/api/users/me/appeal", &format!("appeal_text={long_text}"))
80 .await;
81 assert!(
82 resp.status.is_client_error(),
83 "Appeal text >2000 chars should be rejected: {} {}",
84 resp.status,
85 resp.text
86 );
87 }
88
89 #[tokio::test]
90 async fn appeal_suspended_user_succeeds() {
91 let mut h = TestHarness::new().await;
92 let user_id = h
93 .signup("appealgood", "appealgood@test.com", "password123")
94 .await;
95 h.suspend_user(user_id).await;
96 h.client.post_form("/logout", "").await;
97 h.login("appealgood", "password123").await;
98
99 let resp = h
100 .client
101 .post_form(
102 "/api/users/me/appeal",
103 "appeal_text=I+believe+this+was+a+mistake",
104 )
105 .await;
106 assert!(
107 resp.status.is_success() || resp.status == 204,
108 "Suspended user appeal should succeed: {} {}",
109 resp.status,
110 resp.text
111 );
112 }
113