mirror of
https://github.com/LemmyNet/lemmy.git
synced 2024-11-16 09:24:00 +00:00
269 lines
8.4 KiB
Rust
269 lines
8.4 KiB
Rust
|
use crate::schema::post_aggregates;
|
||
|
use diesel::{result::Error, *};
|
||
|
use serde::Serialize;
|
||
|
|
||
|
#[derive(Queryable, Associations, Identifiable, PartialEq, Debug, Serialize, Clone)]
|
||
|
#[table_name = "post_aggregates"]
|
||
|
pub struct PostAggregates {
|
||
|
pub id: i32,
|
||
|
pub post_id: i32,
|
||
|
pub comments: i64,
|
||
|
pub score: i64,
|
||
|
pub upvotes: i64,
|
||
|
pub downvotes: i64,
|
||
|
pub newest_comment_time: chrono::NaiveDateTime,
|
||
|
}
|
||
|
|
||
|
impl PostAggregates {
|
||
|
pub fn read(conn: &PgConnection, post_id: i32) -> Result<Self, Error> {
|
||
|
post_aggregates::table
|
||
|
.filter(post_aggregates::post_id.eq(post_id))
|
||
|
.first::<Self>(conn)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
// #[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());
|
||
|
// }
|
||
|
// }
|