Skip to content

Commit e29906d

Browse files
committed
test(snapshots): add integration tests for repository snapshots getting methods
1 parent d2817ae commit e29906d

File tree

2 files changed

+321
-0
lines changed

2 files changed

+321
-0
lines changed

crates/core/tests/integration.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ mod integration {
3131
mod ls;
3232
mod prune;
3333
mod restore;
34+
mod snapshots;
3435
mod vfs;
3536
use super::*;
3637
}
Lines changed: 320 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,320 @@
1+
#![allow(missing_docs)]
2+
3+
use std::path::PathBuf;
4+
use std::str::FromStr;
5+
6+
use crate::{RepoOpen, TestSource, tar_gz_testdata};
7+
8+
use super::set_up_repo;
9+
use anyhow::Result;
10+
use chrono::DateTime;
11+
use rstest::rstest;
12+
use rustic_core::repofile::SnapshotFile;
13+
use rustic_core::{BackupOptions, SnapshotGroupCriterion};
14+
15+
#[rstest]
16+
fn test_get_snapshot_group_no_ids(
17+
tar_gz_testdata: Result<TestSource>,
18+
set_up_repo: Result<RepoOpen>,
19+
) -> Result<()> {
20+
let (source, repo) = (tar_gz_testdata?, set_up_repo?.to_indexed_ids()?);
21+
22+
let paths = &source.path_list();
23+
24+
// we use as_path to not depend on the actual tempdir
25+
let opts = BackupOptions::default().as_path(PathBuf::from_str("test")?);
26+
27+
// first backup
28+
let snap1_ts = DateTime::from_timestamp(1_752_483_600, 0).unwrap().into();
29+
let _ = repo.backup(
30+
&opts,
31+
paths,
32+
SnapshotFile {
33+
time: snap1_ts,
34+
..Default::default()
35+
},
36+
)?;
37+
38+
// second backup
39+
let snap2_ts = DateTime::from_timestamp(1_752_483_700, 0).unwrap().into();
40+
let _ = repo.backup(
41+
&opts,
42+
paths,
43+
SnapshotFile {
44+
time: snap2_ts,
45+
..Default::default()
46+
},
47+
)?;
48+
let res = repo.get_snapshot_group(&[], SnapshotGroupCriterion::default(), |_| true)?;
49+
50+
assert_eq!(res.len(), 1);
51+
assert_eq!(res[0].1.len(), 2);
52+
53+
Ok(())
54+
}
55+
56+
#[rstest]
57+
fn test_get_snapshot_group_wrong_id(
58+
tar_gz_testdata: Result<TestSource>,
59+
set_up_repo: Result<RepoOpen>,
60+
) -> Result<()> {
61+
let (source, repo) = (tar_gz_testdata?, set_up_repo?.to_indexed_ids()?);
62+
63+
let paths = &source.path_list();
64+
65+
// we use as_path to not depend on the actual tempdir
66+
let opts = BackupOptions::default().as_path(PathBuf::from_str("test")?);
67+
68+
// first backup
69+
let snap1_ts = DateTime::from_timestamp(1_752_483_600, 0).unwrap().into();
70+
let _ = repo.backup(
71+
&opts,
72+
paths,
73+
SnapshotFile {
74+
time: snap1_ts,
75+
..Default::default()
76+
},
77+
)?;
78+
79+
let res = repo.get_snapshot_group(
80+
&[String::from("wrong_id_that_is_out_of_format")],
81+
SnapshotGroupCriterion::default(),
82+
|_| true,
83+
);
84+
assert!(res.is_err());
85+
let err = res.unwrap_err();
86+
assert!(
87+
err.to_string()
88+
.contains("No suitable id found for `wrong_id_that_is_out_of_format`.")
89+
);
90+
Ok(())
91+
}
92+
93+
#[rstest]
94+
fn test_get_snapshot_group_latest_id(
95+
tar_gz_testdata: Result<TestSource>,
96+
set_up_repo: Result<RepoOpen>,
97+
) -> Result<()> {
98+
let (source, repo) = (tar_gz_testdata?, set_up_repo?.to_indexed_ids()?);
99+
100+
let paths = &source.path_list();
101+
102+
// we use as_path to not depend on the actual tempdir
103+
let opts = BackupOptions::default().as_path(PathBuf::from_str("test")?);
104+
105+
// first backup
106+
let snap1_ts = DateTime::from_timestamp(1_752_483_600, 0).unwrap().into();
107+
let _ = repo.backup(
108+
&opts,
109+
paths,
110+
SnapshotFile {
111+
time: snap1_ts,
112+
..Default::default()
113+
},
114+
)?;
115+
116+
// second backup
117+
let snap2_ts = DateTime::from_timestamp(1_752_483_700, 0).unwrap().into();
118+
let _ = repo.backup(
119+
&opts,
120+
paths,
121+
SnapshotFile {
122+
time: snap2_ts,
123+
..Default::default()
124+
},
125+
)?;
126+
let res = repo.get_snapshot_group(
127+
&[String::from("latest")],
128+
SnapshotGroupCriterion::default(),
129+
|_| true,
130+
)?;
131+
assert_eq!(res.len(), 1);
132+
assert_eq!(res[0].1.len(), 1);
133+
// latest => most recent
134+
assert_eq!(res[0].1[0].time, snap2_ts);
135+
Ok(())
136+
}
137+
138+
#[rstest]
139+
fn test_get_snapshot_group_latest_n_id(
140+
tar_gz_testdata: Result<TestSource>,
141+
set_up_repo: Result<RepoOpen>,
142+
) -> Result<()> {
143+
let (source, repo) = (tar_gz_testdata?, set_up_repo?.to_indexed_ids()?);
144+
145+
let paths = &source.path_list();
146+
147+
// we use as_path to not depend on the actual tempdir
148+
let opts = BackupOptions::default().as_path(PathBuf::from_str("test")?);
149+
150+
// first backup
151+
let snap1_ts = DateTime::from_timestamp(1_752_483_600, 0).unwrap().into();
152+
let _ = repo.backup(
153+
&opts,
154+
paths,
155+
SnapshotFile {
156+
time: snap1_ts,
157+
..Default::default()
158+
},
159+
)?;
160+
161+
// second backup
162+
let snap2_ts = DateTime::from_timestamp(1_752_483_700, 0).unwrap().into();
163+
let _ = repo.backup(
164+
&opts,
165+
paths,
166+
SnapshotFile {
167+
time: snap2_ts,
168+
..Default::default()
169+
},
170+
)?;
171+
172+
// third backup
173+
let snap3_ts = DateTime::from_timestamp(1_752_483_800, 0).unwrap().into();
174+
let _ = repo.backup(
175+
&opts,
176+
paths,
177+
SnapshotFile {
178+
time: snap3_ts,
179+
..Default::default()
180+
},
181+
)?;
182+
183+
let res = repo.get_snapshot_group(
184+
&[String::from("latest~2")],
185+
SnapshotGroupCriterion::default(),
186+
|_| true,
187+
)?;
188+
assert_eq!(res.len(), 1);
189+
assert_eq!(res[0].1.len(), 1);
190+
// latest~2 is "third" oldest
191+
assert_eq!(res[0].1[0].time, snap1_ts);
192+
193+
let res = repo.get_snapshot_group(
194+
&[String::from("latest~2"), String::from("latest~0")],
195+
SnapshotGroupCriterion::default(),
196+
|_| true,
197+
)?;
198+
assert_eq!(res.len(), 1);
199+
assert_eq!(res[0].1.len(), 2);
200+
// latest~2 is "third" oldest
201+
assert_eq!(res[0].1[0].time, snap1_ts);
202+
// latest~0 is latest
203+
assert_eq!(res[0].1[1].time, snap3_ts);
204+
Ok(())
205+
}
206+
207+
#[rstest]
208+
fn test_get_snapshot_from_str_short_id(
209+
tar_gz_testdata: Result<TestSource>,
210+
set_up_repo: Result<RepoOpen>,
211+
) -> Result<()> {
212+
let (source, repo) = (tar_gz_testdata?, set_up_repo?.to_indexed_ids()?);
213+
214+
let paths = &source.path_list();
215+
216+
// we use as_path to not depend on the actual tempdir
217+
let opts = BackupOptions::default().as_path(PathBuf::from_str("test")?);
218+
219+
// first backup
220+
let snap1_ts = DateTime::from_timestamp(1_752_483_600, 0).unwrap().into();
221+
let _ = repo.backup(
222+
&opts,
223+
paths,
224+
SnapshotFile {
225+
time: snap1_ts,
226+
..Default::default()
227+
},
228+
)?;
229+
230+
let snap_original = repo.get_all_snapshots()?[0].clone();
231+
232+
let id_str = &snap_original.id.to_string();
233+
let short_id = &id_str[..8];
234+
235+
let snap_short_id = repo.get_snapshot_from_str(short_id, |_| true)?;
236+
237+
assert_eq!(snap_short_id, snap_original);
238+
Ok(())
239+
}
240+
241+
#[rstest]
242+
fn test_get_snapshot_from_str_latest(
243+
tar_gz_testdata: Result<TestSource>,
244+
set_up_repo: Result<RepoOpen>,
245+
) -> Result<()> {
246+
let (source, repo) = (tar_gz_testdata?, set_up_repo?.to_indexed_ids()?);
247+
248+
let paths = &source.path_list();
249+
250+
// we use as_path to not depend on the actual tempdir
251+
let opts = BackupOptions::default().as_path(PathBuf::from_str("test")?);
252+
253+
// first backup
254+
let snap1_ts = DateTime::from_timestamp(1_752_483_600, 0).unwrap().into();
255+
let snap1 = repo.backup(
256+
&opts,
257+
paths,
258+
SnapshotFile {
259+
time: snap1_ts,
260+
..Default::default()
261+
},
262+
)?;
263+
264+
// second backup
265+
let snap2_ts = DateTime::from_timestamp(1_752_483_700, 0).unwrap().into();
266+
let snap2 = repo.backup(
267+
&opts,
268+
paths,
269+
SnapshotFile {
270+
time: snap2_ts,
271+
..Default::default()
272+
},
273+
)?;
274+
275+
let snap_latest = repo.get_snapshot_from_str("latest", |_| true)?;
276+
assert_eq!(snap_latest, snap2);
277+
let snap_latest_1 = repo.get_snapshot_from_str("latest~1", |_| true)?;
278+
assert_eq!(snap_latest_1, snap1);
279+
Ok(())
280+
}
281+
282+
#[rstest]
283+
fn test_get_snapshots_from_strs_latest(
284+
tar_gz_testdata: Result<TestSource>,
285+
set_up_repo: Result<RepoOpen>,
286+
) -> Result<()> {
287+
let (source, repo) = (tar_gz_testdata?, set_up_repo?.to_indexed_ids()?);
288+
289+
let paths = &source.path_list();
290+
291+
// we use as_path to not depend on the actual tempdir
292+
let opts = BackupOptions::default().as_path(PathBuf::from_str("test")?);
293+
294+
// first backup
295+
let snap1_ts = DateTime::from_timestamp(1_752_483_600, 0).unwrap().into();
296+
let snap1 = repo.backup(
297+
&opts,
298+
paths,
299+
SnapshotFile {
300+
time: snap1_ts,
301+
..Default::default()
302+
},
303+
)?;
304+
305+
// second backup
306+
let snap2_ts = DateTime::from_timestamp(1_752_483_700, 0).unwrap().into();
307+
let snap2 = repo.backup(
308+
&opts,
309+
paths,
310+
SnapshotFile {
311+
time: snap2_ts,
312+
..Default::default()
313+
},
314+
)?;
315+
316+
let snap_latest = repo.get_snapshots_from_strs(&["latest", "latest~1"], |_| true)?;
317+
assert_eq!(snap_latest[0], snap2);
318+
assert_eq!(snap_latest[1], snap1);
319+
Ok(())
320+
}

0 commit comments

Comments
 (0)