mirror of
https://github.com/GreptimeTeam/greptimedb.git
synced 2026-01-07 22:02:56 +00:00
feat: test http server api (#21)
* feat: adds http server test * feat: limit sql output to 10 rows
This commit is contained in:
@@ -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"
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
mod grpc;
|
||||
mod http;
|
||||
pub mod grpc;
|
||||
pub mod http;
|
||||
|
||||
use http::HttpServer;
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
43
src/datanode/tests/http_test.rs
Normal file
43
src/datanode/tests/http_test.rs
Normal 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]}]}]}}"#
|
||||
);
|
||||
}
|
||||
Reference in New Issue
Block a user