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)]
// 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,
// };
#[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();
#[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 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 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_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 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 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 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 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 another_inserted_community = Community::create(&conn, &another_community).unwrap();
let inserted_post = Post::create(&conn, &new_post).unwrap();
// let first_user_follow = CommunityFollowerForm {
// community_id: inserted_community.id,
// user_id: inserted_user.id,
// pending: false,
// };
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,
};
// CommunityFollower::follow(&conn, &first_user_follow).unwrap();
let inserted_comment = Comment::create(&conn, &comment_form).unwrap();
// let second_user_follow = CommunityFollowerForm {
// community_id: inserted_community.id,
// user_id: another_inserted_user.id,
// pending: false,
// };
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,
};
// CommunityFollower::follow(&conn, &second_user_follow).unwrap();
let _inserted_child_comment = Comment::create(&conn, &child_comment_form).unwrap();
// let another_community_follow = CommunityFollowerForm {
// community_id: another_inserted_community.id,
// user_id: inserted_user.id,
// pending: false,
// };
let post_like = PostLikeForm {
post_id: inserted_post.id,
user_id: inserted_user.id,
score: 1,
};
// CommunityFollower::follow(&conn, &another_community_follow).unwrap();
PostLike::like(&conn, &post_like).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 post_aggs_before_delete = PostAggregates::read(&conn, inserted_post.id).unwrap();
// 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 {
// 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,
// };
// 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,
};
// let inserted_comment = Comment::create(&conn, &comment_form).unwrap();
PostLike::like(&conn, &post_dislike).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 post_aggs_after_dislike = PostAggregates::read(&conn, inserted_post.id).unwrap();
// 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 =
// CommunityAggregates::read(&conn, inserted_community.id).unwrap();
// 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);
// assert_eq!(2, community_aggregates_before_delete.subscribers);
// assert_eq!(1, community_aggregates_before_delete.posts);
// assert_eq!(2, community_aggregates_before_delete.comments);
// 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);
// // 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);
// 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);
// // 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());
// }
// }
// Should be none found, since the creator was deleted
let after_delete = PostAggregates::read(&conn, inserted_post.id);
assert!(after_delete.is_err());
}
}

View file

@ -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;