From b4d06b7705d3a5cc44bc67dfabc2a2f2fd5886b7 Mon Sep 17 00:00:00 2001 From: Felix Ableitner Date: Thu, 21 Oct 2021 12:25:27 +0200 Subject: [PATCH] Add tests for ToApub, private message, remove update script --- Cargo.lock | 11 ++++++ config/config.hjson | 2 +- crates/apub/Cargo.toml | 1 + crates/apub/assets/lemmy-community.json | 4 +-- crates/apub/assets/lemmy-private-message.json | 32 +++++++++++++++++ crates/apub/src/objects/comment.rs | 4 +++ crates/apub/src/objects/community.rs | 14 ++++++-- crates/apub/src/objects/person.rs | 7 +++- crates/apub/src/objects/post.rs | 5 ++- crates/apub/src/objects/private_message.rs | 36 +++++++++++++++++++ scripts/update_apub_test_files.sh | 24 ------------- 11 files changed, 109 insertions(+), 31 deletions(-) create mode 100644 crates/apub/assets/lemmy-private-message.json delete mode 100755 scripts/update_apub_test_files.sh diff --git a/Cargo.lock b/Cargo.lock index ac7e21db7..ba4e73851 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -315,6 +315,16 @@ version = "0.5.2" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "23b62fc65de8e4e7f52534fb52b0f3ed04746ae267519eef2a83941e8085068b" +[[package]] +name = "assert-json-diff" +version = "2.0.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "50f1c3703dd33532d7f0ca049168930e9099ecac238e23cf932f3a69c42f06da" +dependencies = [ + "serde", + "serde_json", +] + [[package]] name = "async-mutex" version = "1.4.0" @@ -1811,6 +1821,7 @@ dependencies = [ "actix-rt", "actix-web", "anyhow", + "assert-json-diff", "async-trait", "awc", "background-jobs", diff --git a/config/config.hjson b/config/config.hjson index 361c06bef..7c73aaafa 100644 --- a/config/config.hjson +++ b/config/config.hjson @@ -1,7 +1,7 @@ # See the documentation for available config fields and descriptions: # https://join-lemmy.org/docs/en/administration/configuration.html { - hostname: lemmy-alphan + hostname: lemmy-alpha federation: { enabled: true } diff --git a/crates/apub/Cargo.toml b/crates/apub/Cargo.toml index 10033c4c0..260bed1c4 100644 --- a/crates/apub/Cargo.toml +++ b/crates/apub/Cargo.toml @@ -53,3 +53,4 @@ html2md = "0.2.13" [dev-dependencies] serial_test = "0.5.1" +assert-json-diff = "2.0.1" \ No newline at end of file diff --git a/crates/apub/assets/lemmy-community.json b/crates/apub/assets/lemmy-community.json index 8b00d9a4c..e0f3c6809 100644 --- a/crates/apub/assets/lemmy-community.json +++ b/crates/apub/assets/lemmy-community.json @@ -30,9 +30,9 @@ "id": "https://lemmy.ml/c/announcements", "inbox": "https://lemmy.ml/c/announcements/inbox", "mediaType": "text/html", - "moderators": "https://lemmy.ml/c/announcements/not_moderators", + "moderators": "https://lemmy.ml/c/announcements/moderators", "name": "Announcements", - "outbox": "https://lemmy.ml/c/announcements/not_outbox", + "outbox": "https://lemmy.ml/c/announcements/outbox", "preferredUsername": "announcements", "publicKey": { "id": "https://lemmy.ml/c/announcements#main-key", diff --git a/crates/apub/assets/lemmy-private-message.json b/crates/apub/assets/lemmy-private-message.json new file mode 100644 index 000000000..981cf25d1 --- /dev/null +++ b/crates/apub/assets/lemmy-private-message.json @@ -0,0 +1,32 @@ +{ + "@context": [ + "https://www.w3.org/ns/activitystreams", + { + "comments_enabled": { + "id": "pt:commentsEnabled", + "type": "sc:Boolean" + }, + "matrixUserId": { + "id": "as:alsoKnownAs", + "type": "sc:Text" + }, + "moderators": "as:moderators", + "pt": "https://join-lemmy.org#", + "sc": "http://schema.org#", + "sensitive": "as:sensitive", + "stickied": "as:stickied" + }, + "https://w3id.org/security/v1" + ], + "attributedTo": "https://lemmy.ml/u/nutomic", + "content": "test", + "id": "https://lemmy.ml/private_message/1621", + "mediaType": "text/html", + "published": "2021-10-21T10:13:14.597721+00:00", + "source": { + "content": "test", + "mediaType": "text/markdown" + }, + "to": "https://queer.hacktivis.me/users/lanodan", + "type": "Note" +} \ No newline at end of file diff --git a/crates/apub/src/objects/comment.rs b/crates/apub/src/objects/comment.rs index 72d477d10..68eb1cb27 100644 --- a/crates/apub/src/objects/comment.rs +++ b/crates/apub/src/objects/comment.rs @@ -316,6 +316,7 @@ mod tests { community::ApubCommunity, tests::{file_to_json_object, init_context}, }; + use assert_json_diff::assert_json_include; use serial_test::serial; async fn prepare_comment_test(url: &Url, context: &LemmyContext) { @@ -350,6 +351,9 @@ mod tests { assert_eq!(comment.content.len(), 1063); assert!(!comment.local); assert_eq!(request_counter, 0); + + let to_apub = comment.to_apub(context.pool()).await.unwrap(); + assert_json_include!(actual: json, expected: to_apub); } #[actix_rt::test] diff --git a/crates/apub/src/objects/community.rs b/crates/apub/src/objects/community.rs index 5b929379e..e70a3f906 100644 --- a/crates/apub/src/objects/community.rs +++ b/crates/apub/src/objects/community.rs @@ -318,15 +318,22 @@ impl CommunityType for Community { mod tests { use super::*; use crate::objects::tests::{file_to_json_object, init_context}; + use assert_json_diff::assert_json_include; use serial_test::serial; #[actix_rt::test] #[serial] async fn test_fetch_lemmy_community() { - let json = file_to_json_object("assets/lemmy-community.json"); + let context = init_context(); + let mut json: Group = file_to_json_object("assets/lemmy-community.json"); + let json_orig = json.clone(); + // change these links so they dont fetch over the network + json.moderators = Some(Url::parse("https://lemmy.ml/c/announcements/not_moderators").unwrap()); + json.outbox = Url::parse("https://lemmy.ml/c/announcements/not_outbox").unwrap(); + let url = Url::parse("https://lemmy.ml/c/announcements").unwrap(); let mut request_counter = 0; - let community = ApubCommunity::from_apub(&json, &init_context(), &url, &mut request_counter) + let community = ApubCommunity::from_apub(&json, &context, &url, &mut request_counter) .await .unwrap(); @@ -337,5 +344,8 @@ mod tests { assert_eq!(community.description.as_ref().unwrap().len(), 126); // this makes two requests to the (intentionally) broken outbox/moderators collections assert_eq!(request_counter, 2); + + let to_apub = community.to_apub(context.pool()).await.unwrap(); + assert_json_include!(actual: json_orig, expected: to_apub); } } diff --git a/crates/apub/src/objects/person.rs b/crates/apub/src/objects/person.rs index 431de761e..7f7c340c7 100644 --- a/crates/apub/src/objects/person.rs +++ b/crates/apub/src/objects/person.rs @@ -271,15 +271,17 @@ impl FromApub for ApubPerson { mod tests { use super::*; use crate::objects::tests::{file_to_json_object, init_context}; + use assert_json_diff::assert_json_include; use serial_test::serial; #[actix_rt::test] #[serial] async fn test_fetch_lemmy_person() { + let context = init_context(); let json = file_to_json_object("assets/lemmy-person.json"); let url = Url::parse("https://lemmy.ml/u/nutomic").unwrap(); let mut request_counter = 0; - let person = ApubPerson::from_apub(&json, &init_context(), &url, &mut request_counter) + let person = ApubPerson::from_apub(&json, &context, &url, &mut request_counter) .await .unwrap(); @@ -289,6 +291,9 @@ mod tests { assert!(!person.local); assert!(person.bio.is_some()); assert_eq!(request_counter, 0); + + let to_apub = person.to_apub(context.pool()).await.unwrap(); + assert_json_include!(actual: json, expected: to_apub); } #[actix_rt::test] diff --git a/crates/apub/src/objects/post.rs b/crates/apub/src/objects/post.rs index 92114e2c8..47d4859fb 100644 --- a/crates/apub/src/objects/post.rs +++ b/crates/apub/src/objects/post.rs @@ -285,6 +285,7 @@ mod tests { community::ApubCommunity, tests::{file_to_json_object, init_context}, }; + use assert_json_diff::assert_json_include; use serial_test::serial; #[actix_rt::test] @@ -312,7 +313,9 @@ mod tests { assert_eq!(post.body.as_ref().unwrap().len(), 2144); assert!(!post.locked); assert!(post.stickied); - // see comment in test_fetch_lemmy_community() about this assert_eq!(request_counter, 0); + + let to_apub = post.to_apub(context.pool()).await.unwrap(); + assert_json_include!(actual: json, expected: to_apub); } } diff --git a/crates/apub/src/objects/private_message.rs b/crates/apub/src/objects/private_message.rs index ee6aff74d..41e940b03 100644 --- a/crates/apub/src/objects/private_message.rs +++ b/crates/apub/src/objects/private_message.rs @@ -199,3 +199,39 @@ impl FromApub for ApubPrivateMessage { Ok(pm.into()) } } + +#[cfg(test)] +mod tests { + use super::*; + use crate::objects::tests::{file_to_json_object, init_context}; + 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://lemmy.ml/private_message/1621").unwrap(); + let lemmy_person = file_to_json_object("assets/lemmy-person.json"); + 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(); + ApubPerson::from_apub(&pleroma_person, &context, &pleroma_url, &mut 0) + .await + .unwrap(); + 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) + .await + .unwrap(); + + assert_eq!(pm.ap_id.clone().into_inner(), url); + assert_eq!(pm.content.len(), 4); + assert_eq!(request_counter, 0); + + let to_apub = pm.to_apub(context.pool()).await.unwrap(); + assert_json_include!(actual: json, expected: to_apub); + } +} diff --git a/scripts/update_apub_test_files.sh b/scripts/update_apub_test_files.sh deleted file mode 100755 index 799176f42..000000000 --- a/scripts/update_apub_test_files.sh +++ /dev/null @@ -1,24 +0,0 @@ -#!/bin/bash -set -e - -curl -H "Accept: application/activity+json" https://lemmy.ml/u/nutomic | jq -S \ - > crates/apub/assets/lemmy-person.json -curl -H "Accept: application/activity+json" https://lemmy.ml/c/announcements | jq -S \ - > crates/apub/assets/lemmy-community.json -# replace these collection links so that tests dont make any actual http requests -sed -i 's/https:\/\/lemmy.ml\/c\/announcements\/outbox/https:\/\/lemmy.ml\/c\/announcements\/not_outbox/g' crates/apub/assets/lemmy-community.json -sed -i 's/https:\/\/lemmy.ml\/c\/announcements\/moderators/https:\/\/lemmy.ml\/c\/announcements\/not_moderators/g' crates/apub/assets/lemmy-community.json -curl -H "Accept: application/activity+json" https://lemmy.ml/post/55143 | jq -S \ - > crates/apub/assets/lemmy-post.json -curl -H "Accept: application/activity+json" https://lemmy.ml/comment/38741 | jq -S \ - > crates/apub/assets/lemmy-comment.json -# replace attributed_to user, so that it takes the same one from above -sed -i 's/https:\/\/lemmy.ml\/u\/my_test/https:\/\/lemmy.ml\/u\/nutomic/g' crates/apub/assets/lemmy-comment.json - -curl -H "Accept: application/activity+json" https://queer.hacktivis.me/users/lanodan | jq -S \ - > crates/apub/assets/pleroma-person.json -curl -H "Accept: application/activity+json" https://queer.hacktivis.me/objects/8d4973f4-53de-49cd-8c27-df160e16a9c2 | jq -S \ - > crates/apub/assets/pleroma-comment.json -# rewrite comment inReplyTo so that it refers to our post above (cause lemmy doesnt support standalone comments) -sed -i 's/https:\/\/pleroma.popolon.org\/objects\/bf84a0fb-2ec2-4dff-a1d9-6b573f94fb16/https:\/\/lemmy.ml\/post\/55143/g' crates/apub/assets/pleroma-comment.json -