chorus 0.20.0

A library for interacting with multiple Spacebar-compatible Instances at once.
Documentation
// This Source Code Form is subject to the terms of the Mozilla Public
// License, v. 2.0. If a copy of the MPL was not distributed with this
// file, You can obtain one at https://mozilla.org/MPL/2.0/.

use chorus::types::{
    self, Channel, GetChannelMessagesSchema, MessageSendSchema, PermissionFlags,
    PermissionOverwrite, PermissionOverwriteType, PrivateChannelCreateSchema, RelationshipType,
    Snowflake,
};

mod common;

#[cfg(target_arch = "wasm32")]
use wasm_bindgen_test::*;
#[cfg(target_arch = "wasm32")]
wasm_bindgen_test_configure!(run_in_browser);

#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
#[cfg_attr(not(target_arch = "wasm32"), tokio::test)]
async fn get_channel() {
    let mut bundle = common::setup().await;
    let bundle_channel = bundle.channel.read().unwrap().clone();
    let bundle_user = &mut bundle.user;

    assert_eq!(
        bundle_channel,
        Channel::get(bundle_user, bundle_channel.id).await.unwrap()
    );
    common::teardown(bundle).await
}

#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
#[cfg_attr(not(target_arch = "wasm32"), tokio::test)]
async fn delete_channel() {
    let mut bundle = common::setup().await;
    let channel_guard = bundle.channel.write().unwrap().clone();
    let result = Channel::delete(channel_guard, None, &mut bundle.user).await;
    assert!(result.is_ok());
    common::teardown(bundle).await
}

#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
#[cfg_attr(not(target_arch = "wasm32"), tokio::test)]
async fn modify_channel() {
    const CHANNEL_NAME: &str = "beepboop";
    let mut bundle = common::setup().await;
    let channel = &mut bundle.channel.read().unwrap().clone();
    let modify_data: types::ChannelModifySchema = types::ChannelModifySchema {
        name: Some(CHANNEL_NAME.to_string()),
        channel_type: None,
        topic: None,
        icon: None,
        bitrate: None,
        user_limit: None,
        rate_limit_per_user: None,
        position: None,
        permission_overwrites: None,
        parent_id: None,
        nsfw: None,
        rtc_region: None,
        default_auto_archive_duration: None,
        default_reaction_emoji: None,
        flags: None,
        default_thread_rate_limit_per_user: None,
        video_quality_mode: None,
    };
    let modified_channel = channel
        .modify(modify_data, None, &mut bundle.user)
        .await
        .unwrap();
    assert_eq!(modified_channel.name, Some(CHANNEL_NAME.to_string()));

    let permission_override = PermissionFlags::MANAGE_CHANNELS | PermissionFlags::MANAGE_MESSAGES;
    let user_id: types::Snowflake = bundle.user.object.read().unwrap().id;
    let permission_override = PermissionOverwrite {
        id: user_id,
        overwrite_type: PermissionOverwriteType::Member,
        allow: permission_override,
        deny: PermissionFlags::empty(),
    };
    let channel_id: Snowflake = bundle.channel.read().unwrap().id;
    Channel::modify_permissions(
        &mut bundle.user,
        channel_id,
        None,
        permission_override.clone(),
    )
    .await
    .unwrap();

    Channel::delete_permission(&mut bundle.user, channel_id, permission_override.id)
        .await
        .unwrap();

    common::teardown(bundle).await
}

#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
#[cfg_attr(not(target_arch = "wasm32"), tokio::test)]
async fn get_channel_messages() {
    let mut bundle = common::setup().await;
    let channel_id: Snowflake = bundle.channel.read().unwrap().id;
    // First create some messages to read
    for _ in 0..10 {
        let _ = bundle
            .user
            .send_message(
                MessageSendSchema {
                    content: Some("A Message!".to_string()),
                    ..Default::default()
                },
                channel_id,
            )
            .await
            .unwrap();
    }

    assert_eq!(
        Channel::messages(
            GetChannelMessagesSchema::before(Snowflake::generate()),
            channel_id,
            &mut bundle.user,
        )
        .await
        .unwrap()
        .len(),
        10
    );

    // around is currently bugged in spacebar: https://github.com/spacebarchat/server/issues/1072
    // assert_eq!(
    //     Channel::messages(
    //         GetChannelMessagesSchema::around(Snowflake::generate()).limit(10),
    //         bundle.channel.id,
    //         &mut bundle.user,
    //     )
    //     .await
    //     .unwrap()
    //     .len(),
    //     5
    // );

    assert!(Channel::messages(
        GetChannelMessagesSchema::after(Snowflake::generate()),
        channel_id,
        &mut bundle.user,
    )
    .await
    .unwrap()
    .is_empty());

    common::teardown(bundle).await
}

#[cfg_attr(target_arch = "wasm32", wasm_bindgen_test::wasm_bindgen_test)]
#[cfg_attr(not(target_arch = "wasm32"), tokio::test)]
async fn create_dm() {
    let mut bundle = common::setup().await;
    let other_user = bundle.create_user("integrationtestuser2").await;
    let user = &mut bundle.user;
    let private_channel_create_schema = PrivateChannelCreateSchema {
        recipients: Some(Vec::from([other_user.object.read().unwrap().id])),
        access_tokens: None,
        nicks: None,
    };
    let dm_channel = user
        .create_private_channel(private_channel_create_schema)
        .await
        .unwrap();
    assert!(dm_channel.recipients.is_some());
    assert_eq!(
        dm_channel
            .recipients
            .as_ref()
            .unwrap()
            .first()
            .unwrap()
            .read()
            .unwrap()
            .id
            .clone(),
        other_user.object.read().unwrap().id
    );
    assert_eq!(
        dm_channel
            .recipients
            .as_ref()
            .unwrap()
            .get(1)
            .unwrap()
            .read()
            .unwrap()
            .id
            .clone(),
        user.object.read().unwrap().id.clone()
    );
    common::teardown(bundle).await;
}

// #[tokio::test]
// TODO This test currently is broken due to an issue with the Spacebar Server.
#[allow(dead_code)]
async fn remove_add_person_from_to_dm() {
    let mut bundle = common::setup().await;
    let mut other_user = bundle.create_user("integrationtestuser2").await;
    let mut third_user = bundle.create_user("integrationtestuser3").await;
    let third_user_id = third_user.object.read().unwrap().id;
    let other_user_id = other_user.object.read().unwrap().id;
    let user_id = bundle.user.object.read().unwrap().id;
    let user = &mut bundle.user;
    let private_channel_create_schema = PrivateChannelCreateSchema {
        recipients: Some(Vec::from([other_user_id, third_user_id])),
        access_tokens: None,
        nicks: None,
    };
    let dm_channel = user
        .create_private_channel(private_channel_create_schema)
        .await
        .unwrap(); // Creates the Channel and stores the response Channel object
    dm_channel
        .remove_channel_recipient(other_user_id, user)
        .await
        .unwrap();
    assert!(dm_channel.recipients.as_ref().unwrap().get(1).is_none());
    other_user
        .modify_user_relationship(user_id, RelationshipType::Friends)
        .await
        .unwrap();
    user.modify_user_relationship(other_user_id, RelationshipType::Friends)
        .await
        .unwrap();
    third_user
        .modify_user_relationship(user_id, RelationshipType::Friends)
        .await
        .unwrap();
    user.modify_user_relationship(third_user_id, RelationshipType::Friends)
        .await
        .unwrap();
    // Users 1-2 and 1-3 are now friends
    dm_channel
        .add_channel_recipient(other_user_id, user, None)
        .await
        .unwrap();
    assert!(dm_channel.recipients.is_some());
    assert_eq!(
        dm_channel
            .recipients
            .as_ref()
            .unwrap()
            .first()
            .unwrap()
            .read()
            .unwrap()
            .id,
        other_user_id
    );
    assert_eq!(
        dm_channel
            .recipients
            .as_ref()
            .unwrap()
            .get(1)
            .unwrap()
            .read()
            .unwrap()
            .id,
        user_id
    );
}