]> Untitled Git - lemmy.git/blob - crates/api_crud/src/site/mod.rs
Cache & Optimize Woodpecker CI (#3450)
[lemmy.git] / crates / api_crud / src / site / mod.rs
1 use lemmy_db_schema::{ListingType, RegistrationMode};
2 use lemmy_utils::error::{LemmyErrorType, LemmyResult};
3
4 mod create;
5 mod read;
6 mod update;
7
8 /// Checks whether the default post listing type is valid for a site.
9 pub fn site_default_post_listing_type_check(
10   default_post_listing_type: &Option<ListingType>,
11 ) -> LemmyResult<()> {
12   if let Some(listing_type) = default_post_listing_type {
13     // Only allow all or local as default listing types...
14     if listing_type != &ListingType::All && listing_type != &ListingType::Local {
15       Err(LemmyErrorType::InvalidDefaultPostListingType)?
16     } else {
17       Ok(())
18     }
19   } else {
20     Ok(())
21   }
22 }
23
24 /// Checks whether the application question and registration mode align.
25 pub fn application_question_check(
26   current_application_question: &Option<String>,
27   new_application_question: &Option<String>,
28   registration_mode: RegistrationMode,
29 ) -> LemmyResult<()> {
30   let has_no_question: bool =
31     current_application_question.is_none() && new_application_question.is_none();
32   let is_nullifying_question: bool = new_application_question == &Some(String::new());
33
34   if registration_mode == RegistrationMode::RequireApplication
35     && (has_no_question || is_nullifying_question)
36   {
37     Err(LemmyErrorType::ApplicationQuestionRequired)?
38   } else {
39     Ok(())
40   }
41 }
42
43 #[cfg(test)]
44 mod tests {
45   #![allow(clippy::unwrap_used)]
46   #![allow(clippy::indexing_slicing)]
47
48   use crate::site::{application_question_check, site_default_post_listing_type_check};
49   use lemmy_db_schema::{ListingType, RegistrationMode};
50
51   #[test]
52   fn test_site_default_post_listing_type_check() {
53     assert!(site_default_post_listing_type_check(&None::<ListingType>).is_ok());
54     assert!(site_default_post_listing_type_check(&Some(ListingType::All)).is_ok());
55     assert!(site_default_post_listing_type_check(&Some(ListingType::Local)).is_ok());
56     assert!(site_default_post_listing_type_check(&Some(ListingType::Subscribed)).is_err());
57   }
58
59   #[test]
60   fn test_application_question_check() {
61     assert!(
62       application_question_check(&Some(String::from("q")), &Some(String::new()), RegistrationMode::RequireApplication).is_err(),
63       "Expected application to be invalid because an application is required, current question: {:?}, new question: {:?}",
64       "q",
65       String::new(),
66     );
67     assert!(
68       application_question_check(&None, &None, RegistrationMode::RequireApplication).is_err(),
69       "Expected application to be invalid because an application is required, current question: {:?}, new question: {:?}",
70       None::<String>,
71       None::<String>
72     );
73
74     assert!(
75       application_question_check(&None, &None, RegistrationMode::Open).is_ok(),
76       "Expected application to be valid because no application required, current question: {:?}, new question: {:?}, mode: {:?}",
77       None::<String>,
78       None::<String>,
79       RegistrationMode::Open
80     );
81     assert!(
82       application_question_check(&None, &Some(String::from("q")), RegistrationMode::RequireApplication).is_ok(),
83       "Expected application to be valid because new application provided, current question: {:?}, new question: {:?}, mode: {:?}",
84       None::<String>,
85       Some(String::from("q")),
86       RegistrationMode::RequireApplication
87     );
88     assert!(
89       application_question_check(&Some(String::from("q")), &None, RegistrationMode::RequireApplication).is_ok(),
90       "Expected application to be valid because application existed, current question: {:?}, new question: {:?}, mode: {:?}",
91       Some(String::from("q")),
92       None::<String>,
93       RegistrationMode::RequireApplication
94     );
95   }
96 }