use super::*;
use std::sync::Arc;
fn database() -> (tempfile::TempDir, Arc<wsb::persist::global::service::DatabaseService>) {
let dir = tempfile::tempdir().expect("a scratch directory");
let config = wsb::persist::global::config::DatabaseConfig {
db_max_connections: 2,
..wsb::persist::global::config::DatabaseConfig::new(&dir.path().join("wsb.db"))
};
let service = Arc::new(
wsb::persist::global::service::DatabaseService::new(&config).expect("a database"),
);
service.run_migrations().expect("the schema is current");
(dir, service)
}
fn save(service: &Arc<wsb::persist::global::service::DatabaseService>, worktree: &str, json: &str) {
let conn = service.get_connection().expect("a connection");
conn.execute(UPSERT_LAYOUT, rusqlite::params![worktree, json]).expect("the layout is saved");
}
fn read(service: &Arc<wsb::persist::global::service::DatabaseService>, worktree: &str) -> Option<String> {
use rusqlite::OptionalExtension;
let conn = service.get_connection().expect("a connection");
conn.query_row(SELECT_LAYOUT, [worktree], |row| row.get::<_, String>(0))
.optional()
.expect("the read succeeds")
}
#[test]
fn test12026_a_layout_is_saved_and_read_back() {
let (_dir, service) = database();
let fleet = "machinefabric/main";
assert_eq!(read(&service, fleet), None, "a fresh worktree has no layout");
save(&service, fleet, r#"{"groups":[],"active_group_id":"group:1"}"#);
assert_eq!(read(&service, fleet).as_deref(), Some(r#"{"groups":[],"active_group_id":"group:1"}"#));
save(&service, fleet, r#"{"groups":[],"active_group_id":"group:2"}"#);
assert_eq!(
read(&service, fleet).as_deref(),
Some(r#"{"groups":[],"active_group_id":"group:2"}"#),
"a second save did not replace the first"
);
let conn = service.get_connection().expect("a connection");
let rows: i64 = conn
.query_row("SELECT count(*) FROM workbench_state", [], |row| row.get(0))
.expect("the count reads");
assert_eq!(rows, 1, "saving twice left {rows} rows");
}
#[test]
fn test12027_each_worktree_keeps_its_own_layout() {
let (_dir, service) = database();
save(&service, "fleet/main", r#"{"which":"one"}"#);
save(&service, "fleet/fix", r#"{"which":"two"}"#);
assert_eq!(read(&service, "fleet/main").as_deref(), Some(r#"{"which":"one"}"#));
assert_eq!(read(&service, "fleet/fix").as_deref(), Some(r#"{"which":"two"}"#));
}
#[test]
fn test12028_a_worktree_keeps_only_its_open_folders() {
let (_dir, service) = database();
let sent = serde_json::json!({ "expanded_paths": ["src", "src/web"] });
let parsed: WorktreeState = serde_json::from_value(sent).expect("the wire type parses what the frontend sends");
save(&service, "fleet/main", &serde_json::to_string(&parsed).expect("it serializes"));
let back: WorktreeState =
serde_json::from_str(&read(&service, "fleet/main").expect("it was saved")).expect("it reads back");
assert_eq!(back.expanded_paths, vec!["src".to_string(), "src/web".to_string()]);
let old = serde_json::json!({ "groups": [], "active_group_id": "group:1", "expanded_paths": [] });
assert!(
serde_json::from_value::<WorktreeState>(old).is_err(),
"a worktree's state carried the machine's layout"
);
}