fix tests on list categories, split filtering of deleted/unapproved

This commit is contained in:
Brandon Thomas committed 2021-12-28 02:09:19 -05:00
1 parent 48394fe5f8
commit d3435a1f4b
1 file changed
+70 -29
@@ -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<String>,
@@ -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");
}
}