use super::*; #[test] fn application_run_keeps_database_between_commands_and_removes_only_its_binary() { let directory = Directory::new(); let target = directory.0.join("module/demo/account"); std::fs::create_dir_all(&target).unwrap(); let source = fixture() .with_file_name("database") .join("module/demo/account"); for name in ["api.dever", "model.dever", "app.dever"] { std::fs::copy(source.join(name), target.join(name)).unwrap(); } std::fs::create_dir(directory.0.join("config")).unwrap(); std::fs::create_dir(directory.0.join("data")).unwrap(); std::fs::write(directory.0.join("data/keep.txt"), "keep").unwrap(); std::fs::write(directory.0.join("config/setting.json"), r#"{"database":{"default":{"type":"sqlite","path":"data/account.db","max_connections":1}}}"#).unwrap(); let run = |name: &str, input: &str| { Command::new(env!("CARGO_BIN_EXE_dever")) .arg("run") .arg(&directory.0) .args(["--", name, input]) .output() .unwrap() }; let created = run("demo.account.create", r#"{"name":"persistent"}"#); assert!( created.status.success(), "{}", String::from_utf8_lossy(&created.stderr) ); assert!(directory.0.join("data/account.db").is_file()); let count = run("demo.account.count", "{}"); assert!(count.status.success()); assert_eq!( serde_json::from_slice::(&count.stdout).unwrap()["data"], 1 ); let failed = run( "demo.account.explode", r#"{"name":"rolled back","value":9223372036854775807}"#, ); assert!(!failed.status.success()); let count = run("demo.account.count", "{}"); assert!(count.status.success()); assert_eq!( serde_json::from_slice::(&count.stdout).unwrap()["data"], 1 ); assert_eq!( std::fs::read_to_string(directory.0.join("data/keep.txt")).unwrap(), "keep" ); assert!(std::fs::read_dir(&directory.0).unwrap().all(|entry| { !entry .unwrap() .file_name() .to_string_lossy() .starts_with(".dever-run-") })); }