misskey_api/endpoint/notes/
search.rs

1use crate::model::{id::Id, note::Note, user::User};
2
3use serde::Serialize;
4use typed_builder::TypedBuilder;
5
6#[derive(Serialize, Debug, Clone, TypedBuilder)]
7#[serde(rename_all = "camelCase")]
8#[builder(doc)]
9pub struct Request {
10    #[builder(setter(into))]
11    pub query: String,
12    #[builder(default, setter(strip_option))]
13    pub user_id: Option<Id<User>>,
14    #[builder(default, setter(strip_option, into))]
15    pub host: Option<String>,
16    /// 1 .. 100
17    #[serde(skip_serializing_if = "Option::is_none")]
18    #[builder(default, setter(strip_option))]
19    pub limit: Option<u8>,
20    #[serde(skip_serializing_if = "Option::is_none")]
21    #[builder(default, setter(strip_option))]
22    pub since_id: Option<Id<Note>>,
23    #[serde(skip_serializing_if = "Option::is_none")]
24    #[builder(default, setter(strip_option))]
25    pub until_id: Option<Id<Note>>,
26}
27
28impl misskey_core::Request for Request {
29    type Response = Vec<Note>;
30    const ENDPOINT: &'static str = "notes/search";
31}
32
33impl_pagination!(Request, Note);
34
35#[cfg(test)]
36mod tests {
37    use super::Request;
38    use crate::test::{ClientExt, TestClient};
39
40    #[tokio::test]
41    async fn request_with_query() {
42        let client = TestClient::new();
43        client
44            .test(Request {
45                query: "query".to_string(),
46                user_id: None,
47                host: None,
48                limit: None,
49                since_id: None,
50                until_id: None,
51            })
52            .await;
53    }
54
55    #[tokio::test]
56    async fn request_with_user_id() {
57        let client = TestClient::new();
58        let user = client.admin.me().await;
59        client
60            .test(Request {
61                query: "query".to_string(),
62                user_id: Some(user.id),
63                host: None,
64                limit: None,
65                since_id: None,
66                until_id: None,
67            })
68            .await;
69    }
70
71    #[tokio::test]
72    async fn request_with_host() {
73        let client = TestClient::new();
74        client
75            .test(Request {
76                query: "query".to_string(),
77                user_id: None,
78                // TODO: proper host name
79                host: Some("dummy".to_string()),
80                limit: None,
81                since_id: None,
82                until_id: None,
83            })
84            .await;
85    }
86
87    #[tokio::test]
88    async fn request_with_limit() {
89        let client = TestClient::new();
90        client
91            .test(Request {
92                query: "query".to_string(),
93                user_id: None,
94                host: None,
95                limit: Some(100),
96                since_id: None,
97                until_id: None,
98            })
99            .await;
100    }
101
102    #[tokio::test]
103    async fn request_paginate() {
104        let client = TestClient::new();
105        let note = client.create_note(Some("test"), None, None).await;
106
107        client
108            .test(Request {
109                query: "test".to_string(),
110                user_id: None,
111                host: None,
112                limit: None,
113                since_id: Some(note.id.clone()),
114                until_id: Some(note.id.clone()),
115            })
116            .await;
117    }
118}