From d3435a1f4b28c148c4cdb94a4fdec79da03bb800 Mon Sep 17 00:00:00 2001 From: Brandon Thomas Date: Tue, 28 Dec 2021 02:09:19 -0500 Subject: [PATCH] fix tests on list categories, split filtering of deleted/unapproved --- .../list_categories_query_builder.rs | 99 +++++++++++++------ 1 file changed, 70 insertions(+), 29 deletions(-) diff --git a/crates/app/storyteller_web/src/database/query_builders/list_categories_query_builder.rs b/crates/app/storyteller_web/src/database/query_builders/list_categories_query_builder.rs index 3948c6d17c..ebf79ecc22 100644 --- a/crates/app/storyteller_web/src/database/query_builders/list_categories_query_builder.rs +++ b/crates/app/storyteller_web/src/database/query_builders/list_categories_query_builder.rs @@ -49,10 +49,14 @@ pub struct Category { /// These are very difficult queries, so the builder helps for /// testability, construction, and correctness. pub struct ListCategoriesQueryBuilder { - // The public lists won't include unapproved/deleted, but mod - // views will want to see both. + // The public lists won't include unapproved, but mod views + // will want to see them. show_unapproved: bool, + // The public lists won't include deleted models, but mod views + // will want to see them. + show_deleted: bool, + // Useful for showing categories a user themselves has suggested // We don't want users spamming creation. scope_creator_user_token: Option, @@ -65,7 +69,8 @@ pub struct ListCategoriesQueryBuilder { impl ListCategoriesQueryBuilder { pub fn new() -> Self { Self { - show_unapproved: true, + show_unapproved: false, + show_deleted: false, scope_creator_user_token: None, scope_model_type: None, } @@ -76,6 +81,11 @@ impl ListCategoriesQueryBuilder { self } + pub fn show_deleted(mut self, show_deleted: bool) -> Self { + self.show_deleted = show_deleted; + self + } + pub fn scope_creator_user_token(mut self, scope_creator_user_token: Option<&str>) -> Self { self.scope_creator_user_token = scope_creator_user_token.map(|u| u.to_string()); self @@ -217,10 +227,17 @@ LEFT OUTER JOIN users if !self.show_unapproved { if !first_predicate_added { query.push_str(" WHERE model_categories.is_mod_approved IS TRUE"); - query.push_str(" AND model_categories.deleted_at IS NOT NULL"); first_predicate_added = true; } else { query.push_str(" AND model_categories.is_mod_approved IS TRUE"); + } + } + + if !self.show_deleted { + if !first_predicate_added { + query.push_str(" WHERE model_categories.deleted_at IS NOT NULL"); + first_predicate_added = true; + } else { query.push_str(" AND model_categories.deleted_at IS NOT NULL"); } } @@ -262,10 +279,12 @@ mod tests { use crate::database::query_builders::list_categories_query_builder::ListCategoriesQueryBuilder; #[test] - fn predicates_without_scoping() { + fn predicates_default_scoping() { let query_builder = ListCategoriesQueryBuilder::new(); - assert_eq!(&query_builder.build_predicates(), ""); + assert_eq!(&query_builder.build_predicates(), + " WHERE model_categories.is_mod_approved IS TRUE \ + AND model_categories.deleted_at IS NOT NULL"); } #[test] @@ -274,29 +293,51 @@ mod tests { .scope_creator_user_token(Some("U:ASDF")); assert_eq!(&query_builder.build_predicates(), - " WHERE model_categories.creator_user_token = ?"); + " WHERE model_categories.creator_user_token = ? \ + AND model_categories.is_mod_approved IS TRUE \ + AND model_categories.deleted_at IS NOT NULL"); } -// #[test] -// fn predicates_including_user_hidden() { -// let query_builder = ListCategoriesQueryBuilder::new() -// .include_user_hidden(true); -// -// assert_eq!(&query_builder.build_predicates(), -// " WHERE tts_results.user_deleted_at IS NULL \ -// AND tts_results.mod_deleted_at IS NULL \ -// ORDER BY tts_results.id DESC \ -// LIMIT ?"); -// } -// -// #[test] -// fn predicates_including_deleted() { -// let query_builder = ListCategoriesQueryBuilder::new() -// .include_mod_disabled_results(true); -// -// assert_eq!(&query_builder.build_predicates(), -// " WHERE tts_results.creator_set_visibility = 'public' \ -// ORDER BY tts_results.id DESC \ -// LIMIT ?"); -// } + #[test] + fn predicates_scoped_to_model_type() { + let query_builder = ListCategoriesQueryBuilder::new() + .scope_model_type(Some("foo")); + + assert_eq!(&query_builder.build_predicates(), + " WHERE model_categories.model_type = ? \ + AND model_categories.is_mod_approved IS TRUE \ + AND model_categories.deleted_at IS NOT NULL"); + } + + #[test] + fn predicates_scoped_to_unapproved() { + let query_builder = ListCategoriesQueryBuilder::new() + .show_unapproved(false); + + assert_eq!(&query_builder.build_predicates(), + " WHERE model_categories.is_mod_approved IS TRUE \ + AND model_categories.deleted_at IS NOT NULL"); + + let query_builder = ListCategoriesQueryBuilder::new() + .show_unapproved(true); + + assert_eq!(&query_builder.build_predicates(), + " WHERE model_categories.deleted_at IS NOT NULL"); + } + + #[test] + fn predicates_scoped_to_deleted() { + let query_builder = ListCategoriesQueryBuilder::new() + .show_deleted(false); + + assert_eq!(&query_builder.build_predicates(), + " WHERE model_categories.is_mod_approved IS TRUE \ + AND model_categories.deleted_at IS NOT NULL"); + + let query_builder = ListCategoriesQueryBuilder::new() + .show_deleted(true); + + assert_eq!(&query_builder.build_predicates(), + " WHERE model_categories.is_mod_approved IS TRUE"); + } }