From 7873afa11dc7c076ba384f1307117d372a0f0dcb Mon Sep 17 00:00:00 2001 From: Robert Pack Date: Sun, 24 Apr 2022 01:07:49 +0200 Subject: [PATCH] towards e2e tests --- azure-kusto-data/Cargo.toml | 5 +- azure-kusto-data/tests/e2e.rs | 38 ++++++++ .../tests/inputs/e2e/01_prepare_table.kql | 3 + .../tests/inputs/e2e/02_drop_table.kql | 1 + azure-kusto-data/tests/setup.rs | 91 +++++++++++++++++++ scripts/format_json.sh | 1 + .../0_request.json | 15 +++ .../0_response.json | 14 +++ .../1_request.json | 15 +++ .../1_response.json | 14 +++ 10 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 azure-kusto-data/tests/e2e.rs create mode 100644 azure-kusto-data/tests/inputs/e2e/01_prepare_table.kql create mode 100644 azure-kusto-data/tests/inputs/e2e/02_drop_table.kql create mode 100644 azure-kusto-data/tests/setup.rs create mode 100755 scripts/format_json.sh create mode 100644 test/transactions/data_create_query_delete_table/0_request.json create mode 100644 test/transactions/data_create_query_delete_table/0_response.json create mode 100644 test/transactions/data_create_query_delete_table/1_request.json create mode 100644 test/transactions/data_create_query_delete_table/1_response.json diff --git a/azure-kusto-data/Cargo.toml b/azure-kusto-data/Cargo.toml index 2de3e8e..9a0acca 100644 --- a/azure-kusto-data/Cargo.toml +++ b/azure-kusto-data/Cargo.toml @@ -39,11 +39,14 @@ time = { version = "0.3.9", features = [ ] } [dev-dependencies] +dotenv = "*" env_logger = "0.9" tokio = { version = "1", features = ["macros"] } +chrono = "*" +oauth2 = "*" [features] -default = ["arrow"] +default = ["arrow", "mock_transport_framework"] mock_transport_framework = ["azure_core/mock_transport_framework"] #into_future = [] TODO - properly turn it on test_e2e = [] diff --git a/azure-kusto-data/tests/e2e.rs b/azure-kusto-data/tests/e2e.rs new file mode 100644 index 0000000..6a301c1 --- /dev/null +++ b/azure-kusto-data/tests/e2e.rs @@ -0,0 +1,38 @@ +#![cfg(feature = "mock_transport_framework")] +use dotenv::dotenv; +use std::fs; +use std::path::Path; +mod setup; + +#[tokio::test] +#[ignore] +async fn create_query_delete_table() { + dotenv().ok(); + + let cargo_root = std::env::var("CARGO_MANIFEST_DIR").expect("Set by cargo"); + let kql_root = Path::new(&cargo_root).join("tests/inputs/e2e"); + + let (client, database) = setup::create_kusto_client("data_create_query_delete_table") + .await + .unwrap(); + + let filename = kql_root.join("01_prepare_table.kql"); + let query = fs::read_to_string(filename).expect("Something went wrong reading the file"); + let response = client + .execute_command(&database, query) + .into_future() + .await + .unwrap(); + + println!("{:?}", response); + + let filename = kql_root.join("02_drop_table.kql"); + let query = fs::read_to_string(filename).expect("Something went wrong reading the file"); + let response = client + .execute_command(&database, query) + .into_future() + .await + .unwrap(); + + println!("{:?}", response) +} diff --git a/azure-kusto-data/tests/inputs/e2e/01_prepare_table.kql b/azure-kusto-data/tests/inputs/e2e/01_prepare_table.kql new file mode 100644 index 0000000..6956e86 --- /dev/null +++ b/azure-kusto-data/tests/inputs/e2e/01_prepare_table.kql @@ -0,0 +1,3 @@ +.set KustoRsTest <| +let text="Hello, World!"; +print str=text diff --git a/azure-kusto-data/tests/inputs/e2e/02_drop_table.kql b/azure-kusto-data/tests/inputs/e2e/02_drop_table.kql new file mode 100644 index 0000000..ef96613 --- /dev/null +++ b/azure-kusto-data/tests/inputs/e2e/02_drop_table.kql @@ -0,0 +1 @@ +.drop table KustoRsTest diff --git a/azure-kusto-data/tests/setup.rs b/azure-kusto-data/tests/setup.rs new file mode 100644 index 0000000..90c8e04 --- /dev/null +++ b/azure-kusto-data/tests/setup.rs @@ -0,0 +1,91 @@ +#![cfg(feature = "mock_transport_framework")] +use azure_core::auth::{TokenCredential, TokenResponse}; +use azure_core::Error as CoreError; +use azure_identity::token_credentials::{ClientSecretCredential, TokenCredentialOptions}; +use azure_kusto_data::client::{KustoClient, KustoClientOptions}; +use chrono::Utc; +use oauth2::AccessToken; +use std::error::Error; +use std::sync::Arc; + +pub struct DummyCredential {} + +#[async_trait::async_trait] +impl TokenCredential for DummyCredential { + async fn get_token(&self, _resource: &str) -> Result { + Ok(TokenResponse::new( + AccessToken::new("some dummy token".to_string()), + Utc::now(), + )) + } +} + +pub async fn create_kusto_client( + transaction_name: &str, +) -> Result<(KustoClient, String), Box> { + let client_id = (std::env::var(azure_core::mock::TESTING_MODE_KEY).as_deref() + == Ok(azure_core::mock::TESTING_MODE_RECORD)) + .then(get_client_id) + .unwrap_or_else(String::new); + + let client_secret = (std::env::var(azure_core::mock::TESTING_MODE_KEY).as_deref() + == Ok(azure_core::mock::TESTING_MODE_RECORD)) + .then(get_client_secret) + .unwrap_or_else(String::new); + + let tenant_id = (std::env::var(azure_core::mock::TESTING_MODE_KEY).as_deref() + == Ok(azure_core::mock::TESTING_MODE_RECORD)) + .then(get_tenant_id) + .unwrap_or_else(String::new); + + let service_url = (std::env::var(azure_core::mock::TESTING_MODE_KEY).as_deref() + == Ok(azure_core::mock::TESTING_MODE_RECORD)) + .then(get_service_url) + .unwrap_or_else(String::new); + + let database = (std::env::var(azure_core::mock::TESTING_MODE_KEY).as_deref() + == Ok(azure_core::mock::TESTING_MODE_RECORD)) + .then(get_database) + .unwrap_or_else(String::new); + + let options = KustoClientOptions::new_with_transaction_name(transaction_name.to_string()); + + let credential: Arc = if std::env::var(azure_core::mock::TESTING_MODE_KEY) + .as_deref() + == Ok(azure_core::mock::TESTING_MODE_RECORD) + { + Arc::new(ClientSecretCredential::new( + tenant_id.to_string(), + client_id.to_string(), + client_secret.to_string(), + TokenCredentialOptions::default(), + )) + } else { + Arc::new(DummyCredential {}) + }; + + Ok(( + KustoClient::new_with_options(service_url, credential, options).unwrap(), + database, + )) +} + +fn get_service_url() -> String { + std::env::var("KUSTO_SERVICE_URL").expect("Set env variable KUSTO_SERVICE_URL first!") +} + +fn get_database() -> String { + std::env::var("KUSTO_DATABASE").expect("Set env variable KUSTO_DATABASE first!") +} + +fn get_client_id() -> String { + std::env::var("AZURE_CLIENT_ID").expect("Set env variable AZURE_CLIENT_ID first!") +} + +fn get_client_secret() -> String { + std::env::var("AZURE_CLIENT_SECRET").expect("Set env variable AZURE_CLIENT_SECRET first!") +} + +fn get_tenant_id() -> String { + std::env::var("AZURE_TENANT_ID").expect("Set env variable AZURE_TENANT_ID first!") +} diff --git a/scripts/format_json.sh b/scripts/format_json.sh new file mode 100755 index 0000000..1d0dfb7 --- /dev/null +++ b/scripts/format_json.sh @@ -0,0 +1 @@ +find test -name "*.json" -exec bash -c 'jq . {} > {}.tmp && mv {}.tmp {}' \; \ No newline at end of file diff --git a/test/transactions/data_create_query_delete_table/0_request.json b/test/transactions/data_create_query_delete_table/0_request.json new file mode 100644 index 0000000..5da98bb --- /dev/null +++ b/test/transactions/data_create_query_delete_table/0_request.json @@ -0,0 +1,15 @@ +{ + "uri": "/v1/rest/mgmt", + "method": "POST", + "headers": { + "accept": "application/json", + "accept-encoding": "gzip", + "authorization": "<>", + "content-length": "86", + "content-type": "application/json; charset=utf-8", + "user-agent": "azsdk-rust-azure-kusto-data/0.1.0 (1.59.0; linux; x86_64)", + "x-ms-client-version": "Kusto.Rust.Client:0.1.0", + "x-ms-version": "2019-02-13" + }, + "body": "eyJkYiI6ImN0bmEiLCJjc2wiOiIuc2V0IEt1c3RvUnNUZXN0IDx8XG5sZXQgdGV4dD1cIkhlbGxvLCBXb3JsZCFcIjtcbnByaW50IHN0cj10ZXh0In0=" +} diff --git a/test/transactions/data_create_query_delete_table/0_response.json b/test/transactions/data_create_query_delete_table/0_response.json new file mode 100644 index 0000000..9a1826d --- /dev/null +++ b/test/transactions/data_create_query_delete_table/0_response.json @@ -0,0 +1,14 @@ +{ + "status": 200, + "headers": { + "content-type": "application/json; charset=UTF-8", + "date": "Sat, 23 Apr 2022 23:01:55 GMT", + "server": "Microsoft-HTTPAPI/2.0", + "strict-transport-security": "max-age=15724800; includeSubDomains", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-ms-activity-id": "8ed01694-6c7b-48a9-a38b-d31aace619b0", + "x-ms-client-request-id": "unspecified;43c0cb94-5281-4ccf-89d5-98fcbb8d2214" + }, + "body": "eyJUYWJsZXMiOlt7IlRhYmxlTmFtZSI6IlRhYmxlXzAiLCJDb2x1bW5zIjpbeyJDb2x1bW5OYW1lIjoiRXh0ZW50SWQiLCJEYXRhVHlwZSI6Ikd1aWQiLCJDb2x1bW5UeXBlIjoiZ3VpZCJ9LHsiQ29sdW1uTmFtZSI6Ik9yaWdpbmFsU2l6ZSIsIkRhdGFUeXBlIjoiRG91YmxlIiwiQ29sdW1uVHlwZSI6InJlYWwifSx7IkNvbHVtbk5hbWUiOiJFeHRlbnRTaXplIiwiRGF0YVR5cGUiOiJEb3VibGUiLCJDb2x1bW5UeXBlIjoicmVhbCJ9LHsiQ29sdW1uTmFtZSI6IkNvbXByZXNzZWRTaXplIiwiRGF0YVR5cGUiOiJEb3VibGUiLCJDb2x1bW5UeXBlIjoicmVhbCJ9LHsiQ29sdW1uTmFtZSI6IkluZGV4U2l6ZSIsIkRhdGFUeXBlIjoiRG91YmxlIiwiQ29sdW1uVHlwZSI6InJlYWwifSx7IkNvbHVtbk5hbWUiOiJSb3dDb3VudCIsIkRhdGFUeXBlIjoiSW50NjQiLCJDb2x1bW5UeXBlIjoibG9uZyJ9XSwiUm93cyI6W1siNzA4MjhhODAtZmM0YS00MmNiLWI4ZDMtNGMzN2Y2MjM0MjczIiwyMS4wLDMzNS4wLDEyOC4wLDIwNy4wLDFdXX1dfQ==" +} diff --git a/test/transactions/data_create_query_delete_table/1_request.json b/test/transactions/data_create_query_delete_table/1_request.json new file mode 100644 index 0000000..a87951b --- /dev/null +++ b/test/transactions/data_create_query_delete_table/1_request.json @@ -0,0 +1,15 @@ +{ + "uri": "/v1/rest/mgmt", + "method": "POST", + "headers": { + "accept": "application/json", + "accept-encoding": "gzip", + "authorization": "<>", + "content-length": "45", + "content-type": "application/json; charset=utf-8", + "user-agent": "azsdk-rust-azure-kusto-data/0.1.0 (1.59.0; linux; x86_64)", + "x-ms-client-version": "Kusto.Rust.Client:0.1.0", + "x-ms-version": "2019-02-13" + }, + "body": "eyJkYiI6ImN0bmEiLCJjc2wiOiIuZHJvcCB0YWJsZSBLdXN0b1JzVGVzdCJ9" +} diff --git a/test/transactions/data_create_query_delete_table/1_response.json b/test/transactions/data_create_query_delete_table/1_response.json new file mode 100644 index 0000000..3a48546 --- /dev/null +++ b/test/transactions/data_create_query_delete_table/1_response.json @@ -0,0 +1,14 @@ +{ + "status": 200, + "headers": { + "content-type": "application/json; charset=UTF-8", + "date": "Sat, 23 Apr 2022 23:01:55 GMT", + "server": "Microsoft-HTTPAPI/2.0", + "strict-transport-security": "max-age=15724800; includeSubDomains", + "transfer-encoding": "chunked", + "vary": "Accept-Encoding", + "x-ms-activity-id": "3fa85740-2a34-4fbb-b048-defd4483a2b5", + "x-ms-client-request-id": "unspecified;c0407779-644b-49b2-a8ff-37ab1c327f06" + }, + "body": "eyJUYWJsZXMiOlt7IlRhYmxlTmFtZSI6IlRhYmxlXzAiLCJDb2x1bW5zIjpbeyJDb2x1bW5OYW1lIjoiVGFibGVOYW1lIiwiRGF0YVR5cGUiOiJTdHJpbmciLCJDb2x1bW5UeXBlIjoic3RyaW5nIn0seyJDb2x1bW5OYW1lIjoiRGF0YWJhc2VOYW1lIiwiRGF0YVR5cGUiOiJTdHJpbmciLCJDb2x1bW5UeXBlIjoic3RyaW5nIn0seyJDb2x1bW5OYW1lIjoiRm9sZGVyIiwiRGF0YVR5cGUiOiJTdHJpbmciLCJDb2x1bW5UeXBlIjoic3RyaW5nIn0seyJDb2x1bW5OYW1lIjoiRG9jU3RyaW5nIiwiRGF0YVR5cGUiOiJTdHJpbmciLCJDb2x1bW5UeXBlIjoic3RyaW5nIn1dLCJSb3dzIjpbXX1dfQ==" +}