From 4e6e8c303b1a1e070811b18833494b92f636fca6 Mon Sep 17 00:00:00 2001 From: 0xgleb Date: Tue, 6 May 2025 18:45:43 +0400 Subject: [PATCH 1/2] test common::subgraph --- crates/cli/src/commands/order/detail.rs | 3 +- crates/cli/src/commands/order/list.rs | 6 +-- crates/cli/src/commands/order/remove.rs | 3 +- crates/cli/src/commands/trade/detail.rs | 3 +- crates/cli/src/commands/trade/list.rs | 6 +-- crates/cli/src/commands/vault/detail.rs | 3 +- crates/cli/src/commands/vault/list.rs | 6 +-- .../commands/vault/list_balance_changes.rs | 6 +-- crates/common/src/subgraph.rs | 40 ++++++++++++++++++- crates/subgraph/src/orderbook_client.rs | 5 +++ tauri-app/src-tauri/src/commands/order.rs | 5 +-- .../src-tauri/src/commands/order_take.rs | 3 +- tauri-app/src-tauri/src/commands/vault.rs | 6 +-- 13 files changed, 60 insertions(+), 35 deletions(-) diff --git a/crates/cli/src/commands/order/detail.rs b/crates/cli/src/commands/order/detail.rs index 61d1cd9466..b7b1b6308d 100644 --- a/crates/cli/src/commands/order/detail.rs +++ b/crates/cli/src/commands/order/detail.rs @@ -17,8 +17,7 @@ impl Execute for CliOrderDetailArgs { async fn execute(&self) -> Result<()> { let subgraph_args: SubgraphArgs = self.subgraph_args.clone().into(); let order = subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .order_detail(self.order_id.clone().into()) .await?; let order_extended: OrderDetailExtended = order.try_into()?; diff --git a/crates/cli/src/commands/order/list.rs b/crates/cli/src/commands/order/list.rs index 51184b6959..9687a801a7 100644 --- a/crates/cli/src/commands/order/list.rs +++ b/crates/cli/src/commands/order/list.rs @@ -30,8 +30,7 @@ impl Execute for CliOrderListArgs { if self.pagination_args.csv { let csv_text = subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .orders_list_all() .await? .into_iter() @@ -43,8 +42,7 @@ impl Execute for CliOrderListArgs { } else { let table = build_table( subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .orders_list( self.filter_args.clone().into(), self.pagination_args.clone().into(), diff --git a/crates/cli/src/commands/order/remove.rs b/crates/cli/src/commands/order/remove.rs index 39bb69129c..5a2e4c36d9 100644 --- a/crates/cli/src/commands/order/remove.rs +++ b/crates/cli/src/commands/order/remove.rs @@ -25,8 +25,7 @@ impl Execute for CliOrderRemoveArgs { async fn execute(&self) -> Result<()> { let subgraph_args: SubgraphArgs = self.subgraph_args.clone().into(); let order = subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .order_detail(self.order_id.clone().into()) .await?; let remove_order_args: RemoveOrderArgs = order.into(); diff --git a/crates/cli/src/commands/trade/detail.rs b/crates/cli/src/commands/trade/detail.rs index 87a185f4e9..24f89e33ed 100644 --- a/crates/cli/src/commands/trade/detail.rs +++ b/crates/cli/src/commands/trade/detail.rs @@ -19,8 +19,7 @@ impl Execute for CliOrderTradeDetailArgs { async fn execute(&self) -> Result<()> { let subgraph_args: SubgraphArgs = self.subgraph_args.clone().into(); let order_take = subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .order_trade_detail(self.id.clone().into()) .await?; info!("{:#?}", order_take); diff --git a/crates/cli/src/commands/trade/list.rs b/crates/cli/src/commands/trade/list.rs index 9e904ea4e6..069d44bde1 100644 --- a/crates/cli/src/commands/trade/list.rs +++ b/crates/cli/src/commands/trade/list.rs @@ -30,8 +30,7 @@ impl Execute for CliOrderTradesListArgs { if self.pagination_args.csv { let csv_text = subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .order_trades_list_all(self.order_id.clone().into(), None, None) .await? .into_iter() @@ -43,8 +42,7 @@ impl Execute for CliOrderTradesListArgs { } else { let table = build_table( subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .order_trades_list( self.order_id.clone().into(), self.pagination_args.clone().into(), diff --git a/crates/cli/src/commands/vault/detail.rs b/crates/cli/src/commands/vault/detail.rs index f364d2efd4..b218e1efed 100644 --- a/crates/cli/src/commands/vault/detail.rs +++ b/crates/cli/src/commands/vault/detail.rs @@ -17,8 +17,7 @@ impl Execute for CliVaultDetailArgs { async fn execute(&self) -> Result<()> { let subgraph_args: SubgraphArgs = self.subgraph_args.clone().into(); let vault = subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .vault_detail(self.vault_id.clone().into()) .await?; info!("{:#?}", vault); diff --git a/crates/cli/src/commands/vault/list.rs b/crates/cli/src/commands/vault/list.rs index a02153a6e3..2a4e4023e9 100644 --- a/crates/cli/src/commands/vault/list.rs +++ b/crates/cli/src/commands/vault/list.rs @@ -31,8 +31,7 @@ impl Execute for CliVaultListArgs { if self.pagination_args.csv { let vaults = subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .vaults_list_all() .await?; let vaults_flattened: Vec = vaults @@ -46,8 +45,7 @@ impl Execute for CliVaultListArgs { let pagination_args: SgPaginationArgs = self.pagination_args.clone().into(); let filter_args = self.filter_args.clone().into(); let vaults = subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .vaults_list(filter_args, pagination_args) .await?; let vaults_flattened: Vec = vaults diff --git a/crates/cli/src/commands/vault/list_balance_changes.rs b/crates/cli/src/commands/vault/list_balance_changes.rs index 95b25d6f78..529a85608d 100644 --- a/crates/cli/src/commands/vault/list_balance_changes.rs +++ b/crates/cli/src/commands/vault/list_balance_changes.rs @@ -30,8 +30,7 @@ impl Execute for CliVaultBalanceChangesList { if self.pagination_args.csv { let csv_text = subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .vault_balance_changes_list_all(self.vault_id.clone().into()) .await? .into_iter() @@ -43,8 +42,7 @@ impl Execute for CliVaultBalanceChangesList { } else { let table = build_table( subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .vault_balance_changes_list( self.vault_id.clone().into(), self.pagination_args.clone().into(), diff --git a/crates/common/src/subgraph.rs b/crates/common/src/subgraph.rs index 31e4af9d23..cb3e32de32 100644 --- a/crates/common/src/subgraph.rs +++ b/crates/common/src/subgraph.rs @@ -8,7 +8,45 @@ pub struct SubgraphArgs { } impl SubgraphArgs { - pub async fn to_subgraph_client(&self) -> Result { + pub fn to_subgraph_client(&self) -> Result { Ok(OrderbookSubgraphClient::new(Url::parse(self.url.as_str())?)) } } + +#[cfg(test)] +mod tests { + use super::*; + + #[test] + fn test_to_subgraph_client_ok() { + let url = "https://api.thegraph.com/subgraphs/name/org1/sg1"; + let subgraph_args = SubgraphArgs { + url: url.to_string(), + }; + let subgraph_client = subgraph_args.to_subgraph_client().unwrap(); + assert_eq!(subgraph_client.url().as_str(), url); + } + + #[test] + fn test_to_subgraph_client_err() { + let url = "api.thegraph.com/subgraphs/name/org1/sg1".to_string(); + let subgraph_args = SubgraphArgs { url }; + let err = subgraph_args.to_subgraph_client().unwrap_err(); + assert_eq!(err, ParseError::RelativeUrlWithoutBase); + + let url = "https:///".to_string(); + let subgraph_args = SubgraphArgs { url }; + let err = subgraph_args.to_subgraph_client().unwrap_err(); + assert_eq!(err, ParseError::EmptyHost); + + let url = "".to_string(); + let subgraph_args = SubgraphArgs { url }; + let err = subgraph_args.to_subgraph_client().unwrap_err(); + assert_eq!(err, ParseError::RelativeUrlWithoutBase); + + let url = ":".to_string(); + let subgraph_args = SubgraphArgs { url }; + let err = subgraph_args.to_subgraph_client().unwrap_err(); + assert_eq!(err, ParseError::RelativeUrlWithoutBase); + } +} diff --git a/crates/subgraph/src/orderbook_client.rs b/crates/subgraph/src/orderbook_client.rs index 14a427af74..f9bb887650 100644 --- a/crates/subgraph/src/orderbook_client.rs +++ b/crates/subgraph/src/orderbook_client.rs @@ -56,6 +56,7 @@ impl From for JsValue { } } +#[derive(Debug)] pub struct OrderbookSubgraphClient { url: Url, } @@ -72,6 +73,10 @@ impl OrderbookSubgraphClient { Self { url } } + pub fn url(&self) -> &Url { + &self.url + } + /// Fetch single order pub async fn order_detail(&self, id: Id) -> Result { let data = self diff --git a/tauri-app/src-tauri/src/commands/order.rs b/tauri-app/src-tauri/src/commands/order.rs index 1c67bf84d3..7250edd79e 100644 --- a/tauri-app/src-tauri/src/commands/order.rs +++ b/tauri-app/src-tauri/src/commands/order.rs @@ -17,8 +17,7 @@ pub async fn orders_list_write_csv( subgraph_args: SubgraphArgs, ) -> CommandResult<()> { let orders = subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .orders_list_all() .await?; let orders_flattened: Vec = orders @@ -62,7 +61,6 @@ pub async fn order_remove( ) -> CommandResult<()> { let order = subgraph_args .to_subgraph_client() - .await .map_err(|e| { toast_error(app_handle.clone(), String::from("Subgraph URL is invalid")); e @@ -115,7 +113,6 @@ pub async fn order_remove_calldata( ) -> CommandResult { let order = subgraph_args .to_subgraph_client() - .await .map_err(|e| { toast_error(app_handle.clone(), String::from("Subgraph URL is invalid")); e diff --git a/tauri-app/src-tauri/src/commands/order_take.rs b/tauri-app/src-tauri/src/commands/order_take.rs index 05ab627189..99574cc36b 100644 --- a/tauri-app/src-tauri/src/commands/order_take.rs +++ b/tauri-app/src-tauri/src/commands/order_take.rs @@ -14,8 +14,7 @@ pub async fn order_trades_list_write_csv( end_timestamp: Option, ) -> CommandResult<()> { let order_takes = subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .order_trades_list_all(order_id.clone().into(), start_timestamp, end_timestamp) .await?; let order_takes_flattened: Vec = order_takes diff --git a/tauri-app/src-tauri/src/commands/vault.rs b/tauri-app/src-tauri/src/commands/vault.rs index aa51da78da..7893d6aa03 100644 --- a/tauri-app/src-tauri/src/commands/vault.rs +++ b/tauri-app/src-tauri/src/commands/vault.rs @@ -20,8 +20,7 @@ pub async fn vaults_list_write_csv( subgraph_args: SubgraphArgs, ) -> CommandResult<()> { let vaults = subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .vaults_list_all() .await?; let vaults_flattened: Vec = @@ -42,8 +41,7 @@ pub async fn vault_balance_changes_list_write_csv( subgraph_args: SubgraphArgs, ) -> CommandResult<()> { let data = subgraph_args - .to_subgraph_client() - .await? + .to_subgraph_client()? .vault_balance_changes_list_all(id.into()) .await?; let data_flattened: Vec = From bbaa8e69c4883fd61645b50f461da64fc4493e59 Mon Sep 17 00:00:00 2001 From: 0xgleb Date: Thu, 8 May 2025 21:18:45 +0400 Subject: [PATCH 2/2] add suggested changes --- crates/common/src/subgraph.rs | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/crates/common/src/subgraph.rs b/crates/common/src/subgraph.rs index cb3e32de32..72f234d3b6 100644 --- a/crates/common/src/subgraph.rs +++ b/crates/common/src/subgraph.rs @@ -25,6 +25,13 @@ mod tests { }; let subgraph_client = subgraph_args.to_subgraph_client().unwrap(); assert_eq!(subgraph_client.url().as_str(), url); + + let url = "https://api.thegraph.com/subgraphs/name/org1/sg1?version=latest&format=json"; + let subgraph_args = SubgraphArgs { + url: url.to_string(), + }; + let subgraph_client = subgraph_args.to_subgraph_client().unwrap(); + assert_eq!(subgraph_client.url().as_str(), url); } #[test] @@ -42,6 +49,7 @@ mod tests { let url = "".to_string(); let subgraph_args = SubgraphArgs { url }; let err = subgraph_args.to_subgraph_client().unwrap_err(); + // Empty URL results in RelativeUrlWithoutBase error assert_eq!(err, ParseError::RelativeUrlWithoutBase); let url = ":".to_string();