use serde::{Deserialize, Serialize};
use crate::client::Client;
const QUERY_COACH_TREE: &str = include_str!("graphql/coach_tree.graphql");
#[derive(Serialize)]
#[serde(rename_all = "camelCase")]
struct CoachTreeVariables {
site: String,
tree_type: String,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CoachTreeResponse {
pub user: Option<CoachTreeUser>,
}
#[derive(Debug, Clone, Serialize, Deserialize)]
#[serde(rename_all = "camelCase")]
pub struct CoachTreeUser {
#[serde(default)]
pub watchlists: Vec<CoachTreeNode>,
#[serde(default)]
pub screens: Vec<CoachTreeNode>,
}
pub type CoachTreeNode = crate::types::TreeNode;
pub type CoachTreeChildNode = crate::types::TreeChildNode;
impl Client {
pub async fn coach_tree(
&self,
site: &str,
tree_type: &str,
) -> crate::error::Result<CoachTreeResponse> {
let variables = CoachTreeVariables {
site: site.to_string(),
tree_type: tree_type.to_string(),
};
self.graphql_operation("CoachTree", variables, QUERY_COACH_TREE)
.await
}
}
#[cfg(test)]
mod tests {
use crate::test_support::mock_test;
#[tokio::test]
async fn coach_tree_parses_response() {
let (_server, client, mock) = mock_test("CoachTree").await;
let resp = client
.coach_tree("marketsurge", "MSR_NAV")
.await
.expect("coach_tree should succeed");
let user = resp.user.as_ref().expect("user");
assert_eq!(user.watchlists.len(), 2);
let folder = &user.watchlists[0];
assert_eq!(folder.id.as_deref(), Some("folder-1"));
assert_eq!(folder.name.as_deref(), Some("My Watchlists"));
assert_eq!(folder.node_type.as_deref(), Some("FOLDER"));
assert_eq!(folder.content_type.as_deref(), Some("WATCHLIST"));
assert_eq!(folder.children.len(), 1);
assert_eq!(folder.children[0].id.as_deref(), Some("leaf-1"));
assert_eq!(folder.children[0].name.as_deref(), Some("Growth Stocks"));
let leaf = &user.watchlists[1];
assert_eq!(leaf.id.as_deref(), Some("leaf-2"));
assert_eq!(leaf.url.as_deref(), Some("/watchlist/tech-leaders"));
assert_eq!(leaf.reference_id.as_deref(), Some("12345"));
assert_eq!(user.screens.len(), 1);
assert_eq!(user.screens[0].id.as_deref(), Some("screen-leaf-1"));
assert_eq!(user.screens[0].name.as_deref(), Some("IBD 50"));
assert_eq!(user.screens[0].url.as_deref(), Some("/screen/ibd50"));
mock.assert();
}
#[cfg(not(coverage))]
#[tokio::test]
#[ignore]
async fn integration_coach_tree() {
let client = crate::test_support::live_client().await;
let resp = client
.coach_tree("marketsurge", "MSR_NAV")
.await
.expect("live coach_tree should succeed");
assert!(resp.user.is_some());
}
}