slack_messaging/blocks/data_visualization/charts/
pie_chart.rs1use super::Segment;
2
3use crate::validators::*;
4
5use serde::Serialize;
6use slack_messaging_derive::Builder;
7
8#[derive(Debug, Clone, Serialize, PartialEq, Builder)]
56#[serde(tag = "type", rename = "pie")]
57pub struct PieChart {
58 #[builder(push_item = "segment", validate("required", "list::not_empty", "list::max_item_6"))]
59 pub(crate) segments: Option<Vec<Segment>>,
60}
61
62#[cfg(test)]
63mod tests {
64 use super::*;
65 use super::super::segments;
66 use crate::errors::*;
67
68 #[test]
69 fn it_implements_builder() {
70 let expected = PieChart {
71 segments: Some(segments(vec![
72 ("Segment 1", 10),
73 ("Segment 2", 20),
74 ]).unwrap()),
75 };
76
77 let val = PieChart::builder()
78 .set_segments(Some(segments(vec![
79 ("Segment 1", 10),
80 ("Segment 2", 20),
81 ]).unwrap()))
82 .build()
83 .unwrap();
84
85 assert_eq!(val, expected);
86
87 let val = PieChart::builder()
88 .segments(segments(vec![
89 ("Segment 1", 10),
90 ("Segment 2", 20),
91 ]).unwrap())
92 .build()
93 .unwrap();
94
95 assert_eq!(val, expected);
96 }
97
98 #[test]
99 fn it_implements_push_item_method() {
100 let expected = PieChart {
101 segments: Some(segments(vec![
102 ("Segment 1", 10),
103 ("Segment 2", 20),
104 ]).unwrap()),
105 };
106
107 let val = PieChart::builder()
108 .segment(
109 Segment::builder()
110 .label("Segment 1")
111 .value(10)
112 .build()
113 .unwrap(),
114 )
115 .segment(
116 Segment::builder()
117 .label("Segment 2")
118 .value(20)
119 .build()
120 .unwrap(),
121 )
122 .build()
123 .unwrap();
124
125 assert_eq!(val, expected);
126 }
127
128 #[test]
129 fn it_requires_segments_field() {
130 let err = PieChart::builder().build().unwrap_err();
131 assert_eq!(err.object(), "PieChart");
132
133 let errors = err.field("segments");
134 assert!(errors.includes(ValidationErrorKind::Required));
135 }
136
137 #[test]
138 fn it_requires_segments_list_size_more_than_0() {
139 let err = PieChart::builder()
140 .segments(vec![] as Vec<Segment>)
141 .build()
142 .unwrap_err();
143 assert_eq!(err.object(), "PieChart");
144
145 let errors = err.field("segments");
146 assert!(errors.includes(ValidationErrorKind::EmptyArray));
147 }
148
149 #[test]
150 fn it_requires_segments_list_size_less_than_6() {
151 let segs = segments(vec![
152 ("Segment 1", 10),
153 ("Segment 2", 20),
154 ("Segment 3", 30),
155 ("Segment 4", 40),
156 ("Segment 5", 50),
157 ("Segment 6", 60),
158 ("Segment 7", 70),
159 ]).unwrap();
160 let err = PieChart::builder()
161 .segments(segs)
162 .build()
163 .unwrap_err();
164 assert_eq!(err.object(), "PieChart");
165
166 let errors = err.field("segments");
167 assert!(errors.includes(ValidationErrorKind::MaxArraySize(6)));
168 }
169}