From bdd264cd5e999f6898869e3749c4e2b334af7eb4 Mon Sep 17 00:00:00 2001 From: Dessalines Date: Fri, 11 Dec 2020 13:07:27 -0500 Subject: [PATCH] Adding tests for post aggregates. --- lemmy_db/src/aggregates/post_aggregates.rs | 455 ++++++++---------- .../up.sql | 10 +- 2 files changed, 219 insertions(+), 246 deletions(-) diff --git a/lemmy_db/src/aggregates/post_aggregates.rs b/lemmy_db/src/aggregates/post_aggregates.rs index e009cacb..07db37ef 100644 --- a/lemmy_db/src/aggregates/post_aggregates.rs +++ b/lemmy_db/src/aggregates/post_aggregates.rs @@ -22,247 +22,214 @@ impl PostAggregates { } } -// #[cfg(test)] -// mod tests { -// use crate::{ -// aggregates::community_aggregates::CommunityAggregates, -// comment::{Comment, CommentForm}, -// community::{Community, CommunityFollower, CommunityFollowerForm, CommunityForm}, -// post::{Post, PostForm}, -// tests::establish_unpooled_connection, -// user::{UserForm, User_}, -// Crud, -// Followable, -// ListingType, -// SortType, -// }; - -// #[test] -// fn test_crud() { -// let conn = establish_unpooled_connection(); - -// let new_user = UserForm { -// name: "thommy_community_agg".into(), -// preferred_username: None, -// password_encrypted: "nope".into(), -// email: None, -// matrix_user_id: None, -// avatar: None, -// banner: None, -// admin: false, -// banned: Some(false), -// published: None, -// updated: None, -// show_nsfw: false, -// theme: "browser".into(), -// default_sort_type: SortType::Hot as i16, -// default_listing_type: ListingType::Subscribed as i16, -// lang: "browser".into(), -// show_avatars: true, -// send_notifications_to_email: false, -// actor_id: None, -// bio: None, -// local: true, -// private_key: None, -// public_key: None, -// last_refreshed_at: None, -// }; - -// let inserted_user = User_::create(&conn, &new_user).unwrap(); - -// let another_user = UserForm { -// name: "jerry_community_agg".into(), -// preferred_username: None, -// password_encrypted: "nope".into(), -// email: None, -// matrix_user_id: None, -// avatar: None, -// banner: None, -// admin: false, -// banned: Some(false), -// published: None, -// updated: None, -// show_nsfw: false, -// theme: "browser".into(), -// default_sort_type: SortType::Hot as i16, -// default_listing_type: ListingType::Subscribed as i16, -// lang: "browser".into(), -// show_avatars: true, -// send_notifications_to_email: false, -// actor_id: None, -// bio: None, -// local: true, -// private_key: None, -// public_key: None, -// last_refreshed_at: None, -// }; - -// let another_inserted_user = User_::create(&conn, &another_user).unwrap(); - -// let new_community = CommunityForm { -// name: "TIL_community_agg".into(), -// creator_id: inserted_user.id, -// title: "nada".to_owned(), -// description: None, -// category_id: 1, -// nsfw: false, -// removed: None, -// deleted: None, -// updated: None, -// actor_id: None, -// local: true, -// private_key: None, -// public_key: None, -// last_refreshed_at: None, -// published: None, -// icon: None, -// banner: None, -// }; - -// let inserted_community = Community::create(&conn, &new_community).unwrap(); - -// let another_community = CommunityForm { -// name: "TIL_community_agg_2".into(), -// creator_id: inserted_user.id, -// title: "nada".to_owned(), -// description: None, -// category_id: 1, -// nsfw: false, -// removed: None, -// deleted: None, -// updated: None, -// actor_id: None, -// local: true, -// private_key: None, -// public_key: None, -// last_refreshed_at: None, -// published: None, -// icon: None, -// banner: None, -// }; - -// let another_inserted_community = Community::create(&conn, &another_community).unwrap(); - -// let first_user_follow = CommunityFollowerForm { -// community_id: inserted_community.id, -// user_id: inserted_user.id, -// pending: false, -// }; - -// CommunityFollower::follow(&conn, &first_user_follow).unwrap(); - -// let second_user_follow = CommunityFollowerForm { -// community_id: inserted_community.id, -// user_id: another_inserted_user.id, -// pending: false, -// }; - -// CommunityFollower::follow(&conn, &second_user_follow).unwrap(); - -// let another_community_follow = CommunityFollowerForm { -// community_id: another_inserted_community.id, -// user_id: inserted_user.id, -// pending: false, -// }; - -// CommunityFollower::follow(&conn, &another_community_follow).unwrap(); - -// let new_post = PostForm { -// name: "A test post".into(), -// url: None, -// body: None, -// creator_id: inserted_user.id, -// community_id: inserted_community.id, -// removed: None, -// deleted: None, -// locked: None, -// stickied: None, -// nsfw: false, -// updated: None, -// embed_title: None, -// embed_description: None, -// embed_html: None, -// thumbnail_url: None, -// ap_id: None, -// local: true, -// published: None, -// }; - -// let inserted_post = Post::create(&conn, &new_post).unwrap(); - -// let comment_form = CommentForm { -// content: "A test comment".into(), -// creator_id: inserted_user.id, -// post_id: inserted_post.id, -// removed: None, -// deleted: None, -// read: None, -// parent_id: None, -// published: None, -// updated: None, -// ap_id: None, -// local: true, -// }; - -// let inserted_comment = Comment::create(&conn, &comment_form).unwrap(); - -// let child_comment_form = CommentForm { -// content: "A test comment".into(), -// creator_id: inserted_user.id, -// post_id: inserted_post.id, -// removed: None, -// deleted: None, -// read: None, -// parent_id: Some(inserted_comment.id), -// published: None, -// updated: None, -// ap_id: None, -// local: true, -// }; - -// let _inserted_child_comment = Comment::create(&conn, &child_comment_form).unwrap(); - -// let community_aggregates_before_delete = -// CommunityAggregates::read(&conn, inserted_community.id).unwrap(); - -// assert_eq!(2, community_aggregates_before_delete.subscribers); -// assert_eq!(1, community_aggregates_before_delete.posts); -// assert_eq!(2, community_aggregates_before_delete.comments); - -// // Test the other community -// let another_community_aggs = -// CommunityAggregates::read(&conn, another_inserted_community.id).unwrap(); -// assert_eq!(1, another_community_aggs.subscribers); -// assert_eq!(0, another_community_aggs.posts); -// assert_eq!(0, another_community_aggs.comments); - -// // Unfollow test -// CommunityFollower::unfollow(&conn, &second_user_follow).unwrap(); -// let after_unfollow = CommunityAggregates::read(&conn, inserted_community.id).unwrap(); -// assert_eq!(1, after_unfollow.subscribers); - -// // Follow again just for the later tests -// CommunityFollower::follow(&conn, &second_user_follow).unwrap(); -// let after_follow_again = CommunityAggregates::read(&conn, inserted_community.id).unwrap(); -// assert_eq!(2, after_follow_again.subscribers); - -// // Remove a parent comment (the comment count should also be 0) -// Post::delete(&conn, inserted_post.id).unwrap(); -// let after_parent_post_delete = CommunityAggregates::read(&conn, inserted_community.id).unwrap(); -// assert_eq!(0, after_parent_post_delete.comments); -// assert_eq!(0, after_parent_post_delete.posts); - -// // Remove the 2nd user -// User_::delete(&conn, another_inserted_user.id).unwrap(); -// let after_user_delete = CommunityAggregates::read(&conn, inserted_community.id).unwrap(); -// assert_eq!(1, after_user_delete.subscribers); - -// // This should delete all the associated rows, and fire triggers -// let user_num_deleted = User_::delete(&conn, inserted_user.id).unwrap(); -// assert_eq!(1, user_num_deleted); - -// // Should be none found, since the creator was deleted -// let after_delete = CommunityAggregates::read(&conn, inserted_community.id); -// assert!(after_delete.is_err()); -// } -// } +#[cfg(test)] +mod tests { + use crate::{ + aggregates::post_aggregates::PostAggregates, + comment::{Comment, CommentForm}, + community::{Community, CommunityForm}, + post::{Post, PostForm, PostLike, PostLikeForm}, + tests::establish_unpooled_connection, + user::{UserForm, User_}, + Crud, + Likeable, + ListingType, + SortType, + }; + + #[test] + fn test_crud() { + let conn = establish_unpooled_connection(); + + let new_user = UserForm { + name: "thommy_community_agg".into(), + preferred_username: None, + password_encrypted: "nope".into(), + email: None, + matrix_user_id: None, + avatar: None, + banner: None, + admin: false, + banned: Some(false), + published: None, + updated: None, + show_nsfw: false, + theme: "browser".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, + lang: "browser".into(), + show_avatars: true, + send_notifications_to_email: false, + actor_id: None, + bio: None, + local: true, + private_key: None, + public_key: None, + last_refreshed_at: None, + }; + + let inserted_user = User_::create(&conn, &new_user).unwrap(); + + let another_user = UserForm { + name: "jerry_community_agg".into(), + preferred_username: None, + password_encrypted: "nope".into(), + email: None, + matrix_user_id: None, + avatar: None, + banner: None, + admin: false, + banned: Some(false), + published: None, + updated: None, + show_nsfw: false, + theme: "browser".into(), + default_sort_type: SortType::Hot as i16, + default_listing_type: ListingType::Subscribed as i16, + lang: "browser".into(), + show_avatars: true, + send_notifications_to_email: false, + actor_id: None, + bio: None, + local: true, + private_key: None, + public_key: None, + last_refreshed_at: None, + }; + + let another_inserted_user = User_::create(&conn, &another_user).unwrap(); + + let new_community = CommunityForm { + name: "TIL_community_agg".into(), + creator_id: inserted_user.id, + title: "nada".to_owned(), + description: None, + category_id: 1, + nsfw: false, + removed: None, + deleted: None, + updated: None, + actor_id: None, + local: true, + private_key: None, + public_key: None, + last_refreshed_at: None, + published: None, + icon: None, + banner: None, + }; + + let inserted_community = Community::create(&conn, &new_community).unwrap(); + + let new_post = PostForm { + name: "A test post".into(), + url: None, + body: None, + creator_id: inserted_user.id, + community_id: inserted_community.id, + removed: None, + deleted: None, + locked: None, + stickied: None, + nsfw: false, + updated: None, + embed_title: None, + embed_description: None, + embed_html: None, + thumbnail_url: None, + ap_id: None, + local: true, + published: None, + }; + + let inserted_post = Post::create(&conn, &new_post).unwrap(); + + let comment_form = CommentForm { + content: "A test comment".into(), + creator_id: inserted_user.id, + post_id: inserted_post.id, + removed: None, + deleted: None, + read: None, + parent_id: None, + published: None, + updated: None, + ap_id: None, + local: true, + }; + + let inserted_comment = Comment::create(&conn, &comment_form).unwrap(); + + let child_comment_form = CommentForm { + content: "A test comment".into(), + creator_id: inserted_user.id, + post_id: inserted_post.id, + removed: None, + deleted: None, + read: None, + parent_id: Some(inserted_comment.id), + published: None, + updated: None, + ap_id: None, + local: true, + }; + + let _inserted_child_comment = Comment::create(&conn, &child_comment_form).unwrap(); + + let post_like = PostLikeForm { + post_id: inserted_post.id, + user_id: inserted_user.id, + score: 1, + }; + + PostLike::like(&conn, &post_like).unwrap(); + + let post_aggs_before_delete = PostAggregates::read(&conn, inserted_post.id).unwrap(); + + assert_eq!(2, post_aggs_before_delete.comments); + assert_eq!(1, post_aggs_before_delete.score); + assert_eq!(1, post_aggs_before_delete.upvotes); + assert_eq!(0, post_aggs_before_delete.downvotes); + + // Add a post dislike from the other user + let post_dislike = PostLikeForm { + post_id: inserted_post.id, + user_id: another_inserted_user.id, + score: -1, + }; + + PostLike::like(&conn, &post_dislike).unwrap(); + + let post_aggs_after_dislike = PostAggregates::read(&conn, inserted_post.id).unwrap(); + + assert_eq!(2, post_aggs_after_dislike.comments); + assert_eq!(0, post_aggs_after_dislike.score); + assert_eq!(1, post_aggs_after_dislike.upvotes); + assert_eq!(1, post_aggs_after_dislike.downvotes); + + // Remove the parent comment + Comment::delete(&conn, inserted_comment.id).unwrap(); + let after_comment_delete = PostAggregates::read(&conn, inserted_post.id).unwrap(); + assert_eq!(0, after_comment_delete.comments); + assert_eq!(0, after_comment_delete.score); + assert_eq!(1, after_comment_delete.upvotes); + assert_eq!(1, after_comment_delete.downvotes); + + // Remove the first post like + PostLike::remove(&conn, inserted_user.id, inserted_post.id).unwrap(); + let after_like_remove = PostAggregates::read(&conn, inserted_post.id).unwrap(); + assert_eq!(0, after_like_remove.comments); + assert_eq!(-1, after_like_remove.score); + assert_eq!(0, after_like_remove.upvotes); + assert_eq!(1, after_like_remove.downvotes); + + // This should delete all the associated rows, and fire triggers + User_::delete(&conn, another_inserted_user.id).unwrap(); + let user_num_deleted = User_::delete(&conn, inserted_user.id).unwrap(); + assert_eq!(1, user_num_deleted); + + // Should be none found, since the creator was deleted + let after_delete = PostAggregates::read(&conn, inserted_post.id); + assert!(after_delete.is_err()); + } +} diff --git a/migrations/2020-12-10-152350_create_post_aggregates/up.sql b/migrations/2020-12-10-152350_create_post_aggregates/up.sql index f9321beb..b3dc6278 100644 --- a/migrations/2020-12-10-152350_create_post_aggregates/up.sql +++ b/migrations/2020-12-10-152350_create_post_aggregates/up.sql @@ -66,9 +66,12 @@ begin newest_comment_time = NEW.published where pa.post_id = NEW.post_id; ELSIF (TG_OP = 'DELETE') THEN + -- Join to post because that post may not exist anymore update post_aggregates pa set comments = comments - 1 - where pa.post_id = OLD.post_id; + from post p + where pa.post_id = p.id + and pa.post_id = OLD.post_id; END IF; return null; end $$; @@ -91,11 +94,14 @@ begin where pa.post_id = NEW.post_id; ELSIF (TG_OP = 'DELETE') THEN + -- Join to post because that post may not exist anymore update post_aggregates pa set score = score - OLD.score, upvotes = case when OLD.score = 1 then upvotes - 1 else upvotes end, downvotes = case when OLD.score = -1 then downvotes - 1 else downvotes end - where pa.post_id = OLD.post_id; + from post p + where pa.post_id = p.id + and pa.post_id = OLD.post_id; END IF; return null; -- 2.44.1