use reqwest::Client;
use wiremock::matchers::{method, path};
use wiremock::{Mock, MockServer, ResponseTemplate};

// regression tests for https://github.com/LukeMathWalker/wiremock-rs/issues/7
// running both tests will _sometimes_ trigger a hang if the runtimes aren't separated correctly

#[tokio::test]
async fn hello_reqwest() {
    let mock_server = MockServer::start().await;

    Mock::given(method("GET"))
        .and(path("/"))
        .respond_with(ResponseTemplate::new(200))
        .mount(&mock_server)
        .await;

    let resp = Client::new().get(&mock_server.uri()).send().await.unwrap();

    assert_eq!(resp.status(), 200);
}

#[tokio::test]
async fn hello_surf() {
    let mock_server = MockServer::start().await;

    Mock::given(method("GET"))
        .and(path("/"))
        .respond_with(ResponseTemplate::new(200))
        .mount(&mock_server)
        .await;

    let status = surf::get(&mock_server.uri()).await.unwrap().status();

    assert_eq!(status, 200);
}

#[actix_rt::test]
async fn hello_reqwest_actix() {
    let mock_server = MockServer::start().await;

    Mock::given(method("GET"))
        .and(path("/"))
        .respond_with(ResponseTemplate::new(200))
        .mount(&mock_server)
        .await;

    let resp = Client::new().get(&mock_server.uri()).send().await.unwrap();

    assert_eq!(resp.status(), 200);
}

#[tokio::test]
async fn hello_reqwest_http2() {
    let mock_server = MockServer::start().await;

    Mock::given(method("GET"))
        .and(path("/"))
        .respond_with(ResponseTemplate::new(200))
        .mount(&mock_server)
        .await;

    let resp = Client::builder()
        .http2_prior_knowledge()
        .build()
        .expect("http client")
        .get(&mock_server.uri())
        .send()
        .await
        .expect("response");

    assert_eq!(resp.status(), 200);
    assert_eq!(resp.version(), reqwest::Version::HTTP_2);
}
