starbase_utils 0.12.9

General fs, io, serde, net, etc, utilities.
Documentation
use starbase_sandbox::create_empty_sandbox;
use starbase_utils::net;
use std::collections::HashMap;

fn headers_with_custom_header() -> HashMap<String, String> {
    let mut headers = HashMap::new();
    headers.insert(
        "X-Proto-Test-Header".to_string(),
        "proto-starbase-headers-test".to_string(),
    );
    headers
}

mod download {
    use super::*;

    #[test]
    fn checks_online() {
        assert!(!net::is_offline_with_options(Default::default()));
    }

    #[should_panic(expected = "UrlParseFailed")]
    #[tokio::test]
    async fn errors_invalid_url() {
        let sandbox = create_empty_sandbox();

        net::download_from_url(
            "raw.githubusercontent.com/moonrepo/starbase/master/README.md",
            sandbox.path().join("README.md"),
        )
        .await
        .unwrap();
    }

    #[should_panic(expected = "UrlNotFound")]
    #[tokio::test]
    async fn errors_not_found() {
        let sandbox = create_empty_sandbox();

        net::download_from_url(
            "https://raw.githubusercontent.com/moonrepo/starbase/master/UNKNOWN_FILE.md",
            sandbox.path().join("README.md"),
        )
        .await
        .unwrap();
    }

    #[tokio::test]
    async fn downloads_a_file() {
        let sandbox = create_empty_sandbox();
        let dest_file = sandbox.path().join("README.md");

        assert!(!dest_file.exists());

        net::download_from_url(
            "https://raw.githubusercontent.com/moonrepo/starbase/master/README.md",
            &dest_file,
        )
        .await
        .unwrap();

        assert!(dest_file.exists());
        assert_ne!(dest_file.metadata().unwrap().len(), 0);
    }

    #[tokio::test]
    async fn downloads_with_options_headers() {
        let sandbox = create_empty_sandbox();
        let dest_file = sandbox.path().join("headers.json");

        net::download_from_url_with_options(
            "https://httpbin.org/headers",
            &dest_file,
            net::DownloadOptions {
                downloader: Some(Box::new(
                    net::DefaultDownloader::new_with_headers(headers_with_custom_header()).unwrap(),
                )),
                ..Default::default()
            },
        )
        .await
        .unwrap();

        let body = std::fs::read_to_string(&dest_file).unwrap();
        assert!(
            body.contains("proto-starbase-headers-test"),
            "expected response to contain custom header value, got: {body}"
        );
    }
}