this repo has no description
1use chrono::Utc; 2use reqwest::StatusCode; 3use serde_json::{Value, json}; 4 5pub use crate::common::*; 6 7#[allow(dead_code)] 8pub async fn setup_new_user(handle_prefix: &str) -> (String, String) { 9 let client = client(); 10 let ts = Utc::now().timestamp_millis(); 11 let handle = format!("{}-{}.test", handle_prefix, ts); 12 let email = format!("{}-{}@test.com", handle_prefix, ts); 13 let password = "E2epass123!"; 14 let create_account_payload = json!({ 15 "handle": handle, 16 "email": email, 17 "password": password 18 }); 19 let create_res = client 20 .post(format!( 21 "{}/xrpc/com.atproto.server.createAccount", 22 base_url().await 23 )) 24 .json(&create_account_payload) 25 .send() 26 .await 27 .expect("setup_new_user: Failed to send createAccount"); 28 if create_res.status() != reqwest::StatusCode::OK { 29 panic!( 30 "setup_new_user: Failed to create account: {:?}", 31 create_res.text().await 32 ); 33 } 34 let create_body: Value = create_res 35 .json() 36 .await 37 .expect("setup_new_user: createAccount response was not JSON"); 38 let new_did = create_body["did"] 39 .as_str() 40 .expect("setup_new_user: Response had no DID") 41 .to_string(); 42 let new_jwt = verify_new_account(&client, &new_did).await; 43 (new_did, new_jwt) 44} 45 46#[allow(dead_code)] 47pub async fn create_post( 48 client: &reqwest::Client, 49 did: &str, 50 jwt: &str, 51 text: &str, 52) -> (String, String) { 53 let collection = "app.bsky.feed.post"; 54 let rkey = format!("e2e_social_{}", Utc::now().timestamp_millis()); 55 let now = Utc::now().to_rfc3339(); 56 let create_payload = json!({ 57 "repo": did, 58 "collection": collection, 59 "rkey": rkey, 60 "record": { 61 "$type": collection, 62 "text": text, 63 "createdAt": now 64 } 65 }); 66 let create_res = client 67 .post(format!( 68 "{}/xrpc/com.atproto.repo.putRecord", 69 base_url().await 70 )) 71 .bearer_auth(jwt) 72 .json(&create_payload) 73 .send() 74 .await 75 .expect("Failed to send create post request"); 76 assert_eq!( 77 create_res.status(), 78 reqwest::StatusCode::OK, 79 "Failed to create post record" 80 ); 81 let create_body: Value = create_res 82 .json() 83 .await 84 .expect("create post response was not JSON"); 85 let uri = create_body["uri"].as_str().unwrap().to_string(); 86 let cid = create_body["cid"].as_str().unwrap().to_string(); 87 (uri, cid) 88} 89 90#[allow(dead_code)] 91pub async fn create_follow( 92 client: &reqwest::Client, 93 follower_did: &str, 94 follower_jwt: &str, 95 followee_did: &str, 96) -> (String, String) { 97 let collection = "app.bsky.graph.follow"; 98 let rkey = format!("e2e_follow_{}", Utc::now().timestamp_millis()); 99 let now = Utc::now().to_rfc3339(); 100 let create_payload = json!({ 101 "repo": follower_did, 102 "collection": collection, 103 "rkey": rkey, 104 "record": { 105 "$type": collection, 106 "subject": followee_did, 107 "createdAt": now 108 } 109 }); 110 let create_res = client 111 .post(format!( 112 "{}/xrpc/com.atproto.repo.putRecord", 113 base_url().await 114 )) 115 .bearer_auth(follower_jwt) 116 .json(&create_payload) 117 .send() 118 .await 119 .expect("Failed to send create follow request"); 120 assert_eq!( 121 create_res.status(), 122 reqwest::StatusCode::OK, 123 "Failed to create follow record" 124 ); 125 let create_body: Value = create_res 126 .json() 127 .await 128 .expect("create follow response was not JSON"); 129 let uri = create_body["uri"].as_str().unwrap().to_string(); 130 let cid = create_body["cid"].as_str().unwrap().to_string(); 131 (uri, cid) 132} 133 134#[allow(dead_code)] 135pub async fn create_like( 136 client: &reqwest::Client, 137 liker_did: &str, 138 liker_jwt: &str, 139 subject_uri: &str, 140 subject_cid: &str, 141) -> (String, String) { 142 let collection = "app.bsky.feed.like"; 143 let rkey = format!("e2e_like_{}", Utc::now().timestamp_millis()); 144 let now = Utc::now().to_rfc3339(); 145 let payload = json!({ 146 "repo": liker_did, 147 "collection": collection, 148 "rkey": rkey, 149 "record": { 150 "$type": collection, 151 "subject": { 152 "uri": subject_uri, 153 "cid": subject_cid 154 }, 155 "createdAt": now 156 } 157 }); 158 let res = client 159 .post(format!( 160 "{}/xrpc/com.atproto.repo.putRecord", 161 base_url().await 162 )) 163 .bearer_auth(liker_jwt) 164 .json(&payload) 165 .send() 166 .await 167 .expect("Failed to create like"); 168 assert_eq!(res.status(), StatusCode::OK, "Failed to create like"); 169 let body: Value = res.json().await.expect("Like response not JSON"); 170 ( 171 body["uri"].as_str().unwrap().to_string(), 172 body["cid"].as_str().unwrap().to_string(), 173 ) 174} 175 176#[allow(dead_code)] 177pub async fn create_repost( 178 client: &reqwest::Client, 179 reposter_did: &str, 180 reposter_jwt: &str, 181 subject_uri: &str, 182 subject_cid: &str, 183) -> (String, String) { 184 let collection = "app.bsky.feed.repost"; 185 let rkey = format!("e2e_repost_{}", Utc::now().timestamp_millis()); 186 let now = Utc::now().to_rfc3339(); 187 let payload = json!({ 188 "repo": reposter_did, 189 "collection": collection, 190 "rkey": rkey, 191 "record": { 192 "$type": collection, 193 "subject": { 194 "uri": subject_uri, 195 "cid": subject_cid 196 }, 197 "createdAt": now 198 } 199 }); 200 let res = client 201 .post(format!( 202 "{}/xrpc/com.atproto.repo.putRecord", 203 base_url().await 204 )) 205 .bearer_auth(reposter_jwt) 206 .json(&payload) 207 .send() 208 .await 209 .expect("Failed to create repost"); 210 assert_eq!(res.status(), StatusCode::OK, "Failed to create repost"); 211 let body: Value = res.json().await.expect("Repost response not JSON"); 212 ( 213 body["uri"].as_str().unwrap().to_string(), 214 body["cid"].as_str().unwrap().to_string(), 215 ) 216} 217 218#[allow(dead_code)] 219pub async fn set_account_takedown(did: &str, takedown_ref: Option<&str>) { 220 let pool = get_test_db_pool().await; 221 sqlx::query!( 222 "UPDATE users SET takedown_ref = $1 WHERE did = $2", 223 takedown_ref, 224 did 225 ) 226 .execute(pool) 227 .await 228 .expect("Failed to update takedown_ref"); 229} 230 231#[allow(dead_code)] 232pub async fn set_account_deactivated(did: &str, deactivated: bool) { 233 let pool = get_test_db_pool().await; 234 let deactivated_at: Option<chrono::DateTime<Utc>> = 235 if deactivated { Some(Utc::now()) } else { None }; 236 sqlx::query!( 237 "UPDATE users SET deactivated_at = $1 WHERE did = $2", 238 deactivated_at, 239 did 240 ) 241 .execute(pool) 242 .await 243 .expect("Failed to update deactivated_at"); 244}