Skip to content

Commit 05fbbe5

Browse files
committed
dev: add test cases for BEGIN & END statements
1 parent 6e55668 commit 05fbbe5

1 file changed

Lines changed: 168 additions & 0 deletions

File tree

libsql-server/tests/namespaces/dumps.rs

Lines changed: 168 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -425,3 +425,171 @@ fn load_dump_with_invalid_sql() {
425425

426426
sim.run().unwrap();
427427
}
428+
429+
#[test]
430+
fn load_dump_with_trigger() {
431+
const DUMP: &str = r#"
432+
BEGIN TRANSACTION;
433+
CREATE TABLE test (x);
434+
CREATE TRIGGER simple_trigger
435+
AFTER INSERT ON test
436+
BEGIN
437+
INSERT INTO test VALUES (999);
438+
END;
439+
INSERT INTO test VALUES (1);
440+
COMMIT;"#;
441+
442+
let mut sim = Builder::new()
443+
.simulation_duration(Duration::from_secs(1000))
444+
.build();
445+
let tmp = tempdir().unwrap();
446+
let tmp_path = tmp.path().to_path_buf();
447+
448+
std::fs::write(tmp_path.join("dump.sql"), DUMP).unwrap();
449+
450+
make_primary(&mut sim, tmp.path().to_path_buf());
451+
452+
sim.client("client", async move {
453+
let client = Client::new();
454+
455+
let resp = client
456+
.post(
457+
"http://primary:9090/v1/namespaces/debug_test/create",
458+
json!({ "dump_url": format!("file:{}", tmp_path.join("dump.sql").display())}),
459+
)
460+
.await
461+
.unwrap();
462+
assert_eq!(resp.status(), StatusCode::OK);
463+
464+
let db = Database::open_remote_with_connector("http://debug_test.primary:8080", "", TurmoilConnector)?;
465+
let conn = db.connect()?;
466+
467+
// Original INSERT: 1, Trigger INSERT: 999 = 2 total rows
468+
let mut rows = conn.query("SELECT COUNT(*) FROM test", ()).await?;
469+
let row = rows.next().await?.unwrap();
470+
assert_eq!(row.get::<i64>(0)?, 2);
471+
472+
Ok(())
473+
});
474+
475+
sim.run().unwrap();
476+
}
477+
478+
#[test]
479+
fn load_dump_with_case_trigger() {
480+
const DUMP: &str = r#"
481+
BEGIN TRANSACTION;
482+
CREATE TABLE test (id INTEGER, rate REAL DEFAULT 0.0);
483+
CREATE TRIGGER case_trigger
484+
AFTER INSERT ON test
485+
BEGIN
486+
UPDATE test
487+
SET rate =
488+
CASE
489+
WHEN NEW.id = 1
490+
THEN 0.1
491+
ELSE 0.0
492+
END
493+
WHERE id = NEW.id;
494+
END;
495+
496+
INSERT INTO test (id) VALUES (1);
497+
COMMIT;"#;
498+
499+
let mut sim = Builder::new()
500+
.simulation_duration(Duration::from_secs(1000))
501+
.build();
502+
let tmp = tempdir().unwrap();
503+
let tmp_path = tmp.path().to_path_buf();
504+
505+
std::fs::write(tmp_path.join("dump.sql"), DUMP).unwrap();
506+
507+
make_primary(&mut sim, tmp.path().to_path_buf());
508+
509+
sim.client("client", async move {
510+
let client = Client::new();
511+
512+
let resp = client
513+
.post(
514+
"http://primary:9090/v1/namespaces/case_test/create",
515+
json!({ "dump_url": format!("file:{}", tmp_path.join("dump.sql").display())}),
516+
)
517+
.await
518+
.unwrap();
519+
assert_eq!(resp.status(), StatusCode::OK);
520+
521+
let db = Database::open_remote_with_connector("http://case_test.primary:8080", "", TurmoilConnector)?;
522+
let conn = db.connect()?;
523+
524+
let mut rows = conn.query("SELECT id, rate FROM test", ()).await?;
525+
let row = rows.next().await?.unwrap();
526+
assert_eq!(row.get::<i64>(0)?, 1);
527+
assert!((row.get::<f64>(1)? - 0.1).abs() < 0.001);
528+
529+
Ok(())
530+
});
531+
532+
sim.run().unwrap();
533+
}
534+
535+
#[test]
536+
fn load_dump_with_nested_case() {
537+
const DUMP: &str = r#"
538+
BEGIN TRANSACTION;
539+
CREATE TABLE orders (id INTEGER, amount REAL, status TEXT);
540+
CREATE TRIGGER nested_trigger
541+
AFTER UPDATE ON orders
542+
BEGIN
543+
UPDATE orders
544+
SET amount =
545+
CASE
546+
WHEN NEW.status = 'completed'
547+
THEN
548+
CASE
549+
WHEN OLD.id = 1
550+
THEN OLD.amount * 0.9
551+
ELSE OLD.amount * 0.8
552+
END
553+
ELSE OLD.amount
554+
END
555+
WHERE id = NEW.id;
556+
END;
557+
558+
INSERT INTO orders (id, amount, status) VALUES (1, 100.0, 'pending');
559+
COMMIT;"#;
560+
561+
let mut sim = Builder::new()
562+
.simulation_duration(Duration::from_secs(1000))
563+
.build();
564+
let tmp = tempdir().unwrap();
565+
let tmp_path = tmp.path().to_path_buf();
566+
567+
std::fs::write(tmp_path.join("dump.sql"), DUMP).unwrap();
568+
569+
make_primary(&mut sim, tmp.path().to_path_buf());
570+
571+
sim.client("client", async move {
572+
let client = Client::new();
573+
574+
let resp = client
575+
.post(
576+
"http://primary:9090/v1/namespaces/nested_test/create",
577+
json!({ "dump_url": format!("file:{}", tmp_path.join("dump.sql").display())}),
578+
)
579+
.await
580+
.unwrap();
581+
assert_eq!(resp.status(), StatusCode::OK);
582+
583+
let db = Database::open_remote_with_connector("http://nested_test.primary:8080", "", TurmoilConnector)?;
584+
let conn = db.connect()?;
585+
586+
conn.execute("UPDATE orders SET status = 'completed' WHERE id = 1", ()).await?;
587+
let mut rows = conn.query("SELECT amount FROM orders WHERE id = 1", ()).await?;
588+
let row = rows.next().await?.unwrap();
589+
assert!((row.get::<f64>(0)? - 90.0).abs() < 0.001);
590+
591+
Ok(())
592+
});
593+
594+
sim.run().unwrap();
595+
}

0 commit comments

Comments
 (0)