mod issues;

use dagger_sdk::{connect, ContainerExecOptsBuilder};
use pretty_assertions::assert_eq;

#[tokio::test]
async fn test_example_container() {
    let client = connect().await.unwrap();

    let alpine = client.container().from("alpine:3.16.2");

    let out = alpine
        .exec_opts(
            ContainerExecOptsBuilder::default()
                .args(vec!["cat", "/etc/alpine-release"])
                .build()
                .unwrap(),
        )
        .stdout()
        .await
        .unwrap();

    assert_eq!(out, "3.16.2\n".to_string())
}

#[tokio::test]
async fn test_directory() {
    let c = connect().await.unwrap();

    let contents = c
        .directory()
        .with_new_file("/hello.txt", "world")
        .file("/hello.txt")
        .contents()
        .await
        .unwrap();

    assert_eq!("world", contents)
}

#[tokio::test]
async fn test_git() {
    let c = connect().await.unwrap();

    let tree = c.git("github.com/dagger/dagger").branch("main").tree();

    let _ = tree
        .entries()
        .await
        .unwrap()
        .iter()
        .find(|f| f.as_str() == "README.md")
        .unwrap();

    let readme_file = tree.file("README.md");

    let readme = readme_file.contents().await.unwrap();
    assert_eq!(true, readme.find("Dagger").is_some());

    let readme_id = readme_file.id().await.unwrap();
    let other_readme = c.file(readme_id).contents().await.unwrap();

    assert_eq!(readme, other_readme);
}

#[tokio::test]
async fn test_container() {
    let client = connect().await.unwrap();

    let alpine = client.container().from("alpine:3.16.2");

    let contents = alpine
        .fs()
        .file("/etc/alpine-release")
        .contents()
        .await
        .unwrap();
    assert_eq!(contents, "3.16.2\n".to_string());

    let out = alpine
        .exec_opts(
            ContainerExecOptsBuilder::default()
                .args(vec!["cat", "/etc/alpine-release"])
                .build()
                .unwrap(),
        )
        .stdout()
        .await
        .unwrap();
    assert_eq!(out, "3.16.2\n".to_string());

    let id = alpine.id().await.unwrap();
    let contents = client
        .container_opts(dagger_sdk::QueryContainerOpts {
            id: Some(id),
            platform: None,
        })
        .fs()
        .file("/etc/alpine-release")
        .contents()
        .await
        .unwrap();
    assert_eq!(contents, "3.16.2\n".to_string());
}

#[tokio::test]
async fn test_err_message() {
    let client = connect().await.unwrap();

    let alpine = client.container().from("fake.invalid:latest").id().await;
    assert_eq!(alpine.is_err(), true);
    let err = alpine.expect_err("Tests expect err");

    let error_msg = r#"
GQLClient Error: Look at json field for more details
Message: pull access denied, repository does not exist or may require authorization: server message: insufficient_scope: authorization failed
"#;

    assert_eq!(err.to_string().as_str(), error_msg);
}
