Skip to main content

max / makenotwork

2.8 KB · 78 lines History Blame Raw
1 //! Validators for subscription tiers and payment-related fields.
2
3 use crate::constants;
4 use crate::error::AppError;
5 use super::limits;
6
7 /// Validate a subscription tier name
8 pub fn validate_tier_name(name: &str) -> Result<(), AppError> {
9 if name.is_empty() {
10 return Err(AppError::validation("Tier name is required".to_string()));
11 }
12 if name.chars().count() > limits::TIER_NAME_MAX {
13 return Err(AppError::validation(format!(
14 "Tier name must be {} characters or less",
15 limits::TIER_NAME_MAX
16 )));
17 }
18 Ok(())
19 }
20
21 /// Validate a subscription tier description
22 pub fn validate_tier_description(description: &str) -> Result<(), AppError> {
23 if description.chars().count() > limits::TIER_DESCRIPTION_MAX {
24 return Err(AppError::validation(format!(
25 "Tier description must be {} characters or less",
26 limits::TIER_DESCRIPTION_MAX
27 )));
28 }
29 Ok(())
30 }
31
32 /// Validate a subscription tier price in cents (must be at least $1.00)
33 pub fn validate_tier_price(price_cents: i32) -> Result<(), AppError> {
34 if price_cents < crate::constants::MIN_SUBSCRIPTION_PRICE_CENTS {
35 return Err(AppError::validation(format!(
36 "Subscription price must be at least ${:.2}",
37 crate::constants::MIN_SUBSCRIPTION_PRICE_CENTS as f64 / 100.0
38 )));
39 }
40 if price_cents > constants::MAX_PRICE_CENTS {
41 return Err(AppError::validation("Subscription price cannot exceed $10,000".to_string()));
42 }
43 Ok(())
44 }
45
46 #[cfg(test)]
47 mod tests {
48 use super::*;
49
50 #[test]
51 fn test_validate_tier_name() {
52 assert!(validate_tier_name("Basic Tier").is_ok());
53 assert!(validate_tier_name("X").is_ok());
54 assert!(validate_tier_name("").is_err()); // empty
55 assert!(validate_tier_name(&"a".repeat(100)).is_ok()); // at limit
56 assert!(validate_tier_name(&"a".repeat(101)).is_err()); // over limit
57 }
58
59 #[test]
60 fn test_validate_tier_description() {
61 assert!(validate_tier_description("Access to all content").is_ok());
62 assert!(validate_tier_description("").is_ok()); // empty is valid
63 assert!(validate_tier_description(&"a".repeat(2000)).is_ok()); // at limit
64 assert!(validate_tier_description(&"a".repeat(2001)).is_err()); // over limit
65 }
66
67 #[test]
68 fn test_validate_tier_price() {
69 assert!(validate_tier_price(100).is_ok()); // $1.00 minimum
70 assert!(validate_tier_price(999).is_ok());
71 assert!(validate_tier_price(1_000_000).is_ok()); // $10,000
72 assert!(validate_tier_price(99).is_err()); // below minimum
73 assert!(validate_tier_price(0).is_err()); // zero
74 assert!(validate_tier_price(-1).is_err()); // negative
75 assert!(validate_tier_price(1_000_001).is_err()); // over cap
76 }
77 }
78