Skip to content

Commit 0224052

Browse files
authored
Add PubkyId::to_uri() -> ParsedUri direct conversion (#65)
* Add PubkyId::to_uri -> ParsedUri direct conversion * URI parser tests: re-use USER_ID across tests
1 parent 53bd363 commit 0224052

File tree

2 files changed

+34
-46
lines changed

2 files changed

+34
-46
lines changed

src/types.rs

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ use wasm_bindgen::prelude::*;
88
#[cfg(feature = "openapi")]
99
use utoipa::ToSchema;
1010

11+
use crate::{ParsedUri, Resource};
12+
1113
/// Represents user data with name, bio, image, links, and status.
1214
#[cfg_attr(target_arch = "wasm32", wasm_bindgen)]
1315
#[derive(Serialize, Deserialize, Default, Clone, Debug, PartialEq)]
@@ -31,6 +33,13 @@ impl PubkyId {
3133

3234
Ok(PubkyId(s.to_string()))
3335
}
36+
37+
pub fn to_uri(&self) -> ParsedUri {
38+
ParsedUri {
39+
user_id: self.clone(),
40+
resource: Resource::User,
41+
}
42+
}
3443
}
3544

3645
impl fmt::Display for PubkyId {

src/uri_parser.rs

Lines changed: 25 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -165,10 +165,7 @@ mod tests {
165165

166166
#[test]
167167
fn test_empty_bookmark_uri() {
168-
let uri = bookmark_uri_builder(
169-
"operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo".into(),
170-
"".into(),
171-
);
168+
let uri = bookmark_uri_builder(USER_ID.into(), "".into());
172169
let parsed_uri = ParsedUri::try_from(uri).unwrap_or_default();
173170
assert_eq!(
174171
parsed_uri.resource,
@@ -179,10 +176,7 @@ mod tests {
179176

180177
#[test]
181178
fn test_some_bookmark_uri() {
182-
let uri = bookmark_uri_builder(
183-
"operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo".into(),
184-
"00".into(),
185-
);
179+
let uri = bookmark_uri_builder(USER_ID.into(), "00".into());
186180
let parsed_uri = ParsedUri::try_from(uri).unwrap_or_default();
187181
assert_eq!(
188182
parsed_uri.resource,
@@ -193,7 +187,7 @@ mod tests {
193187

194188
#[test]
195189
fn test_user() {
196-
let uri = user_uri_builder("operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo".into());
190+
let uri = user_uri_builder(USER_ID.into());
197191
let parsed_uri = ParsedUri::try_from(uri).unwrap_or_default();
198192
assert_eq!(
199193
parsed_uri.resource,
@@ -206,18 +200,24 @@ mod tests {
206200

207201
#[test]
208202
fn test_valid_user_uri() {
203+
let user_id = PubkyId::try_from(USER_ID).unwrap();
204+
209205
// A valid user URI ends with profile.json.
210-
let uri = user_uri_builder("operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo".into());
206+
let uri = user_uri_builder(USER_ID.into());
211207
let parsed = ParsedUri::try_from(uri).expect("Failed to parse valid user URI");
212-
assert_eq!(parsed.user_id, PubkyId::try_from(USER_ID).unwrap());
208+
assert_eq!(parsed.user_id, user_id);
213209
assert_eq!(parsed.resource, Resource::User);
210+
211+
// Repeat same checks for ParsedUri derived directly from PubkyId
212+
let parsed_uri_from_pubky_id = user_id.to_uri();
213+
assert_eq!(parsed_uri_from_pubky_id.user_id, user_id);
214+
assert_eq!(parsed_uri_from_pubky_id.resource, Resource::User);
214215
}
215216

216217
#[test]
217218
fn test_valid_last_read_uri() {
218219
// A valid last_read URI ends with last_read.
219-
let uri =
220-
last_read_uri_builder("operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo".into());
220+
let uri = last_read_uri_builder(USER_ID.into());
221221
let parsed = ParsedUri::try_from(uri).expect("Failed to parse valid last_read URI");
222222
assert_eq!(parsed.user_id, PubkyId::try_from(USER_ID).unwrap());
223223
assert_eq!(parsed.resource, Resource::LastRead);
@@ -226,10 +226,7 @@ mod tests {
226226
#[test]
227227
fn test_valid_post_uri() {
228228
// A valid post URI includes the posts/ segment followed by an identifier.
229-
let uri = post_uri_builder(
230-
"operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo".into(),
231-
"0032SSN7Q4EVG".into(),
232-
);
229+
let uri = post_uri_builder(USER_ID.into(), "0032SSN7Q4EVG".into());
233230
let parsed = ParsedUri::try_from(uri).expect("Failed to parse valid post URI");
234231
assert_eq!(parsed.user_id, PubkyId::try_from(USER_ID).unwrap());
235232
assert_eq!(parsed.resource, Resource::Post("0032SSN7Q4EVG".to_string()));
@@ -238,10 +235,7 @@ mod tests {
238235
#[test]
239236
fn test_valid_follow_uri() {
240237
// A valid follow URI.
241-
let uri = follow_uri_builder(
242-
"operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo".into(),
243-
"operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo".into(),
244-
);
238+
let uri = follow_uri_builder(USER_ID.into(), USER_ID.into());
245239
let parsed = ParsedUri::try_from(uri).expect("Failed to parse valid follow URI");
246240
assert_eq!(parsed.user_id, PubkyId::try_from(USER_ID).unwrap());
247241
// Assuming PubkyId::try_from("def456") returns a PubkyId that equals PubkyId::try_from("def456")
@@ -254,21 +248,15 @@ mod tests {
254248
#[test]
255249
fn test_valid_bookmark_uri() {
256250
let bookmark_id = "8Z8CWH8NVYQY39ZEBFGKQWWEKG";
257-
let uri = bookmark_uri_builder(
258-
"operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo".into(),
259-
bookmark_id.into(),
260-
);
251+
let uri = bookmark_uri_builder(USER_ID.into(), bookmark_id.into());
261252
let parsed = ParsedUri::try_from(uri).expect("Failed to parse valid bookmark URI");
262253
assert_eq!(parsed.user_id, PubkyId::try_from(USER_ID).unwrap());
263254
assert_eq!(parsed.resource, Resource::Bookmark(bookmark_id.to_string()));
264255
}
265256

266257
#[test]
267258
fn test_valid_tag_uri() {
268-
let uri = tag_uri_builder(
269-
"operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo".into(),
270-
"8Z8CWH8NVYQY39ZEBFGKQWWEKG".into(),
271-
);
259+
let uri = tag_uri_builder(USER_ID.into(), "8Z8CWH8NVYQY39ZEBFGKQWWEKG".into());
272260
let parsed = ParsedUri::try_from(uri).expect("Failed to parse valid tag URI");
273261
assert_eq!(parsed.user_id, PubkyId::try_from(USER_ID).unwrap());
274262
assert_eq!(
@@ -279,21 +267,15 @@ mod tests {
279267

280268
#[test]
281269
fn test_valid_file_uri() {
282-
let uri = file_uri_builder(
283-
"operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo".into(),
284-
"file003".into(),
285-
);
270+
let uri = file_uri_builder(USER_ID.into(), "file003".into());
286271
let parsed = ParsedUri::try_from(uri).expect("Failed to parse valid file URI");
287272
assert_eq!(parsed.user_id, PubkyId::try_from(USER_ID).unwrap());
288273
assert_eq!(parsed.resource, Resource::File("file003".to_string()));
289274
}
290275

291276
#[test]
292277
fn test_valid_blob_uri() {
293-
let uri = blob_uri_builder(
294-
"operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo".into(),
295-
"8Z8CWH8NVYQY39ZEBFGKQWWEKG".into(),
296-
);
278+
let uri = blob_uri_builder(USER_ID.into(), "8Z8CWH8NVYQY39ZEBFGKQWWEKG".into());
297279
let parsed = ParsedUri::try_from(uri).expect("Failed to parse valid blob URI");
298280
assert_eq!(parsed.user_id, PubkyId::try_from(USER_ID).unwrap());
299281
assert_eq!(
@@ -304,10 +286,7 @@ mod tests {
304286

305287
#[test]
306288
fn test_valid_feed_uri() {
307-
let uri = feed_uri_builder(
308-
"operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo".into(),
309-
"8Z8CWH8NVYQY39ZEBFGKQWWEKG".into(),
310-
);
289+
let uri = feed_uri_builder(USER_ID.into(), "8Z8CWH8NVYQY39ZEBFGKQWWEKG".into());
311290
let parsed = ParsedUri::try_from(uri).expect("Failed to parse valid feed URI");
312291
assert_eq!(parsed.user_id, PubkyId::try_from(USER_ID).unwrap());
313292
assert_eq!(
@@ -320,7 +299,7 @@ mod tests {
320299
fn test_no_resource_segments() {
321300
// When there are no segments beyond the public and app paths,
322301
// the resource should be Unknown.
323-
let uri = "pubky://operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo/pub/pubky.app/";
302+
let uri = format!("pubky://{USER_ID}/pub/pubky.app/");
324303
let parsed =
325304
ParsedUri::try_from(uri).expect("Failed to parse URI with no resource segments");
326305
assert_eq!(parsed.user_id, PubkyId::try_from(USER_ID).unwrap());
@@ -330,7 +309,7 @@ mod tests {
330309
#[test]
331310
fn test_unknown_resource() {
332311
// Unknown resource type yields Resource::Unknown.
333-
let uri = "pubky://operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo/pub/pubky.app/unknown/xyz";
312+
let uri = format!("pubky://{USER_ID}/pub/pubky.app/unknown/xyz");
334313
let parsed = ParsedUri::try_from(uri).expect("Failed to parse URI with unknown resource");
335314
assert_eq!(parsed.user_id, PubkyId::try_from(USER_ID).unwrap());
336315
assert_eq!(parsed.resource, Resource::Unknown);
@@ -340,23 +319,23 @@ mod tests {
340319

341320
#[test]
342321
fn test_invalid_scheme() {
343-
let uri = "http://operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo/pub/pubky.app/profile.json";
322+
let uri = format!("http://{USER_ID}/pub/pubky.app/profile.json");
344323
let result = ParsedUri::try_from(uri);
345324
assert!(result.is_err());
346325
}
347326

348327
#[test]
349328
fn test_invalid_public_path() {
350329
// Change the public path so it doesn't match.
351-
let uri = "pubky://operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo/invalid/pubky.app/profile.json";
330+
let uri = format!("pubky://{USER_ID}/invalid/pubky.app/profile.json");
352331
let result = ParsedUri::try_from(uri);
353332
assert!(result.is_err());
354333
}
355334

356335
#[test]
357336
fn test_invalid_app_path() {
358337
// Change the app path so it doesn't match.
359-
let uri = "pubky://operrr8wsbpr3ue9d4qj41ge1kcc6r7fdiy6o3ugjrrhi4y77rdo/pub/other.app/profile.json";
338+
let uri = format!("pubky://{USER_ID}/pub/other.app/profile.json");
360339
let result = ParsedUri::try_from(uri);
361340
assert!(result.is_err());
362341
}

0 commit comments

Comments
 (0)