this repo has no description
1use assert_cmd::prelude::*;
2use assert_fs::prelude::*;
3use predicates::prelude::*;
4use std::{path::PathBuf, process::Command};
5
6mod common;
7use common::*;
8
9mod zip {
10 use super::*;
11
12 mod roundtrip {
13 use super::*;
14
15 /// Zip roundtrip with a single file
16 ///
17 /// ``` bash
18 /// cmprss zip test.txt archive.zip
19 /// cmprss zip --extract archive.zip .
20 /// ```
21 #[test]
22 fn explicit() -> Result<(), Box<dyn std::error::Error>> {
23 let file = create_test_file("test.txt", "garbage data for testing")?;
24 let working_dir = create_working_dir()?;
25 let archive = working_dir.child("archive.zip");
26 archive.assert(predicate::path::missing());
27
28 let mut compress = Command::cargo_bin("cmprss")?;
29 compress.arg("zip").arg(file.path()).arg(archive.path());
30 compress.assert().success();
31 archive.assert(predicate::path::is_file());
32
33 let mut extract = Command::cargo_bin("cmprss")?;
34 extract
35 .arg("zip")
36 .arg("--extract")
37 .arg(archive.path())
38 .arg(working_dir.path());
39 extract.assert().success();
40
41 // Assert the files are identical
42 assert_files_equal(file.path(), &working_dir.child("test.txt"));
43
44 Ok(())
45 }
46
47 /// Zip roundtrip with multiple files
48 ///
49 /// ``` bash
50 /// cmprss zip test.txt test2.txt archive.zip
51 /// cmprss zip --extract archive.zip .
52 /// ```
53 #[test]
54 fn explicit_two() -> Result<(), Box<dyn std::error::Error>> {
55 let file = create_test_file("test.txt", "garbage data for testing")?;
56 let file2 = create_test_file("test2.txt", "more garbage data for testing")?;
57 let working_dir = create_working_dir()?;
58 let archive = working_dir.child("archive.zip");
59 archive.assert(predicate::path::missing());
60
61 let mut compress = Command::cargo_bin("cmprss")?;
62 compress
63 .arg("zip")
64 .arg(file.path())
65 .arg(file2.path())
66 .arg(archive.path());
67 compress.assert().success();
68 archive.assert(predicate::path::is_file());
69
70 let mut extract = Command::cargo_bin("cmprss")?;
71 extract
72 .arg("zip")
73 .arg("--extract")
74 .arg(archive.path())
75 .arg(working_dir.path());
76 extract.assert().success();
77
78 // Assert the files are identical
79 assert_files_equal(file.path(), &working_dir.child("test.txt"));
80 assert_files_equal(file2.path(), &working_dir.child("test2.txt"));
81
82 Ok(())
83 }
84
85 /// Zip roundtrip with a directory
86 ///
87 /// ``` bash
88 /// cmprss zip directory archive.zip
89 /// cmprss zip --extract archive.zip output_dir
90 /// ```
91 #[test]
92 fn directory() -> Result<(), Box<dyn std::error::Error>> {
93 let dir = create_working_dir()?;
94 let file = dir.child("test.txt");
95 file.write_str("garbage data for testing")?;
96 let file2 = dir.child("test2.txt");
97 file2.write_str("more garbage data for testing")?;
98
99 let working_dir = create_working_dir()?;
100 let archive = working_dir.child("archive.zip");
101 archive.assert(predicate::path::missing());
102
103 let mut compress = Command::cargo_bin("cmprss")?;
104 compress.arg("zip").arg(dir.path()).arg(archive.path());
105 compress.assert().success();
106 archive.assert(predicate::path::is_file());
107
108 let extract_dir = working_dir.child("output");
109 std::fs::create_dir_all(extract_dir.path())?;
110
111 let mut extract = Command::cargo_bin("cmprss")?;
112 extract
113 .arg("zip")
114 .arg("--extract")
115 .arg(archive.path())
116 .arg(extract_dir.path());
117 extract.assert().success();
118
119 // Assert the files are identical
120 // Since the archive stores the entire directory, the extracted file is contained in the directory
121 let dir_name: PathBuf = dir.path().file_name().unwrap().into();
122 assert_files_equal(file.path(), &extract_dir.child(&dir_name).child("test.txt"));
123 assert_files_equal(
124 file2.path(),
125 &extract_dir.child(&dir_name).child("test2.txt"),
126 );
127
128 Ok(())
129 }
130 }
131}