From b462fa9aacf1813e121bf6b6e5bf0326b1686e72 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Fri, 22 Oct 2021 14:44:21 +0200 Subject: [PATCH] Also add test case for parsing pleroma private message --- crates/apub/assets/lemmy-private-message.json | 2 +- .../apub/assets/pleroma-private-message.json | 17 +++++ crates/apub/src/objects/comment.rs | 4 +- crates/apub/src/objects/community.rs | 2 +- crates/apub/src/objects/person.rs | 4 +- crates/apub/src/objects/post.rs | 2 +- crates/apub/src/objects/private_message.rs | 66 ++++++++++++++----- 7 files changed, 75 insertions(+), 22 deletions(-) create mode 100644 crates/apub/assets/pleroma-private-message.json diff --git a/crates/apub/assets/lemmy-private-message.json b/crates/apub/assets/lemmy-private-message.json index 0bcc5167a..374754215 100644 --- a/crates/apub/assets/lemmy-private-message.json +++ b/crates/apub/assets/lemmy-private-message.json @@ -31,4 +31,4 @@ "mediaType": "text/markdown" }, "published": "2021-10-21T10:13:14.597721+00:00" -} \ No newline at end of file +} diff --git a/crates/apub/assets/pleroma-private-message.json b/crates/apub/assets/pleroma-private-message.json new file mode 100644 index 000000000..e4b987d70 --- /dev/null +++ b/crates/apub/assets/pleroma-private-message.json @@ -0,0 +1,17 @@ +{ + "@context": [ + "https://www.w3.org/ns/activitystreams", + "https://queer.hacktivis.me/schemas/litepub-0.1.jsonld", + { + "@language": "und" + } + ], + "attributedTo": "https://queer.hacktivis.me/users/lanodan", + "content": "Hi!", + "id": "https://queer.hacktivis.me/objects/2", + "published": "2020-02-12T14:08:20Z", + "to": [ + "https://enterprise.lemmy.ml/u/picard" + ], + "type": "ChatMessage" +} diff --git a/crates/apub/src/objects/comment.rs b/crates/apub/src/objects/comment.rs index cf960958b..5fe4fa690 100644 --- a/crates/apub/src/objects/comment.rs +++ b/crates/apub/src/objects/comment.rs @@ -323,7 +323,7 @@ mod tests { #[actix_rt::test] #[serial] - async fn test_fetch_lemmy_comment() { + async fn test_parse_lemmy_comment() { let context = init_context(); let url = Url::parse("https://enterprise.lemmy.ml/comment/38741").unwrap(); let data = prepare_comment_test(&url, &context).await; @@ -348,7 +348,7 @@ mod tests { #[actix_rt::test] #[serial] - async fn test_fetch_pleroma_comment() { + async fn test_parse_pleroma_comment() { let context = init_context(); let url = Url::parse("https://enterprise.lemmy.ml/comment/38741").unwrap(); let data = prepare_comment_test(&url, &context).await; diff --git a/crates/apub/src/objects/community.rs b/crates/apub/src/objects/community.rs index 11a8ca3e7..74d417c39 100644 --- a/crates/apub/src/objects/community.rs +++ b/crates/apub/src/objects/community.rs @@ -322,7 +322,7 @@ mod tests { #[actix_rt::test] #[serial] - async fn test_fetch_lemmy_community() { + async fn test_parse_lemmy_community() { let context = init_context(); let mut json: Group = file_to_json_object("assets/lemmy-community.json"); let json_orig = json.clone(); diff --git a/crates/apub/src/objects/person.rs b/crates/apub/src/objects/person.rs index daf603362..99847562f 100644 --- a/crates/apub/src/objects/person.rs +++ b/crates/apub/src/objects/person.rs @@ -275,7 +275,7 @@ mod tests { #[actix_rt::test] #[serial] - async fn test_fetch_lemmy_person() { + async fn test_parse_lemmy_person() { let context = init_context(); let json = file_to_json_object("assets/lemmy-person.json"); let url = Url::parse("https://enterprise.lemmy.ml/u/picard").unwrap(); @@ -299,7 +299,7 @@ mod tests { #[actix_rt::test] #[serial] - async fn test_fetch_pleroma_person() { + async fn test_parse_pleroma_person() { let context = init_context(); let json = file_to_json_object("assets/pleroma-person.json"); let url = Url::parse("https://queer.hacktivis.me/users/lanodan").unwrap(); diff --git a/crates/apub/src/objects/post.rs b/crates/apub/src/objects/post.rs index 00e8601af..a56bbd590 100644 --- a/crates/apub/src/objects/post.rs +++ b/crates/apub/src/objects/post.rs @@ -290,7 +290,7 @@ mod tests { #[actix_rt::test] #[serial] - async fn test_fetch_lemmy_post() { + async fn test_parse_lemmy_post() { let context = init_context(); let url = Url::parse("https://enterprise.lemmy.ml/post/55143").unwrap(); let community_json = file_to_json_object("assets/lemmy-community.json"); diff --git a/crates/apub/src/objects/private_message.rs b/crates/apub/src/objects/private_message.rs index 43d54ed83..bd9cc1da4 100644 --- a/crates/apub/src/objects/private_message.rs +++ b/crates/apub/src/objects/private_message.rs @@ -12,6 +12,7 @@ use activitystreams::{ }; use anyhow::anyhow; use chrono::{DateTime, FixedOffset}; +use html2md::parse_html; use lemmy_api_common::blocking; use lemmy_apub_lib::{ traits::{ApubObject, FromApub, ToApub}, @@ -44,8 +45,8 @@ pub struct Note { pub(crate) attributed_to: ObjectId, to: [ObjectId; 1], content: String, - media_type: MediaTypeHtml, - source: Source, + media_type: Option, + source: Option, published: Option>, updated: Option>, #[serde(flatten)] @@ -147,11 +148,11 @@ impl ToApub for ApubPrivateMessage { attributed_to: ObjectId::new(creator.actor_id), to: [ObjectId::new(recipient.actor_id)], content: self.content.clone(), - media_type: MediaTypeHtml::Html, - source: Source { + media_type: Some(MediaTypeHtml::Html), + source: Some(Source { content: self.content.clone(), media_type: MediaTypeMarkdown::Markdown, - }, + }), published: Some(convert_datetime(self.published)), updated: self.updated.map(convert_datetime), unparsed: Default::default(), @@ -186,11 +187,16 @@ impl FromApub for ApubPrivateMessage { .dereference(context, request_counter) .await?; let recipient = note.to[0].dereference(context, request_counter).await?; + let content = if let Some(source) = ¬e.source { + source.content.clone() + } else { + parse_html(¬e.content) + }; let form = PrivateMessageForm { creator_id: creator.id, recipient_id: recipient.id, - content: note.source.content.clone(), + content, published: note.published.map(|u| u.to_owned().naive_local()), updated: note.updated.map(|u| u.to_owned().naive_local()), deleted: None, @@ -213,20 +219,30 @@ mod tests { use assert_json_diff::assert_json_include; use serial_test::serial; - #[actix_rt::test] - #[serial] - async fn test_fetch_lemmy_pm() { - let context = init_context(); - let url = Url::parse("https://enterprise.lemmy.ml/private_message/1621").unwrap(); + async fn prepare_comment_test(url: &Url, context: &LemmyContext) -> (ApubPerson, ApubPerson) { let lemmy_person = file_to_json_object("assets/lemmy-person.json"); - let person1 = ApubPerson::from_apub(&lemmy_person, &context, &url, &mut 0) + let person1 = ApubPerson::from_apub(&lemmy_person, context, url, &mut 0) .await .unwrap(); let pleroma_person = file_to_json_object("assets/pleroma-person.json"); let pleroma_url = Url::parse("https://queer.hacktivis.me/users/lanodan").unwrap(); - let person2 = ApubPerson::from_apub(&pleroma_person, &context, &pleroma_url, &mut 0) + let person2 = ApubPerson::from_apub(&pleroma_person, context, &pleroma_url, &mut 0) .await .unwrap(); + (person1, person2) + } + + fn cleanup(data: (ApubPerson, ApubPerson), context: &LemmyContext) { + Person::delete(&*context.pool().get().unwrap(), data.0.id).unwrap(); + Person::delete(&*context.pool().get().unwrap(), data.1.id).unwrap(); + } + + #[actix_rt::test] + #[serial] + async fn test_parse_lemmy_pm() { + let context = init_context(); + let url = Url::parse("https://enterprise.lemmy.ml/private_message/1621").unwrap(); + let data = prepare_comment_test(&url, &context).await; let json = file_to_json_object("assets/lemmy-private-message.json"); let mut request_counter = 0; let pm = ApubPrivateMessage::from_apub(&json, &context, &url, &mut request_counter) @@ -241,7 +257,27 @@ mod tests { assert_json_include!(actual: json, expected: to_apub); PrivateMessage::delete(&*context.pool().get().unwrap(), pm.id).unwrap(); - Person::delete(&*context.pool().get().unwrap(), person1.id).unwrap(); - Person::delete(&*context.pool().get().unwrap(), person2.id).unwrap(); + cleanup(data, &context); + } + + #[actix_rt::test] + #[serial] + async fn test_parse_pleroma_pm() { + let context = init_context(); + let url = Url::parse("https://enterprise.lemmy.ml/private_message/1621").unwrap(); + let data = prepare_comment_test(&url, &context).await; + let pleroma_url = Url::parse("https://queer.hacktivis.me/objects/2").unwrap(); + let json = file_to_json_object("assets/pleroma-private-message.json"); + let mut request_counter = 0; + let pm = ApubPrivateMessage::from_apub(&json, &context, &pleroma_url, &mut request_counter) + .await + .unwrap(); + + assert_eq!(pm.ap_id.clone().into_inner(), pleroma_url); + assert_eq!(pm.content.len(), 3); + assert_eq!(request_counter, 0); + + PrivateMessage::delete(&*context.pool().get().unwrap(), pm.id).unwrap(); + cleanup(data, &context); } }