1use crate::channel::message::MessagePin;
2use serde::{Deserialize, Serialize};
3
4#[derive(Clone, Debug, Deserialize, PartialEq, Serialize)]
8pub struct PinsListing {
9 pub items: Vec<MessagePin>,
11 pub has_more: bool,
13}
14
15#[cfg(test)]
16mod tests {
17 use crate::channel::Message;
18 use crate::channel::message::sticker::StickerFormatType;
19 use crate::channel::message::{
20 MessageCall, MessageFlags, MessagePin, MessageSticker, MessageType, PinsListing,
21 };
22 use crate::guild::{MemberFlags, PartialMember};
23 use crate::id::Id;
24 use crate::test::image_hash;
25 use crate::user::User;
26 use crate::util::Timestamp;
27 use serde_test::Token;
28 use std::str::FromStr;
29
30 #[test]
31 #[allow(clippy::too_many_lines, deprecated)]
32 fn pins_listing() {
33 let joined_at = Some(Timestamp::from_str("2020-01-01T00:00:00.000000+00:00").unwrap());
34 let timestamp = Timestamp::from_micros(1_580_608_922_020_000).expect("non zero");
35 let flags = MemberFlags::BYPASSES_VERIFICATION | MemberFlags::DID_REJOIN;
36
37 let msg_value = Message {
38 activity: None,
39 application: None,
40 application_id: None,
41 attachments: Vec::new(),
42 author: User {
43 accent_color: None,
44 avatar: Some(image_hash::AVATAR),
45 avatar_decoration: None,
46 avatar_decoration_data: None,
47 banner: None,
48 bot: false,
49 discriminator: 1,
50 email: None,
51 flags: None,
52 global_name: Some("test".to_owned()),
53 id: Id::new(3),
54 locale: None,
55 mfa_enabled: None,
56 name: "test".to_owned(),
57 premium_type: None,
58 primary_guild: None,
59 public_flags: None,
60 system: None,
61 verified: None,
62 },
63 call: Some(MessageCall {
64 ended_timestamp: None,
65 participants: Vec::new(),
66 }),
67 channel_id: Id::new(2),
68 components: Vec::new(),
69 content: "ping".to_owned(),
70 edited_timestamp: None,
71 embeds: Vec::new(),
72 flags: Some(MessageFlags::empty()),
73 guild_id: Some(Id::new(1)),
74 id: Id::new(4),
75 interaction: None,
76 kind: MessageType::Regular,
77 member: Some(PartialMember {
78 avatar: None,
79 avatar_decoration_data: None,
80 banner: None,
81 communication_disabled_until: None,
82 deaf: false,
83 flags,
84 joined_at,
85 mute: false,
86 nick: Some("member nick".to_owned()),
87 permissions: None,
88 premium_since: None,
89 roles: Vec::new(),
90 user: None,
91 }),
92 mention_channels: Vec::new(),
93 mention_everyone: false,
94 mention_roles: Vec::new(),
95 mentions: Vec::new(),
96 message_snapshots: Vec::new(),
97 pinned: false,
98 poll: None,
99 reactions: Vec::new(),
100 reference: None,
101 role_subscription_data: None,
102 sticker_items: vec![MessageSticker {
103 format_type: StickerFormatType::Png,
104 id: Id::new(1),
105 name: "sticker name".to_owned(),
106 }],
107 referenced_message: None,
108 timestamp,
109 thread: None,
110 tts: false,
111 webhook_id: None,
112 interaction_metadata: None,
113 };
114
115 let msg_pin = MessagePin {
116 pinned_at: Timestamp::from_secs(1).unwrap(),
117 message: msg_value,
118 };
119
120 let value = PinsListing {
121 items: vec![msg_pin],
122 has_more: true,
123 };
124
125 serde_test::assert_tokens(
126 &value,
127 &[
128 Token::Struct {
129 name: "PinsListing",
130 len: 2,
131 },
132 Token::Str("items"),
133 Token::Seq { len: Some(1) },
134 Token::Struct {
135 name: "MessagePin",
136 len: 2,
137 },
138 Token::Str("pinned_at"),
139 Token::Str("1970-01-01T00:00:01.000000+00:00"),
140 Token::Str("message"),
141 Token::Struct {
142 name: "Message",
143 len: 19,
144 },
145 Token::Str("attachments"),
146 Token::Seq { len: Some(0) },
147 Token::SeqEnd,
148 Token::Str("author"),
149 Token::Struct {
150 name: "User",
151 len: 10,
152 },
153 Token::Str("accent_color"),
154 Token::None,
155 Token::Str("avatar"),
156 Token::Some,
157 Token::Str(image_hash::AVATAR_INPUT),
158 Token::Str("avatar_decoration"),
159 Token::None,
160 Token::Str("avatar_decoration_data"),
161 Token::None,
162 Token::Str("banner"),
163 Token::None,
164 Token::Str("bot"),
165 Token::Bool(false),
166 Token::Str("discriminator"),
167 Token::Str("0001"),
168 Token::Str("global_name"),
169 Token::Some,
170 Token::Str("test"),
171 Token::Str("id"),
172 Token::NewtypeStruct { name: "Id" },
173 Token::Str("3"),
174 Token::Str("username"),
175 Token::Str("test"),
176 Token::StructEnd,
177 Token::Str("call"),
178 Token::Some,
179 Token::Struct {
180 name: "MessageCall",
181 len: 2,
182 },
183 Token::Str("ended_timestamp"),
184 Token::None,
185 Token::Str("participants"),
186 Token::Seq { len: Some(0) },
187 Token::SeqEnd,
188 Token::StructEnd,
189 Token::Str("channel_id"),
190 Token::NewtypeStruct { name: "Id" },
191 Token::Str("2"),
192 Token::Str("content"),
193 Token::Str("ping"),
194 Token::Str("edited_timestamp"),
195 Token::None,
196 Token::Str("embeds"),
197 Token::Seq { len: Some(0) },
198 Token::SeqEnd,
199 Token::Str("flags"),
200 Token::Some,
201 Token::U64(0),
202 Token::Str("guild_id"),
203 Token::Some,
204 Token::NewtypeStruct { name: "Id" },
205 Token::Str("1"),
206 Token::Str("id"),
207 Token::NewtypeStruct { name: "Id" },
208 Token::Str("4"),
209 Token::Str("type"),
210 Token::U8(0),
211 Token::Str("member"),
212 Token::Some,
213 Token::Struct {
214 name: "PartialMember",
215 len: 8,
216 },
217 Token::Str("communication_disabled_until"),
218 Token::None,
219 Token::Str("deaf"),
220 Token::Bool(false),
221 Token::Str("flags"),
222 Token::U64(flags.bits()),
223 Token::Str("joined_at"),
224 Token::Some,
225 Token::Str("2020-01-01T00:00:00.000000+00:00"),
226 Token::Str("mute"),
227 Token::Bool(false),
228 Token::Str("nick"),
229 Token::Some,
230 Token::Str("member nick"),
231 Token::Str("roles"),
232 Token::Seq { len: Some(0) },
233 Token::SeqEnd,
234 Token::Str("user"),
235 Token::None,
236 Token::StructEnd,
237 Token::Str("mention_everyone"),
238 Token::Bool(false),
239 Token::Str("mention_roles"),
240 Token::Seq { len: Some(0) },
241 Token::SeqEnd,
242 Token::Str("mentions"),
243 Token::Seq { len: Some(0) },
244 Token::SeqEnd,
245 Token::Str("pinned"),
246 Token::Bool(false),
247 Token::Str("sticker_items"),
248 Token::Seq { len: Some(1) },
249 Token::Struct {
250 name: "MessageSticker",
251 len: 3,
252 },
253 Token::Str("format_type"),
254 Token::U8(1),
255 Token::Str("id"),
256 Token::NewtypeStruct { name: "Id" },
257 Token::Str("1"),
258 Token::Str("name"),
259 Token::Str("sticker name"),
260 Token::StructEnd,
261 Token::SeqEnd,
262 Token::Str("timestamp"),
263 Token::Str("2020-02-02T02:02:02.020000+00:00"),
264 Token::Str("tts"),
265 Token::Bool(false),
266 Token::StructEnd,
267 Token::StructEnd,
268 Token::SeqEnd,
269 Token::Str("has_more"),
270 Token::Bool(true),
271 Token::StructEnd,
272 ],
273 );
274 }
275}