marketsurge-client 0.2.1

Unofficial HTTP client library for the MarketSurge platform
use reqwest::cookie::Jar;
use rookie::common::enums::Cookie;
use url::Url;

pub fn extract_cookies() -> crate::error::Result<Vec<Cookie>> {
    let cookies = rookie::firefox(Some(vec![
        "investors.com".to_string(),
        ".investors.com".to_string(),
    ]))
    .unwrap_or_default();

    if cookies.is_empty() {
        return Err(crate::error::ClientError::Status {
            status: 401,
            body: "no cookies found for investors.com".to_string(),
        });
    }

    Ok(cookies)
}

pub fn build_cookie_jar(cookies: &[Cookie]) -> crate::error::Result<Jar> {
    let jar = Jar::default();
    let url =
        Url::parse("https://www.investors.com").map_err(|_| crate::error::ClientError::Status {
            status: 401,
            body: "no cookies found for investors.com".to_string(),
        })?;

    for cookie in cookies {
        let cookie_str = format!("{}={}", cookie.name, cookie.value);
        jar.add_cookie_str(&cookie_str, &url);
    }

    Ok(jar)
}

#[cfg(test)]
mod tests {
    use super::build_cookie_jar;
    use super::extract_cookies;
    use rookie::common::enums::Cookie;

    #[test]
    fn extract_cookies_signature_compiles() {
        let _fn_ptr: fn() -> crate::error::Result<Vec<Cookie>> = extract_cookies;
    }

    #[test]
    fn build_cookie_jar_signature_compiles() {
        let _fn_ptr: fn(&[Cookie]) -> crate::error::Result<reqwest::cookie::Jar> = build_cookie_jar;
    }

    #[test]
    fn build_cookie_jar_accepts_empty_cookie_list() {
        let jar = build_cookie_jar(&[]).expect("empty cookie jar should build");
        let _ = jar;
    }

    #[cfg(not(coverage))]
    #[test]
    #[ignore]
    fn extract_cookies_works_with_live_firefox_session() {
        let cookies = extract_cookies().expect("expected Firefox cookies for investors.com");
        let jar = build_cookie_jar(&cookies).expect("expected cookie jar to build");
        let _ = jar;
    }
}