diff --git a/src/tests/check.rs b/src/tests/check.rs new file mode 100644 index 0000000..766e0e7 --- /dev/null +++ b/src/tests/check.rs @@ -0,0 +1,182 @@ +use super::*; +use crate::{run, Command, Commands, FullCtx}; +use color_eyre::eyre::Result; +use http::StatusCode; + +#[test] +fn test_commands_log_flag() { + let commands = Commands { + log: true, + command: Command::Init, + }; + assert!(commands.log); + + let commands = Commands { + log: false, + command: Command::Init, + }; + assert!(!commands.log); +} + +#[test] +fn test_command_variants() { + let init = Command::Init; + assert!(matches!(init, Command::Init)); + + let check = Command::Check; + assert!(matches!(check, Command::Check)); + + let import = Command::Import; + assert!(matches!(import, Command::Import)); +} + +#[test] +fn test_ctx_creation() { + let path = std::path::PathBuf::from("test_path"); + let ctx = Ctx::from(path.clone()); + + assert_eq!(ctx.fs.base(), &path); +} + +#[tokio::test] +async fn test_full_ctx_clients() -> Result<()> { + let fs = kxio::fs::temp()?; + let ctx = Ctx::from(fs.base().to_path_buf()); + let file_name = fs.base().join("trello-to-deck.toml"); + let file = fs.file(&file_name); + file.write( + [ + "[trello]", + "api_key = 'foo'", + "api_secret = 'bar'", + "board_name = 'target'", + "[nextcloud]", + "hostname = 'http://localhost:8000'", + "username = 'bob'", + "password = '1 <3 alice!'", + "board_id = 23", + ] + .join("\n"), + )?; + + let config = AppConfig::load(&ctx).expect("Failed to load config"); + + let full_ctx = FullCtx { + fs: ctx.fs, + net: ctx.net, + prt: ctx.prt, + cfg: config, + }; + + let _deck_client = full_ctx.deck_client(); + let _trello_client = full_ctx.trello_client(); + + assert_peq!( + full_ctx.cfg, + AppConfig { + trello: TrelloConfig { + api_key: s!("foo").into(), + api_secret: s!("bar").into(), + board_name: s!("target").into(), + }, + nextcloud: NextcloudConfig { + hostname: s!("http://localhost:8000").into(), + username: s!("bob").into(), + password: s!("1 <3 alice!").into(), + board_id: 23.into(), + } + } + ); + + Ok(()) +} + +#[tokio::test] +async fn test_run() -> Result<()> { + //given + let fs = kxio::fs::temp()?; + let _temp_fs = fs.clone(); + let file_name = fs.base().join("trello-to-deck.toml"); + let file = fs.file(&file_name); + file.write( + [ + "[trello]", + "api_key = 'foo'", + "api_secret = 'bar'", + "board_name = 'DevProjects'", + "[nextcloud]", + "hostname = 'http://localhost:8000'", + "username = 'bob'", + "password = '1 <3 alice!'", + "board_id = 1", + ] + .join("\n"), + )?; + + let mock_net = kxio::net::mock(); + mock_net + .on() + .get("https://api.trello.com/1/members/me/boards?lists=open") + .respond(StatusCode::OK) + .body(include_bytes!("responses/trello-member-get.json").as_slice()) + .expect("trello member get"); + mock_net + .on() + .get("http://localhost:8000/index.php/apps/deck/api/v1.0/boards") + .respond(StatusCode::OK) + .body(include_bytes!("responses/nextcloud-deck-get.json").as_slice()) + .expect("nextcloud deck get"); + mock_net + .on() + .get("http://localhost:8000/index.php/apps/deck/api/v1.0/boards/1/stacks") + .respond(StatusCode::OK) + .body(include_bytes!("responses/nextcloud-board-get.json").as_slice()) + .expect("nextcloud board get"); + + let ctx = Ctx { + fs: fs.as_real(), + net: mock_net.into(), + prt: kxio::print::test(), + }; + + let prt = ctx.prt.clone(); + let prt = prt.as_test().unwrap(); + + let commands = Commands { + log: false, + command: Command::Check, + }; + + //when + run(&ctx, &commands).await?; + + //then + let output = prt.output(); + assert_peq!( + output.trim(), + [ + ">> Testing Trello details...", + "<<< Trello Credentials: OKAY", + ">> Trello Board: DevProjects", + "<<< Trello Board: OKAY", + "<<<< List: BRAINSTORM 🤔", + "<<<< List: TODO 📚", + "<<<< List: DOING ⚙️", + "<<<< List: DONE! 🙌🏽", + "<<<< List: Icebox ❄️", + ">> Testing Nextcloud details...", + "<<< Nextcloud Boards", + "<<<< Board: Personal Board", + "<<<< Board: 4 Published: Cossmass Infinities", + "<<<< Board: Fulfilment: Cossmass Infinities", + "<<< Nextcloud Credentials: OKAY", + "<<< Nextcloud Board: Personal Board", + "<<<< Stack: Done", + "<<<< Stack: Doing", + "<<<< Stack: To do", + ] + .join("\n") + ); + + Ok(()) +} diff --git a/src/tests/mod.rs b/src/tests/mod.rs index 81ae75d..1bc9586 100644 --- a/src/tests/mod.rs +++ b/src/tests/mod.rs @@ -9,6 +9,7 @@ use pretty_assertions::assert_eq as assert_peq; use crate::{config::AppConfig, f, nextcloud::NextcloudConfig, s, trello::TrelloConfig, Ctx, NAME}; mod api_result; +mod check; mod config; pub(crate) mod given; mod init;