Skip to content

Commit 8f0f58c

Browse files
committed
sqld: add invalid sql dump test
1 parent 3c62bd7 commit 8f0f58c

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

libsql-server/tests/namespaces/dumps.rs

Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,3 +352,76 @@ fn load_dump_with_attach_rejected() {
352352

353353
sim.run().unwrap();
354354
}
355+
356+
#[test]
357+
fn load_dump_with_invalid_sql() {
358+
const DUMP: &str = r#"
359+
PRAGMA foreign_keys=OFF;
360+
BEGIN TRANSACTION;
361+
CREATE TABLE test (x);
362+
INSERT INTO test VALUES(42);
363+
SELECT abs(-9223372036854775808)
364+
COMMIT;"#;
365+
366+
let mut sim = Builder::new()
367+
.simulation_duration(Duration::from_secs(1000))
368+
.build();
369+
let tmp = tempdir().unwrap();
370+
let tmp_path = tmp.path().to_path_buf();
371+
372+
std::fs::write(tmp_path.join("dump.sql"), DUMP).unwrap();
373+
374+
make_primary(&mut sim, tmp.path().to_path_buf());
375+
376+
sim.client("client", async move {
377+
let client = Client::new();
378+
379+
// path is not absolute is an error
380+
let resp = client
381+
.post(
382+
"http://primary:9090/v1/namespaces/foo/create",
383+
json!({ "dump_url": "file:dump.sql"}),
384+
)
385+
.await
386+
.unwrap();
387+
assert_eq!(resp.status(), StatusCode::BAD_REQUEST);
388+
389+
// path doesn't exist is an error
390+
let resp = client
391+
.post(
392+
"http://primary:9090/v1/namespaces/foo/create",
393+
json!({ "dump_url": "file:/dump.sql"}),
394+
)
395+
.await
396+
.unwrap();
397+
assert_eq!(resp.status(), StatusCode::BAD_REQUEST);
398+
399+
let resp = client
400+
.post(
401+
"http://primary:9090/v1/namespaces/foo/create",
402+
json!({ "dump_url": format!("file:{}", tmp_path.join("dump.sql").display())}),
403+
)
404+
.await
405+
.unwrap();
406+
assert_eq!(
407+
resp.status(),
408+
StatusCode::BAD_REQUEST,
409+
"{}",
410+
resp.json::<serde_json::Value>().await.unwrap_or_default()
411+
);
412+
413+
assert_snapshot!(resp.body_string().await?);
414+
415+
let foo =
416+
Database::open_remote_with_connector("http://foo.primary:8080", "", TurmoilConnector)?;
417+
let foo_conn = foo.connect()?;
418+
419+
let res = foo_conn.query("select count(*) from test", ()).await;
420+
// This should error since the dump should have failed!
421+
assert!(res.is_err());
422+
423+
Ok(())
424+
});
425+
426+
sim.run().unwrap();
427+
}
Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
---
2+
source: libsql-server/tests/namespaces/dumps.rs
3+
expression: resp.body_string().await?
4+
snapshot_kind: text
5+
---
6+
{"error":"The passed dump sql is invalid: msg: near \"COMMIT\": syntax error, sql: SELECT abs(-9223372036854775808) \n COMMIT;, offset: 43"}

0 commit comments

Comments
 (0)