misskey-api 0.2.0

API bindings of Misskey, including requests/responses of endpoints and messages on channels
Documentation
use crate::model::{
    drive::{DriveFile, DriveFolder},
    id::Id,
};
use crate::streaming::channel::NoOutgoing;

use serde::{Deserialize, Serialize};

#[derive(Deserialize, Debug, Clone)]
#[serde(rename_all = "camelCase", tag = "type", content = "body")]
pub enum DriveStreamEvent {
    FolderCreated(DriveFolder),
    FolderUpdated(DriveFolder),
    FolderDeleted(Id<DriveFolder>),
    FileCreated(DriveFile),
    FileUpdated(DriveFile),
    FileDeleted(Id<DriveFile>),
}

#[derive(Serialize, Default, Debug, Clone)]
pub struct Request {}

impl misskey_core::streaming::ConnectChannelRequest for Request {
    type Incoming = DriveStreamEvent;
    type Outgoing = NoOutgoing;

    const NAME: &'static str = "drive";
}

#[cfg(test)]
mod tests {
    use super::{DriveStreamEvent, Request};
    use crate::test::{websocket::TestClient, ClientExt};

    use futures::{future, StreamExt};

    #[tokio::test]
    async fn subscribe_unsubscribe() {
        let client = TestClient::new().await;
        let mut stream = client.channel(Request::default()).await.unwrap();
        stream.disconnect().await.unwrap();
    }

    #[tokio::test]
    async fn stream_folder_created() {
        let client = TestClient::new().await;
        let mut stream = client.channel(Request::default()).await.unwrap();

        future::join(
            client.test(crate::endpoint::drive::folders::create::Request::default()),
            async {
                loop {
                    match stream.next().await.unwrap().unwrap() {
                        DriveStreamEvent::FolderCreated(_) => break,
                        _ => continue,
                    }
                }
            },
        )
        .await;
    }

    #[tokio::test]
    async fn stream_folder_updated() {
        let client = TestClient::new().await;
        let folder = client
            .test(crate::endpoint::drive::folders::create::Request::default())
            .await;
        let mut stream = client.channel(Request::default()).await.unwrap();

        future::join(
            client.test(crate::endpoint::drive::folders::update::Request {
                folder_id: folder.id,
                name: Some("test".to_string()),
                parent_id: None,
            }),
            async {
                loop {
                    match stream.next().await.unwrap().unwrap() {
                        DriveStreamEvent::FolderUpdated(_) => break,
                        _ => continue,
                    }
                }
            },
        )
        .await;
    }

    #[tokio::test]
    async fn stream_folder_deleted() {
        let client = TestClient::new().await;
        let folder = client
            .test(crate::endpoint::drive::folders::create::Request::default())
            .await;
        let mut stream = client.channel(Request::default()).await.unwrap();

        future::join(
            client.test(crate::endpoint::drive::folders::delete::Request {
                folder_id: folder.id,
            }),
            async {
                loop {
                    match stream.next().await.unwrap().unwrap() {
                        DriveStreamEvent::FolderDeleted(_) => break,
                        _ => continue,
                    }
                }
            },
        )
        .await;
    }

    #[tokio::test]
    async fn stream_file_created() {
        let client = TestClient::new().await;
        let url = client.avatar_url().await;
        let mut stream = client.channel(Request::default()).await.unwrap();

        future::join(client.upload_from_url(url), async {
            loop {
                match stream.next().await.unwrap().unwrap() {
                    DriveStreamEvent::FileCreated(_) => break,
                    _ => continue,
                }
            }
        })
        .await;
    }

    #[tokio::test]
    async fn stream_file_updated() {
        let client = TestClient::new().await;
        let url = client.avatar_url().await;
        let file = client.upload_from_url(url).await;
        let mut stream = client.channel(Request::default()).await.unwrap();

        future::join(
            client.test(crate::endpoint::drive::files::update::Request {
                file_id: file.id,
                folder_id: None,
                is_sensitive: None,
                name: Some("test".to_string()),
            }),
            async {
                loop {
                    match stream.next().await.unwrap().unwrap() {
                        DriveStreamEvent::FileUpdated(_) => break,
                        _ => continue,
                    }
                }
            },
        )
        .await;
    }

    #[tokio::test]
    async fn stream_file_deleted() {
        let client = TestClient::new().await;
        let url = client.avatar_url().await;
        let file = client.upload_from_url(url).await;
        let mut stream = client.channel(Request::default()).await.unwrap();

        future::join(
            client.test(crate::endpoint::drive::files::delete::Request { file_id: file.id }),
            async {
                loop {
                    match stream.next().await.unwrap().unwrap() {
                        DriveStreamEvent::FileDeleted(_) => break,
                        _ => continue,
                    }
                }
            },
        )
        .await;
    }
}