disma 0.16.4

Discord server management has never been easier!
Documentation
use crate::{
    api::params::permission::PermissionsOverwriteParams,
    category::{CategoriesList, ExistingCategory},
};

use super::{CategoriesParamsList, CategoryParams, CategoryParamsExtraChannelsStrategy};

impl From<&CategoriesList<ExistingCategory>> for CategoriesParamsList {
    fn from(categories: &CategoriesList<ExistingCategory>) -> Self {
        let items = categories.to_list().into_iter().map(Into::into).collect();

        CategoriesParamsList {
            items,
            ..Default::default()
        }
    }
}

impl From<&ExistingCategory> for CategoryParams {
    fn from(category: &ExistingCategory) -> Self {
        let permissions_overwrites: Vec<PermissionsOverwriteParams> = category
            .overwrites
            .to_list()
            .iter()
            .map(PermissionsOverwriteParams::from)
            .collect();

        Self {
            name: category.name.clone(),
            permissions_overwrites,
            extra_channels: CategoryParamsExtraChannelsStrategy::default(),
        }
    }
}

#[cfg(test)]
mod tests {
    use crate::{
        api::params::{
            category::{CategoriesParamsList, CategoryParams, CategoryParamsExtraChannelsStrategy},
            permission::PermissionsOverwriteParams,
        },
        category::{CategoriesList, ExistingCategory},
        permission::{
            Permission, PermissionsList, PermissionsOverwrite, PermissionsOverwritesList,
        },
        role::ExistingRole,
    };

    fn given_matching_existing_and_params(
        name: &str,
        role: &ExistingRole,
    ) -> (ExistingCategory, CategoryParams) {
        let existing = ExistingCategory {
            id: "some".to_string(),
            name: name.to_string(),
            overwrites: PermissionsOverwritesList::from(vec![PermissionsOverwrite {
                role: role.clone(),
                allow: PermissionsList::from(vec![Permission::ADMINISTRATOR]),
                deny: PermissionsList::from(vec![Permission::ADMINISTRATOR]),
            }]),
        };

        let params = CategoryParams {
            name: name.to_string(),
            permissions_overwrites: vec![PermissionsOverwriteParams {
                role: role.name.clone(),
                allow: vec![Permission::ADMINISTRATOR],
                deny: vec![Permission::ADMINISTRATOR],
            }],
            extra_channels: CategoryParamsExtraChannelsStrategy::Keep,
        };

        (existing, params)
    }

    fn given_matching_existing_list_and_params_list(
        name: &str,
        role: &ExistingRole,
    ) -> (CategoriesList<ExistingCategory>, CategoriesParamsList) {
        let (existing, params) = given_matching_existing_and_params(name, role);

        let existing_list = CategoriesList::from(vec![existing]);

        let params_list = CategoriesParamsList {
            items: vec![params],
            ..Default::default()
        };

        (existing_list, params_list)
    }

    fn given_existing_role(id: &str, name: &str) -> ExistingRole {
        ExistingRole {
            id: id.to_string(),
            name: name.to_string(),
            permissions: PermissionsList::new(),
            color: None,
            is_mentionable: true,
            show_in_sidebar: false,
        }
    }

    #[test]
    fn can_convert_existing_entity_to_params() {
        let name = "presto";
        let role = given_existing_role("kgj399sd", "Team01");
        let (existing, expected_params) = given_matching_existing_and_params(name, &role);

        let params = CategoryParams::from(&existing);

        assert_eq!(params, expected_params);
    }

    #[test]
    fn can_convert_existing_entities_list_to_params_list() {
        let name = "presto";
        let role = given_existing_role("kgj399sd", "Team01");
        let (existing_list, expected_params_list) =
            given_matching_existing_list_and_params_list(name, &role);

        let params = CategoriesParamsList::from(&existing_list);

        assert_eq!(params, expected_params_list);
    }
}