Adding tests for post aggregates.

This commit is contained in:
Dessalines 2020-12-11 13:07:27 -05:00
parent 35bf50ab15
commit bdd264cd5e
2 changed files with 194 additions and 221 deletions

View file

@ -22,247 +22,214 @@ impl PostAggregates {
} }
} }
// #[cfg(test)] #[cfg(test)]
// mod tests { mod tests {
// use crate::{ use crate::{
// aggregates::community_aggregates::CommunityAggregates, aggregates::post_aggregates::PostAggregates,
// comment::{Comment, CommentForm}, comment::{Comment, CommentForm},
// community::{Community, CommunityFollower, CommunityFollowerForm, CommunityForm}, community::{Community, CommunityForm},
// post::{Post, PostForm}, post::{Post, PostForm, PostLike, PostLikeForm},
// tests::establish_unpooled_connection, tests::establish_unpooled_connection,
// user::{UserForm, User_}, user::{UserForm, User_},
// Crud, Crud,
// Followable, Likeable,
// ListingType, ListingType,
// SortType, SortType,
// }; };
// #[test] #[test]
// fn test_crud() { fn test_crud() {
// let conn = establish_unpooled_connection(); let conn = establish_unpooled_connection();
// let new_user = UserForm { let new_user = UserForm {
// name: "thommy_community_agg".into(), name: "thommy_community_agg".into(),
// preferred_username: None, preferred_username: None,
// password_encrypted: "nope".into(), password_encrypted: "nope".into(),
// email: None, email: None,
// matrix_user_id: None, matrix_user_id: None,
// avatar: None, avatar: None,
// banner: None, banner: None,
// admin: false, admin: false,
// banned: Some(false), banned: Some(false),
// published: None, published: None,
// updated: None, updated: None,
// show_nsfw: false, show_nsfw: false,
// theme: "browser".into(), theme: "browser".into(),
// default_sort_type: SortType::Hot as i16, default_sort_type: SortType::Hot as i16,
// default_listing_type: ListingType::Subscribed as i16, default_listing_type: ListingType::Subscribed as i16,
// lang: "browser".into(), lang: "browser".into(),
// show_avatars: true, show_avatars: true,
// send_notifications_to_email: false, send_notifications_to_email: false,
// actor_id: None, actor_id: None,
// bio: None, bio: None,
// local: true, local: true,
// private_key: None, private_key: None,
// public_key: None, public_key: None,
// last_refreshed_at: None, last_refreshed_at: None,
// }; };
// let inserted_user = User_::create(&conn, &new_user).unwrap(); let inserted_user = User_::create(&conn, &new_user).unwrap();
// let another_user = UserForm { let another_user = UserForm {
// name: "jerry_community_agg".into(), name: "jerry_community_agg".into(),
// preferred_username: None, preferred_username: None,
// password_encrypted: "nope".into(), password_encrypted: "nope".into(),
// email: None, email: None,
// matrix_user_id: None, matrix_user_id: None,
// avatar: None, avatar: None,
// banner: None, banner: None,
// admin: false, admin: false,
// banned: Some(false), banned: Some(false),
// published: None, published: None,
// updated: None, updated: None,
// show_nsfw: false, show_nsfw: false,
// theme: "browser".into(), theme: "browser".into(),
// default_sort_type: SortType::Hot as i16, default_sort_type: SortType::Hot as i16,
// default_listing_type: ListingType::Subscribed as i16, default_listing_type: ListingType::Subscribed as i16,
// lang: "browser".into(), lang: "browser".into(),
// show_avatars: true, show_avatars: true,
// send_notifications_to_email: false, send_notifications_to_email: false,
// actor_id: None, actor_id: None,
// bio: None, bio: None,
// local: true, local: true,
// private_key: None, private_key: None,
// public_key: None, public_key: None,
// last_refreshed_at: None, last_refreshed_at: None,
// }; };
// let another_inserted_user = User_::create(&conn, &another_user).unwrap(); let another_inserted_user = User_::create(&conn, &another_user).unwrap();
// let new_community = CommunityForm { let new_community = CommunityForm {
// name: "TIL_community_agg".into(), name: "TIL_community_agg".into(),
// creator_id: inserted_user.id, creator_id: inserted_user.id,
// title: "nada".to_owned(), title: "nada".to_owned(),
// description: None, description: None,
// category_id: 1, category_id: 1,
// nsfw: false, nsfw: false,
// removed: None, removed: None,
// deleted: None, deleted: None,
// updated: None, updated: None,
// actor_id: None, actor_id: None,
// local: true, local: true,
// private_key: None, private_key: None,
// public_key: None, public_key: None,
// last_refreshed_at: None, last_refreshed_at: None,
// published: None, published: None,
// icon: None, icon: None,
// banner: None, banner: None,
// }; };
// let inserted_community = Community::create(&conn, &new_community).unwrap(); let inserted_community = Community::create(&conn, &new_community).unwrap();
// let another_community = CommunityForm { let new_post = PostForm {
// name: "TIL_community_agg_2".into(), name: "A test post".into(),
// creator_id: inserted_user.id, url: None,
// title: "nada".to_owned(), body: None,
// description: None, creator_id: inserted_user.id,
// category_id: 1, community_id: inserted_community.id,
// nsfw: false, removed: None,
// removed: None, deleted: None,
// deleted: None, locked: None,
// updated: None, stickied: None,
// actor_id: None, nsfw: false,
// local: true, updated: None,
// private_key: None, embed_title: None,
// public_key: None, embed_description: None,
// last_refreshed_at: None, embed_html: None,
// published: None, thumbnail_url: None,
// icon: None, ap_id: None,
// banner: None, local: true,
// }; published: None,
};
// let another_inserted_community = Community::create(&conn, &another_community).unwrap(); let inserted_post = Post::create(&conn, &new_post).unwrap();
// let first_user_follow = CommunityFollowerForm { let comment_form = CommentForm {
// community_id: inserted_community.id, content: "A test comment".into(),
// user_id: inserted_user.id, creator_id: inserted_user.id,
// pending: false, post_id: inserted_post.id,
// }; removed: None,
deleted: None,
read: None,
parent_id: None,
published: None,
updated: None,
ap_id: None,
local: true,
};
// CommunityFollower::follow(&conn, &first_user_follow).unwrap(); let inserted_comment = Comment::create(&conn, &comment_form).unwrap();
// let second_user_follow = CommunityFollowerForm { let child_comment_form = CommentForm {
// community_id: inserted_community.id, content: "A test comment".into(),
// user_id: another_inserted_user.id, creator_id: inserted_user.id,
// pending: false, 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,
};
// CommunityFollower::follow(&conn, &second_user_follow).unwrap(); let _inserted_child_comment = Comment::create(&conn, &child_comment_form).unwrap();
// let another_community_follow = CommunityFollowerForm { let post_like = PostLikeForm {
// community_id: another_inserted_community.id, post_id: inserted_post.id,
// user_id: inserted_user.id, user_id: inserted_user.id,
// pending: false, score: 1,
// }; };
// CommunityFollower::follow(&conn, &another_community_follow).unwrap(); PostLike::like(&conn, &post_like).unwrap();
// let new_post = PostForm { let post_aggs_before_delete = PostAggregates::read(&conn, inserted_post.id).unwrap();
// 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(); 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);
// let comment_form = CommentForm { // Add a post dislike from the other user
// content: "A test comment".into(), let post_dislike = PostLikeForm {
// creator_id: inserted_user.id, post_id: inserted_post.id,
// post_id: inserted_post.id, user_id: another_inserted_user.id,
// removed: None, score: -1,
// 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(); PostLike::like(&conn, &post_dislike).unwrap();
// let child_comment_form = CommentForm { let post_aggs_after_dislike = PostAggregates::read(&conn, inserted_post.id).unwrap();
// 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(); 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);
// let community_aggregates_before_delete = // Remove the parent comment
// CommunityAggregates::read(&conn, inserted_community.id).unwrap(); 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);
// assert_eq!(2, community_aggregates_before_delete.subscribers); // Remove the first post like
// assert_eq!(1, community_aggregates_before_delete.posts); PostLike::remove(&conn, inserted_user.id, inserted_post.id).unwrap();
// assert_eq!(2, community_aggregates_before_delete.comments); 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);
// // Test the other community // This should delete all the associated rows, and fire triggers
// let another_community_aggs = User_::delete(&conn, another_inserted_user.id).unwrap();
// CommunityAggregates::read(&conn, another_inserted_community.id).unwrap(); let user_num_deleted = User_::delete(&conn, inserted_user.id).unwrap();
// assert_eq!(1, another_community_aggs.subscribers); assert_eq!(1, user_num_deleted);
// assert_eq!(0, another_community_aggs.posts);
// assert_eq!(0, another_community_aggs.comments);
// // Unfollow test // Should be none found, since the creator was deleted
// CommunityFollower::unfollow(&conn, &second_user_follow).unwrap(); let after_delete = PostAggregates::read(&conn, inserted_post.id);
// let after_unfollow = CommunityAggregates::read(&conn, inserted_community.id).unwrap(); assert!(after_delete.is_err());
// 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());
// }
// }

View file

@ -66,9 +66,12 @@ begin
newest_comment_time = NEW.published newest_comment_time = NEW.published
where pa.post_id = NEW.post_id; where pa.post_id = NEW.post_id;
ELSIF (TG_OP = 'DELETE') THEN ELSIF (TG_OP = 'DELETE') THEN
-- Join to post because that post may not exist anymore
update post_aggregates pa update post_aggregates pa
set comments = comments - 1 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; END IF;
return null; return null;
end $$; end $$;
@ -91,11 +94,14 @@ begin
where pa.post_id = NEW.post_id; where pa.post_id = NEW.post_id;
ELSIF (TG_OP = 'DELETE') THEN ELSIF (TG_OP = 'DELETE') THEN
-- Join to post because that post may not exist anymore
update post_aggregates pa update post_aggregates pa
set score = score - OLD.score, set score = score - OLD.score,
upvotes = case when OLD.score = 1 then upvotes - 1 else upvotes end, upvotes = case when OLD.score = 1 then upvotes - 1 else upvotes end,
downvotes = case when OLD.score = -1 then downvotes - 1 else downvotes 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; END IF;
return null; return null;