feat: test http server api (#21)

* feat: adds http server test

* feat: limit sql output to 10 rows
This commit is contained in:
dennis zhuang
2022-05-09 14:54:03 +08:00
committed by GitHub
parent 8cc10b36db
commit df1a99e27f
6 changed files with 542 additions and 101 deletions

View File

@@ -20,6 +20,9 @@ tokio = { version = "1.18", features = ["full"] }
tower = { version = "0.4", features = ["full"]}
tower-http = { version ="0.3", features = ["full"]}
[dev-dependencies]
axum-test-helper = "0.1"
[dev-dependencies.arrow]
package = "arrow2"
version="0.10"

View File

@@ -1,7 +1,7 @@
mod catalog;
pub mod catalog;
pub mod datanode;
mod error;
mod instance;
mod server;
pub mod error;
pub mod instance;
pub mod server;
pub use crate::datanode::DataNode;

View File

@@ -1,5 +1,5 @@
mod grpc;
mod http;
pub mod grpc;
pub mod http;
use http::HttpServer;

View File

@@ -25,13 +25,13 @@ pub struct HttpServer {
instance: InstanceRef,
}
#[derive(Serialize)]
#[derive(Serialize, Debug)]
pub enum JsonOutput {
AffectedRows(usize),
Rows(Vec<RecordBatch>),
}
#[derive(Serialize)]
#[derive(Serialize, Debug)]
pub struct JsonResponse {
success: bool,
#[serde(skip_serializing_if = "Option::is_none")]
@@ -90,15 +90,19 @@ impl HttpServer {
Self { instance }
}
pub async fn start(&self) -> Result<()> {
let app = Router::new().route("/sql", get(handler::sql)).layer(
pub fn make_app(&self) -> Router {
Router::new().route("/sql", get(handler::sql)).layer(
ServiceBuilder::new()
.layer(HandleErrorLayer::new(handle_error))
.layer(TraceLayer::new_for_http())
.layer(Extension(self.instance.clone()))
// TODO configure timeout
.layer(TimeoutLayer::new(Duration::from_secs(30))),
);
)
}
pub async fn start(&self) -> Result<()> {
let app = self.make_app();
let addr = SocketAddr::from(([0, 0, 0, 0], 3000));
// TODO(dennis): log

View File

@@ -0,0 +1,43 @@
//! http server test
use std::sync::Arc;
use axum::http::StatusCode;
use axum::Router;
use axum_test_helper::TestClient;
use datanode::{instance::Instance, server::http::HttpServer};
use query::catalog::memory;
fn make_test_app() -> Router {
let catalog_list = memory::new_memory_catalog_list().unwrap();
let instance = Arc::new(Instance::new(catalog_list));
let http_server = HttpServer::new(instance);
http_server.make_app()
}
#[tokio::test]
async fn test_sql_api() {
let app = make_test_app();
let client = TestClient::new(app);
let res = client.get("/sql").send().await;
assert_eq!(res.status(), StatusCode::OK);
// TODO(dennis): deserialize to json response
let body = res.text().await;
assert_eq!(
body,
r#"{"success":false,"error":"sql parameter is required."}"#
);
let res = client
.get("/sql?sql=select * from numbers limit 10")
.send()
.await;
assert_eq!(res.status(), StatusCode::OK);
let body = res.text().await;
assert_eq!(
body,
r#"{"success":true,"output":{"Rows":[{"schema":{"fields":[{"name":"number","data_type":"UInt32","is_nullable":false,"metadata":{}}],"metadata":{}},"columns":[{"UInt32":[0,1,2,3,4,5,6,7,8,9]}]}]}}"#
);
}