From 750bcd7fe27d6e0888e6731a810abfc765f3bf8e Mon Sep 17 00:00:00 2001 From: Paul Campbell Date: Sat, 7 Dec 2024 18:11:24 +0000 Subject: [PATCH] feat(nextcloud): DeckClient hold reference to FullCtx given a full context --- src/nextcloud/mod.rs | 55 +++++++++++++++++++++--------------------- src/nextcloud/tests.rs | 40 +++++++++++++++++++++++++----- 2 files changed, 61 insertions(+), 34 deletions(-) diff --git a/src/nextcloud/mod.rs b/src/nextcloud/mod.rs index 6c535ae..33a0ee5 100644 --- a/src/nextcloud/mod.rs +++ b/src/nextcloud/mod.rs @@ -1,9 +1,5 @@ // -use kxio::net::Net; -use kxio::print::Printer; - -use crate::api_result::APIResult; -use crate::{config::NextcloudConfig, f}; +use crate::{api_result::APIResult, f, FullCtx}; use crate::nextcloud::model::{NextcloudHostname, NextcloudPassword, NextcloudUsername}; use model::{Board, Card, NextcloudBoardId, Stack}; @@ -13,22 +9,20 @@ pub mod model; #[cfg(test)] mod tests; -pub struct DeckClient<'cfg> { - net: Net, - prt: Printer, - hostname: &'cfg NextcloudHostname, - username: &'cfg NextcloudUsername, - password: &'cfg NextcloudPassword, +pub struct DeckClient<'ctx> { + ctx: &'ctx FullCtx, + hostname: &'ctx NextcloudHostname, + username: &'ctx NextcloudUsername, + password: &'ctx NextcloudPassword, } -impl<'cfg> DeckClient<'cfg> { - pub fn new(cfg: &'cfg NextcloudConfig, net: Net, prt: Printer) -> Self { +impl<'ctx> DeckClient<'ctx> { + pub fn new(ctx: &'ctx FullCtx) -> Self { Self { - net, - prt, - hostname: &cfg.hostname, - username: &cfg.username, - password: &cfg.password, + ctx, + hostname: &ctx.cfg.nextcloud.hostname, + username: &ctx.cfg.nextcloud.username, + password: &ctx.cfg.nextcloud.password, } } @@ -42,33 +36,36 @@ impl<'cfg> DeckClient<'cfg> { pub async fn get_boards(&self) -> APIResult> { APIResult::new( - self.net + self.ctx + .net .get(self.url("boards")) .basic_auth(self.username.as_str(), Some(self.password.as_str())) .header("accept", "application/json") .send() .await, - &self.prt, + &self.ctx.prt, ) .await } pub async fn get_board(&self, board_id: NextcloudBoardId) -> APIResult { APIResult::new( - self.net + self.ctx + .net .get(self.url(f!("boards/{board_id}"))) .basic_auth(self.username.as_str(), Some(self.password.as_str())) .header("accept", "application/json") .send() .await, - &self.prt, + &self.ctx.prt, ) .await } pub async fn create_board(&self, title: &str, color: &str) -> APIResult { APIResult::new( - self.net + self.ctx + .net .post(self.url("boards")) .basic_auth(self.username.as_str(), Some(self.password.as_str())) .header("accept", "application/json") @@ -81,20 +78,21 @@ impl<'cfg> DeckClient<'cfg> { ) .send() .await, - &self.prt, + &self.ctx.prt, ) .await } pub async fn get_stacks(&self, board_id: NextcloudBoardId) -> APIResult> { APIResult::new( - self.net + self.ctx + .net .get(self.url(f!("boards/{board_id}/stacks"))) .basic_auth(self.username.as_str(), Some(self.password.as_str())) .header("accept", "application/json") .send() .await, - &self.prt, + &self.ctx.prt, ) .await } @@ -120,14 +118,15 @@ impl<'cfg> DeckClient<'cfg> { } APIResult::new( - self.net + self.ctx + .net .post(&url) .basic_auth(self.username.as_str(), Some(self.password.as_str())) .header("accept", "application/json") .body(json.to_string()) .send() .await, - &self.prt, + &self.ctx.prt, ) .await } diff --git a/src/nextcloud/tests.rs b/src/nextcloud/tests.rs index 8a33aa1..5d41f20 100644 --- a/src/nextcloud/tests.rs +++ b/src/nextcloud/tests.rs @@ -147,8 +147,9 @@ mod client { ) .expect("mock request"); - let cfg = given::a_nextcloud_config(); - let deck_client = DeckClient::new(&cfg, mock_net.into(), given::a_printer()); + let fs = given::a_filesystem(); + let ctx = given::a_full_context(mock_net, fs); + let deck_client = DeckClient::new(&ctx); //when let result = deck_client.get_boards().await.result.expect("get boards"); @@ -189,12 +190,13 @@ mod client { .body(include_str!("../tests/responses/nextcloud-stack-list.json")) .expect("mock request"); - let cfg = given::a_nextcloud_config(); - let deck_client = DeckClient::new(&cfg, mock_net.into(), given::a_printer()); + let fs = given::a_filesystem(); + let ctx = given::a_full_context(mock_net, fs); + let deck_client = DeckClient::new(&ctx); //when let result = deck_client - .get_stacks(cfg.board_id) + .get_stacks(ctx.cfg.nextcloud.board_id) .await .result .expect("get stacks"); @@ -229,7 +231,9 @@ mod client { } mod given { - use kxio::print::Printer; + use kxio::{fs::TempFileSystem, net::MockNet, print::Printer}; + + use crate::{config::TrelloConfig, s, AppConfig, FullCtx}; use super::*; @@ -249,4 +253,28 @@ mod given { pub fn a_printer() -> Printer { kxio::print::test() } + + pub(crate) fn a_filesystem() -> TempFileSystem { + kxio::fs::temp().expect("temp fs") + } + + pub(crate) fn a_trello_config() -> TrelloConfig { + TrelloConfig { + api_key: s!("trello-api-key").into(), + api_secret: s!("trello-api-secret").into(), + board_name: s!("trello-board-name").into(), + } + } + + pub(crate) fn a_full_context(mock_net: MockNet, fs: TempFileSystem) -> FullCtx { + FullCtx { + fs: fs.as_real(), + net: mock_net.into(), + prt: given::a_printer(), + cfg: AppConfig { + trello: given::a_trello_config(), + nextcloud: given::a_nextcloud_config(), + }, + } + } }