slack_messaging/blocks/elements/multi_select_menus/
users.rs1use crate::composition_objects::{ConfirmationDialog, Plain, Text};
2use crate::validators::*;
3
4use serde::Serialize;
5use slack_messaging_derive::Builder;
6
7#[derive(Debug, Default, Clone, Serialize, PartialEq, Builder)]
65#[serde(tag = "type", rename = "multi_users_select")]
66pub struct MultiSelectMenuUsers {
67 #[serde(skip_serializing_if = "Option::is_none")]
68 #[builder(validate("text::max_255"))]
69 pub(crate) action_id: Option<String>,
70
71 #[serde(skip_serializing_if = "Option::is_none")]
72 #[builder(push_item = "initial_user")]
73 pub(crate) initial_users: Option<Vec<String>>,
74
75 #[serde(skip_serializing_if = "Option::is_none")]
76 pub(crate) confirm: Option<ConfirmationDialog>,
77
78 #[serde(skip_serializing_if = "Option::is_none")]
79 #[builder(validate("integer::min_1"))]
80 pub(crate) max_selected_items: Option<i64>,
81
82 #[serde(skip_serializing_if = "Option::is_none")]
83 pub(crate) focus_on_load: Option<bool>,
84
85 #[serde(skip_serializing_if = "Option::is_none")]
86 #[builder(validate("text_object::max_150"))]
87 pub(crate) placeholder: Option<Text<Plain>>,
88}
89
90#[cfg(test)]
91mod tests {
92 use super::*;
93 use crate::composition_objects::test_helpers::*;
94 use crate::errors::*;
95
96 #[test]
97 fn it_implements_builder() {
98 let expected = MultiSelectMenuUsers {
99 action_id: Some("multi_select_0".into()),
100 initial_users: Some(vec!["USER0".into(), "USER1".into()]),
101 confirm: Some(confirm()),
102 max_selected_items: Some(2),
103 focus_on_load: Some(true),
104 placeholder: Some(plain_text("Select users")),
105 };
106
107 let val = MultiSelectMenuUsers::builder()
108 .set_action_id(Some("multi_select_0"))
109 .set_initial_users(Some(vec!["USER0".into(), "USER1".into()]))
110 .set_confirm(Some(confirm()))
111 .set_max_selected_items(Some(2))
112 .set_focus_on_load(Some(true))
113 .set_placeholder(Some(plain_text("Select users")))
114 .build()
115 .unwrap();
116
117 assert_eq!(val, expected);
118
119 let val = MultiSelectMenuUsers::builder()
120 .action_id("multi_select_0")
121 .initial_users(vec!["USER0".into(), "USER1".into()])
122 .confirm(confirm())
123 .max_selected_items(2)
124 .focus_on_load(true)
125 .placeholder(plain_text("Select users"))
126 .build()
127 .unwrap();
128
129 assert_eq!(val, expected);
130 }
131
132 #[test]
133 fn it_implements_push_item_method() {
134 let expected = MultiSelectMenuUsers {
135 action_id: None,
136 initial_users: Some(vec!["USER0".into(), "USER1".into()]),
137 confirm: None,
138 max_selected_items: None,
139 focus_on_load: None,
140 placeholder: None,
141 };
142
143 let val = MultiSelectMenuUsers::builder()
144 .initial_user("USER0")
145 .initial_user("USER1")
146 .build()
147 .unwrap();
148
149 assert_eq!(val, expected);
150 }
151
152 #[test]
153 fn it_requires_action_id_less_than_255_characters_long() {
154 let err = MultiSelectMenuUsers::builder()
155 .action_id("a".repeat(256))
156 .build()
157 .unwrap_err();
158 assert_eq!(err.object(), "MultiSelectMenuUsers");
159
160 let errors = err.field("action_id");
161 assert!(errors.includes(ValidationErrorKind::MaxTextLength(255)));
162 }
163
164 #[test]
165 fn it_requires_max_selected_items_greater_than_1() {
166 let err = MultiSelectMenuUsers::builder()
167 .max_selected_items(0)
168 .build()
169 .unwrap_err();
170 assert_eq!(err.object(), "MultiSelectMenuUsers");
171
172 let errors = err.field("max_selected_items");
173 assert!(errors.includes(ValidationErrorKind::MinIntegerValue(1)));
174 }
175
176 #[test]
177 fn it_requires_placeholder_text_less_than_150_characters_long() {
178 let err = MultiSelectMenuUsers::builder()
179 .placeholder(plain_text("a".repeat(151)))
180 .build()
181 .unwrap_err();
182 assert_eq!(err.object(), "MultiSelectMenuUsers");
183
184 let errors = err.field("placeholder");
185 assert!(errors.includes(ValidationErrorKind::MaxTextLength(150)));
186 }
187}