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