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