1 | 'use strict';
|
2 | var test = require('tape');
|
3 | var copyfiles = require('../');
|
4 | var rimraf = require('rimraf');
|
5 | var fs = require('fs');
|
6 | var mkdirp = require('mkdirp');
|
7 | var cp = require('child_process');
|
8 | var glob = require('glob');
|
9 |
|
10 | function after(t) {
|
11 | rimraf('output', function (err) {
|
12 | t.error(err, 'rm out');
|
13 | rimraf('input', function (err) {
|
14 | t.error(err, 'rm input');
|
15 | t.end();
|
16 | });
|
17 | });
|
18 | }
|
19 | function before(t) {
|
20 | mkdirp('input/other', function (err) {
|
21 | t.error(err, 'rm input');
|
22 | t.end();
|
23 | });
|
24 | }
|
25 |
|
26 | test('normal', function (t) {
|
27 | t.test('setup', before);
|
28 | t.test('copy stuff', function (t) {
|
29 | fs.writeFileSync('input/a.txt', 'a');
|
30 | fs.writeFileSync('input/b.txt', 'b');
|
31 | fs.writeFileSync('input/c.js', 'c');
|
32 | copyfiles(['input/*.txt', 'output'], function (err) {
|
33 | t.error(err, 'copyfiles');
|
34 | fs.readdir('output/input', function (err, files) {
|
35 | t.error(err, 'readdir');
|
36 | t.deepEquals(files, ['a.txt', 'b.txt'], 'correct number of things');
|
37 | t.end();
|
38 | });
|
39 | });
|
40 | });
|
41 | t.test('teardown', after);
|
42 | });
|
43 | test('modes', function (t) {
|
44 | t.test('setup', before);
|
45 | t.test('copy stuff', function (t) {
|
46 | fs.writeFileSync('input/a.txt', 'a', {
|
47 | mode: 33261
|
48 | });
|
49 | fs.writeFileSync('input/b.txt', 'b');
|
50 | fs.writeFileSync('input/c.js', 'c');
|
51 | copyfiles(['input/*.txt', 'output'], function (err) {
|
52 | t.error(err, 'copyfiles');
|
53 | fs.readdir('output/input', function (err, files) {
|
54 | t.error(err, 'readdir');
|
55 | t.deepEquals(files, ['a.txt', 'b.txt'], 'correct number of things');
|
56 | t.equals(fs.statSync('output/input/a.txt').mode, 33261, 'correct mode')
|
57 | t.end();
|
58 | });
|
59 | });
|
60 | });
|
61 | t.test('teardown', after);
|
62 | });
|
63 | test('exclude', function (t) {
|
64 | t.test('setup', before);
|
65 | t.test('copy stuff', function (t) {
|
66 | fs.writeFileSync('input/a.txt', 'a');
|
67 | fs.writeFileSync('input/b.txt', 'b');
|
68 | fs.writeFileSync('input/c.js.txt', 'c');
|
69 | fs.writeFileSync('input/d.ps.txt', 'd');
|
70 | copyfiles( ['input/*.txt', 'output'], {
|
71 | exclude: ['**/*.js.txt', '**/*.ps.txt']
|
72 | }, function (err) {
|
73 | t.error(err, 'copyfiles');
|
74 | fs.readdir('output/input', function (err, files) {
|
75 | t.error(err, 'readdir');
|
76 | t.deepEquals(files, ['a.txt', 'b.txt'], 'correct number of things');
|
77 | t.end();
|
78 | });
|
79 | });
|
80 | });
|
81 | t.test('teardown', after);
|
82 | });
|
83 | test('exclude cl', function (t) {
|
84 | t.test('setup', before);
|
85 | t.test('copy stuff', function (t) {
|
86 | fs.writeFileSync('input/a.txt', 'a');
|
87 | fs.writeFileSync('input/b.txt', 'b');
|
88 | fs.writeFileSync('input/c.js.txt', 'c');
|
89 | fs.writeFileSync('input/d.ps.txt', 'd');
|
90 | cp.spawnSync('./copyfiles', ['-e', '**/*.js.txt', '-e', '**/*.ps.txt', 'input/*.txt', 'output']);
|
91 | fs.readdir('output/input', function (err, files) {
|
92 | t.error(err, 'readdir');
|
93 | t.deepEquals(files, ['a.txt', 'b.txt'], 'correct number of things');
|
94 | t.end();
|
95 | });
|
96 | });
|
97 | t.test('teardown', after);
|
98 | });
|
99 | test('all', function (t) {
|
100 | t.test('setup', before);
|
101 | t.test('copy stuff', function (t) {
|
102 | fs.writeFileSync('input/a.txt', 'a');
|
103 | fs.writeFileSync('input/b.txt', 'b');
|
104 | fs.writeFileSync('input/.c.txt', 'c');
|
105 | copyfiles( ['input/*.txt', 'output'], {
|
106 | all: true
|
107 | }, function (err) {
|
108 | t.error(err, 'copyfiles');
|
109 | fs.readdir('output/input', function (err, files) {
|
110 | t.error(err, 'readdir');
|
111 | t.deepEquals(files, ['.c.txt', 'a.txt', 'b.txt'], 'correct number of things');
|
112 | t.end();
|
113 | });
|
114 | });
|
115 | });
|
116 | t.test('teardown', after);
|
117 | });
|
118 | test('all from cl', function (t) {
|
119 | t.test('setup', before);
|
120 | t.test('copy stuff', function (t) {
|
121 | fs.writeFileSync('input/a.txt', 'a');
|
122 | fs.writeFileSync('input/b.txt', 'b');
|
123 | fs.writeFileSync('input/.c.txt', 'c');
|
124 | cp.spawnSync('./copyfiles', ['-a', 'input/*.txt', 'output']);
|
125 | fs.readdir('output/input', function (err, files) {
|
126 | t.error(err, 'readdir');
|
127 | t.deepEquals(files, ['.c.txt', 'a.txt', 'b.txt'], 'correct number of things');
|
128 | t.end();
|
129 | });
|
130 | });
|
131 | t.test('teardown', after);
|
132 | });
|
133 | test('error on nothing coppied', function (t) {
|
134 | t.test('setup', before);
|
135 | t.test('copy stuff', function (t) {
|
136 | fs.writeFileSync('input/.c.txt', 'c');
|
137 | var out = cp.spawnSync('./copyfiles', ['-E', 'input/*.txt', 'output']);
|
138 | t.ok(out.status, 'should error');
|
139 | t.end();
|
140 | });
|
141 | t.test('teardown', after);
|
142 | });
|
143 | test('all from cl 2', function (t) {
|
144 | t.test('setup', before);
|
145 | t.test('copy stuff', function (t) {
|
146 | fs.writeFileSync('input/a.txt', 'a');
|
147 | fs.writeFileSync('input/b.txt', 'b');
|
148 | fs.writeFileSync('input/.c.txt', 'c');
|
149 | cp.spawnSync('./copyfiles', ['--all', 'input/*.txt', 'output']);
|
150 | fs.readdir('output/input', function (err, files) {
|
151 | t.error(err, 'readdir');
|
152 | t.deepEquals(files, ['.c.txt', 'a.txt', 'b.txt'], 'correct number of things');
|
153 | t.end();
|
154 | });
|
155 | });
|
156 | t.test('teardown', after);
|
157 | });
|
158 | test('soft', function (t) {
|
159 | t.test('setup', before);
|
160 | t.test('copy stuff', function (t) {
|
161 | mkdirp('output/input/other', function(){
|
162 | fs.writeFileSync('input/a.txt', 'inputA');
|
163 | fs.writeFileSync('output/input/a.txt', 'outputA');
|
164 | t.equal( fs.readFileSync('output/input/a.txt').toString(), 'outputA' )
|
165 | fs.writeFileSync('input/b.txt', 'b');
|
166 | fs.writeFileSync('input/other/c.txt', 'inputC');
|
167 | fs.writeFileSync('output/input/other/c.txt', 'outputC');
|
168 | fs.writeFileSync('input/other/d.txt', 'd');
|
169 | copyfiles(['input/**/*.txt', 'output'], {soft:true}, function (err) {
|
170 | t.error(err, 'copyfiles');
|
171 | fs.readdir('output/input', function (err, files) {
|
172 | t.error(err, 'readdir');
|
173 | t.deepEquals(files, ['a.txt', 'b.txt', 'other'], 'correct number of things');
|
174 | t.equal( fs.readFileSync('output/input/a.txt').toString(), 'outputA' )
|
175 | t.equal( fs.readFileSync('output/input/b.txt').toString(), 'b')
|
176 | t.equal( fs.readFileSync('output/input/other/c.txt').toString(), 'outputC')
|
177 | t.end();
|
178 | });
|
179 | });
|
180 | })
|
181 | });
|
182 | t.test('teardown', after);
|
183 | });
|
184 | test('soft from cl', function (t) {
|
185 | t.test('setup', before);
|
186 | t.test('copy stuff', function (t) {
|
187 | mkdirp('output/input/other', function(){
|
188 | fs.writeFileSync('input/a.txt', 'inputA');
|
189 | fs.writeFileSync('output/input/a.txt', 'outputA');
|
190 | t.equal( fs.readFileSync('output/input/a.txt').toString(), 'outputA' )
|
191 | fs.writeFileSync('input/b.txt', 'b');
|
192 | fs.writeFileSync('input/other/c.txt', 'inputC');
|
193 | fs.writeFileSync('output/input/other/c.txt', 'outputC');
|
194 | fs.writeFileSync('input/other/d.txt', 'd');
|
195 | cp.spawnSync('./copyfiles', ['-s', 'input/**/*.txt', 'output']);
|
196 |
|
197 | fs.readdir('output/input', function (err, files) {
|
198 | t.error(err, 'readdir');
|
199 | t.deepEquals(files, ['a.txt', 'b.txt', 'other'], 'correct number of things');
|
200 | t.equal( fs.readFileSync('output/input/a.txt').toString(), 'outputA' )
|
201 | t.equal( fs.readFileSync('output/input/b.txt').toString(), 'b')
|
202 | t.equal( fs.readFileSync('output/input/other/c.txt').toString(), 'outputC')
|
203 | t.end();
|
204 | });
|
205 | });
|
206 | });
|
207 | t.test('teardown', after);
|
208 | });
|
209 | test('soft from cl 2', function (t) {
|
210 | t.test('setup', before);
|
211 | t.test('copy stuff', function (t) {
|
212 | mkdirp('output/input/other', function(){
|
213 | fs.writeFileSync('input/a.txt', 'inputA');
|
214 | fs.writeFileSync('output/input/a.txt', 'outputA');
|
215 | t.equal( fs.readFileSync('output/input/a.txt').toString(), 'outputA' )
|
216 | fs.writeFileSync('input/b.txt', 'b');
|
217 | fs.writeFileSync('input/other/c.txt', 'inputC');
|
218 | fs.writeFileSync('output/input/other/c.txt', 'outputC');
|
219 | fs.writeFileSync('input/other/d.txt', 'd');
|
220 | cp.spawnSync('./copyfiles', ['--soft', 'input/**/*.txt', 'output']);
|
221 |
|
222 | fs.readdir('output/input', function (err, files) {
|
223 | t.error(err, 'readdir');
|
224 | t.deepEquals(files, ['a.txt', 'b.txt', 'other'], 'correct number of things');
|
225 | t.equal( fs.readFileSync('output/input/a.txt').toString(), 'outputA' )
|
226 | t.equal( fs.readFileSync('output/input/b.txt').toString(), 'b')
|
227 | t.equal( fs.readFileSync('output/input/other/c.txt').toString(), 'outputC')
|
228 | t.end();
|
229 | });
|
230 | });
|
231 | });
|
232 | t.test('teardown', after);
|
233 | });
|
234 | test('with up', function (t) {
|
235 | t.test('setup', before);
|
236 | t.test('copy stuff', function (t) {
|
237 | fs.writeFileSync('input/a.txt', 'a');
|
238 | fs.writeFileSync('input/b.txt', 'b');
|
239 | fs.writeFileSync('input/c.js', 'c');
|
240 | copyfiles(['input/*.txt', 'output'], 1, function (err) {
|
241 | t.error(err, 'copyfiles');
|
242 | fs.readdir('output', function (err, files) {
|
243 | t.error(err, 'readdir');
|
244 | t.deepEquals(files, ['a.txt', 'b.txt'], 'correct number of things');
|
245 | t.end();
|
246 | });
|
247 | });
|
248 | });
|
249 | t.test('teardown', after);
|
250 | });
|
251 | test('with up cl', function (t) {
|
252 | t.test('setup', before);
|
253 | t.test('copy stuff', function (t) {
|
254 | fs.writeFileSync('input/a.txt', 'a');
|
255 | fs.writeFileSync('input/b.txt', 'b');
|
256 | fs.writeFileSync('input/c.js', 'c');
|
257 | cp.spawnSync('./copyfiles', ['-u', '1', 'input/*.txt', 'output']);
|
258 | fs.readdir('output', function (err, files) {
|
259 | t.error(err, 'readdir');
|
260 | t.deepEquals(files, ['a.txt', 'b.txt'], 'correct number of things');
|
261 | t.end();
|
262 | });
|
263 | });
|
264 | t.test('teardown', after);
|
265 | });
|
266 | test('with copyup', function (t) {
|
267 | t.test('setup', before);
|
268 | t.test('copy stuff', function (t) {
|
269 | fs.writeFileSync('input/a.txt', 'a');
|
270 | fs.writeFileSync('input/b.txt', 'b');
|
271 | fs.writeFileSync('input/c.js', 'c');
|
272 | cp.spawnSync('./copyup', ['input/*.txt', 'output']);
|
273 | fs.readdir('output', function (err, files) {
|
274 | t.error(err, 'readdir');
|
275 | t.deepEquals(files, ['a.txt', 'b.txt'], 'correct number of things');
|
276 | t.end();
|
277 | });
|
278 | });
|
279 | t.test('teardown', after);
|
280 | });
|
281 | test('with up 2', function (t) {
|
282 | t.test('setup', before);
|
283 | t.test('copy stuff', function (t) {
|
284 | fs.writeFileSync('input/other/a.txt', 'a');
|
285 | fs.writeFileSync('input/other/b.txt', 'b');
|
286 | fs.writeFileSync('input/other/c.js', 'c');
|
287 | copyfiles(['input/**/*.txt', 'output'], 2, function (err) {
|
288 | t.error(err, 'copyfiles');
|
289 | fs.readdir('output', function (err, files) {
|
290 | t.error(err, 'readdir');
|
291 | t.deepEquals(files, ['a.txt', 'b.txt'], 'correct number of things');
|
292 | t.end();
|
293 | });
|
294 | });
|
295 | });
|
296 | t.test('teardown', after);
|
297 | });
|
298 | test('flatten', function (t) {
|
299 | t.test('setup', before);
|
300 | t.test('copy stuff', function (t) {
|
301 | fs.writeFileSync('input/other/a.txt', 'a');
|
302 | fs.writeFileSync('input/b.txt', 'b');
|
303 | fs.writeFileSync('input/other/c.js', 'c');
|
304 | copyfiles(['input/**/*.txt', 'output'], true, function (err) {
|
305 | t.error(err, 'copyfiles');
|
306 | fs.readdir('output', function (err, files) {
|
307 | t.error(err, 'readdir');
|
308 | t.deepEquals(files, ['a.txt', 'b.txt'], 'correct number of things');
|
309 | t.end();
|
310 | });
|
311 | });
|
312 | });
|
313 | t.test('teardown', after);
|
314 | });
|
315 | test('follow', function (t) {
|
316 | t.test('setup', before);
|
317 | t.test('copy stuff', function (t) {
|
318 | fs.mkdirSync('input/origin');
|
319 | fs.mkdirSync('input/origin/inner');
|
320 | fs.writeFileSync('input/origin/inner/a.txt', 'a');
|
321 | fs.symlinkSync('origin', 'input/dest');
|
322 | copyfiles(['input/**/*.txt', 'output'], { up: 1, follow: true }, function (err) {
|
323 | t.error(err, 'copyfiles');
|
324 | glob('output/**/*.txt', function (err, files) {
|
325 | t.error(err, 'readdir');
|
326 | t.deepEquals(files, ['output/dest/inner/a.txt', 'output/origin/inner/a.txt'], 'correct number of things');
|
327 | t.end();
|
328 | });
|
329 | });
|
330 | });
|
331 | t.test('teardown', after);
|
332 | });
|