+ let post_listing_french = PostQuery {
+ sort: (Some(SortType::New)),
+ local_user: (Some(&data.inserted_local_user)),
+ ..Default::default()
+ }
+ .list(pool)
+ .await
+ .unwrap();
+
+ // only one post in french and one undetermined should be returned
+ assert_eq!(2, post_listing_french.len());
+ assert!(post_listing_french
+ .iter()
+ .any(|p| p.post.language_id == french_id));
+
+ LocalUserLanguage::update(
+ pool,
+ vec![french_id, UNDETERMINED_ID],
+ data.inserted_local_user.id,
+ )
+ .await
+ .unwrap();
+ let post_listings_french_und = PostQuery {
+ sort: (Some(SortType::New)),
+ local_user: (Some(&data.inserted_local_user)),
+ ..Default::default()
+ }
+ .list(pool)
+ .await
+ .unwrap();
+
+ // french post and undetermined language post should be returned
+ assert_eq!(2, post_listings_french_und.len());
+ assert_eq!(
+ UNDETERMINED_ID,
+ post_listings_french_und[0].post.language_id
+ );
+ assert_eq!(french_id, post_listings_french_und[1].post.language_id);
+
+ cleanup(data, pool).await;
+ }
+
+ #[tokio::test]
+ #[serial]
+ async fn post_listings_deleted() {
+ let pool = &build_db_pool_for_tests().await;
+ let pool = &mut pool.into();
+ let data = init_data(pool).await;
+
+ // Delete the post
+ Post::update(
+ pool,
+ data.inserted_post.id,
+ &PostUpdateForm::builder().deleted(Some(true)).build(),
+ )
+ .await
+ .unwrap();
+
+ // Make sure you don't see the deleted post in the results
+ let post_listings_no_admin = PostQuery {
+ sort: (Some(SortType::New)),
+ local_user: (Some(&data.inserted_local_user)),
+ is_mod_or_admin: (Some(false)),
+ ..Default::default()
+ }
+ .list(pool)
+ .await
+ .unwrap();
+
+ assert_eq!(1, post_listings_no_admin.len());
+
+ // Make sure they see both
+ let post_listings_is_admin = PostQuery {
+ sort: (Some(SortType::New)),
+ local_user: (Some(&data.inserted_local_user)),
+ is_mod_or_admin: (Some(true)),
+ ..Default::default()
+ }
+ .list(pool)
+ .await
+ .unwrap();
+
+ assert_eq!(2, post_listings_is_admin.len());
+
+ cleanup(data, pool).await;
+ }
+
+ async fn cleanup(data: Data, pool: &mut DbPool<'_>) {
+ let num_deleted = Post::delete(pool, data.inserted_post.id).await.unwrap();
+ Community::delete(pool, data.inserted_community.id)
+ .await
+ .unwrap();
+ Person::delete(pool, data.inserted_person.id).await.unwrap();
+ Person::delete(pool, data.inserted_bot.id).await.unwrap();
+ Person::delete(pool, data.inserted_blocked_person.id)
+ .await
+ .unwrap();
+ Instance::delete(pool, data.inserted_instance.id)
+ .await
+ .unwrap();
+ assert_eq!(1, num_deleted);
+ }
+
+ async fn expected_post_view(data: &Data, pool: &mut DbPool<'_>) -> PostView {
+ let (inserted_person, inserted_community, inserted_post) = (
+ &data.inserted_person,
+ &data.inserted_community,
+ &data.inserted_post,
+ );
+ let agg = PostAggregates::read(pool, inserted_post.id).await.unwrap();
+
+ PostView {