test.fromNode.js 11 KB

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