mirror of
https://github.com/gpxstudio/gpx.studio.git
synced 2026-11-15 07:07:07 +00:00
70 lines
2.1 KiB
Rust
70 lines
2.1 KiB
Rust
//! The storage of the engine on the file system (`store`).
|
|
|
|
use std::fs;
|
|
use std::path::PathBuf;
|
|
|
|
use gpx_engine::{
|
|
Action, Batch, Command, CommitError, Load, LoadFiles, Persister, Revision, Storage,
|
|
};
|
|
use gpx_studio_desktop_lib::Engine;
|
|
use gpx_studio_desktop_lib::store::FileStorage;
|
|
use uuid::Uuid;
|
|
|
|
fn directory() -> PathBuf {
|
|
std::env::temp_dir().join(format!("gpx-studio-store-{}", Uuid::new_v4()))
|
|
}
|
|
|
|
fn engine_with_a_file() -> Engine {
|
|
let mut engine = Engine::default();
|
|
let data = std::fs::read("../gpx-rs/data/simple.gpx").unwrap();
|
|
engine
|
|
.execute(Action::Edit(Command::LoadFiles(LoadFiles {
|
|
files: vec![Load {
|
|
data: &data,
|
|
name: "simple",
|
|
}],
|
|
})))
|
|
.unwrap();
|
|
engine
|
|
}
|
|
|
|
#[test]
|
|
fn keeps_the_files_and_the_settings_between_sessions() {
|
|
let root = directory();
|
|
let engine = engine_with_a_file();
|
|
let order = engine.order().to_vec();
|
|
|
|
let storage = FileStorage::open(&root).unwrap();
|
|
pollster::block_on(Persister::default().save(&storage, engine.snapshot())).unwrap();
|
|
pollster::block_on(storage.put_setting("units", "\"metric\"")).unwrap();
|
|
|
|
// another session
|
|
let storage = FileStorage::open(&root).unwrap();
|
|
let restored = pollster::block_on(Persister::default().restore(&storage)).unwrap();
|
|
let mut other = Engine::default();
|
|
other.restore(restored);
|
|
assert_eq!(other.order(), order);
|
|
assert_eq!(
|
|
other.file_statistics(&order[0]).unwrap().total_distance,
|
|
engine.file_statistics(&order[0]).unwrap().total_distance
|
|
);
|
|
assert_eq!(storage.settings()["units"], "\"metric\"");
|
|
fs::remove_dir_all(root).unwrap();
|
|
}
|
|
|
|
#[test]
|
|
fn refuses_a_commit_that_is_not_based_on_the_head() {
|
|
let root = directory();
|
|
let storage = FileStorage::open(&root).unwrap();
|
|
let batch = Batch {
|
|
order: Some(vec![]),
|
|
..Default::default()
|
|
};
|
|
assert_eq!(pollster::block_on(storage.commit(&batch)), Ok(Revision(1)));
|
|
assert_eq!(
|
|
pollster::block_on(storage.commit(&batch)),
|
|
Err(CommitError::Stale { head: Revision(1) })
|
|
);
|
|
fs::remove_dir_all(root).unwrap();
|
|
}
|