PageRenderTime 49ms CodeModel.GetById 17ms RepoModel.GetById 0ms app.codeStats 0ms

/node_modules/webpack/node_modules/memory-fs/test/MemoryFileSystem.js

https://gitlab.com/ForU/Shutterlode
JavaScript | 442 lines | 434 code | 4 blank | 4 comment | 6 complexity | e7b6c3a82969d1f1c78955271276f065 MD5 | raw file
  1. var bl = require("bl");
  2. var should = require("should");
  3. var MemoryFileSystem = require("../lib/MemoryFileSystem");
  4. describe("directory", function() {
  5. it("should have a empty root directory as startup", function(done) {
  6. var fs = new MemoryFileSystem();
  7. fs.readdirSync("/").should.be.eql([]);
  8. var stat = fs.statSync("/");
  9. stat.isFile().should.be.eql(false);
  10. stat.isDirectory().should.be.eql(true);
  11. fs.readdir("/", function(err, files) {
  12. if(err) throw err;
  13. files.should.be.eql([]);
  14. done();
  15. });
  16. });
  17. it("should make and remove directories (linux style)", function() {
  18. var fs = new MemoryFileSystem();
  19. fs.mkdirSync("/test");
  20. fs.mkdirSync("/test//sub/");
  21. fs.mkdirpSync("/test/sub2");
  22. fs.mkdirSync("/root\\dir");
  23. fs.mkdirpSync("/");
  24. fs.mkdirSync("/");
  25. fs.readdirSync("/").should.be.eql(["test", "root\\dir"]);
  26. fs.readdirSync("/test/").should.be.eql(["sub", "sub2"]);
  27. fs.rmdirSync("/test/sub//");
  28. fs.readdirSync("//test").should.be.eql(["sub2"]);
  29. fs.rmdirSync("/test/sub2");
  30. fs.rmdirSync("/test");
  31. fs.existsSync("/test").should.be.eql(false);
  32. (function() {
  33. fs.readdirSync("/test");
  34. }).should.throw();
  35. fs.readdirSync("/").should.be.eql(["root\\dir"]);
  36. fs.mkdirpSync("/a/depth/sub/dir");
  37. fs.existsSync("/a/depth/sub").should.be.eql(true);
  38. var stat = fs.statSync("/a/depth/sub");
  39. stat.isFile().should.be.eql(false);
  40. stat.isDirectory().should.be.eql(true);
  41. });
  42. it("should make and remove directories (windows style)", function() {
  43. var fs = new MemoryFileSystem();
  44. fs.mkdirSync("C:\\");
  45. fs.mkdirSync("C:\\test");
  46. fs.mkdirSync("C:\\test\\\\sub/");
  47. fs.mkdirpSync("c:\\test/sub2");
  48. fs.mkdirSync("C:\\root-dir");
  49. fs.readdirSync("C:").should.be.eql(["test", "root-dir"]);
  50. fs.readdirSync("C:/test/").should.be.eql(["sub", "sub2"]);
  51. fs.rmdirSync("C:/test\\sub\\\\");
  52. fs.readdirSync("C:\\\\test").should.be.eql(["sub2"]);
  53. fs.rmdirSync("C:\\test\\sub2");
  54. fs.rmdirSync("C:\\test");
  55. fs.existsSync("C:\\test").should.be.eql(false);
  56. (function() {
  57. fs.readdirSync("C:\\test");
  58. }).should.throw();
  59. fs.readdirSync("C:").should.be.eql(["root-dir"]);
  60. fs.mkdirpSync("D:\\a\\depth\\sub\\dir");
  61. fs.existsSync("D:\\a\\depth\\sub").should.be.eql(true);
  62. var stat = fs.statSync("D:\\a\\depth\\sub");
  63. stat.isFile().should.be.eql(false);
  64. stat.isDirectory().should.be.eql(true);
  65. fs.readdirSync("D:\\//a/depth/\\sub").should.be.eql(["dir"]);
  66. });
  67. });
  68. describe("files", function() {
  69. it("should make and remove files", function() {
  70. var fs = new MemoryFileSystem();
  71. fs.mkdirSync("/test");
  72. var buf = new Buffer("Hello World", "utf-8");
  73. fs.writeFileSync("/test/hello-world.txt", buf);
  74. fs.readFileSync("/test/hello-world.txt").should.be.eql(buf);
  75. fs.readFileSync("/test/hello-world.txt", "utf-8").should.be.eql("Hello World");
  76. (function() {
  77. fs.readFileSync("/test/other-file");
  78. }).should.throw();
  79. (function() {
  80. fs.readFileSync("/test/other-file", "utf-8");
  81. }).should.throw();
  82. fs.writeFileSync("/a", "Test", "utf-8");
  83. fs.readFileSync("/a", "utf-8").should.be.eql("Test");
  84. var stat = fs.statSync("/a");
  85. stat.isFile().should.be.eql(true);
  86. stat.isDirectory().should.be.eql(false);
  87. });
  88. });
  89. describe("errors", function() {
  90. it("should fail on invalid paths", function() {
  91. var fs = new MemoryFileSystem();
  92. fs.mkdirpSync("/test/a/b/c");
  93. fs.mkdirpSync("/test/a/bc");
  94. fs.mkdirpSync("/test/abc");
  95. (function() {
  96. fs.mkdirpSync("xyz");
  97. }).should.throw();
  98. (function() {
  99. fs.readdirSync("/test/abc/a/b/c");
  100. }).should.throw();
  101. (function() {
  102. fs.readdirSync("/abc");
  103. }).should.throw();
  104. (function() {
  105. fs.statSync("/abc");
  106. }).should.throw();
  107. (function() {
  108. fs.mkdirSync("/test/a/d/b/c");
  109. }).should.throw();
  110. (function() {
  111. fs.writeFileSync("/test/a/d/b/c", "Hello");
  112. }).should.throw();
  113. (function() {
  114. fs.readFileSync("/test/a/d/b/c");
  115. }).should.throw();
  116. (function() {
  117. fs.readFileSync("/test/abcd");
  118. }).should.throw();
  119. (function() {
  120. fs.mkdirSync("/test/abcd/dir");
  121. }).should.throw();
  122. (function() {
  123. fs.unlinkSync("/test/abcd");
  124. }).should.throw();
  125. (function() {
  126. fs.unlinkSync("/test/abcd/file");
  127. }).should.throw();
  128. (function() {
  129. fs.statSync("/test/a/d/b/c");
  130. }).should.throw();
  131. (function() {
  132. fs.statSync("/test/abcd");
  133. }).should.throw();
  134. fs.mkdir("/test/a/d/b/c", function(err) {
  135. err.should.be.instanceof(Error);
  136. });
  137. });
  138. it("should fail incorrect arguments", function() {
  139. var fs = new MemoryFileSystem();
  140. (function() {
  141. fs.writeFileSync("/test");
  142. }).should.throw();
  143. });
  144. it("should fail on wrong type", function() {
  145. var fs = new MemoryFileSystem();
  146. fs.mkdirpSync("/test/dir");
  147. fs.mkdirpSync("/test/dir");
  148. fs.writeFileSync("/test/file", "Hello");
  149. (function() {
  150. fs.writeFileSync("/test/dir", "Hello");
  151. }).should.throw();
  152. (function() {
  153. fs.readFileSync("/test/dir");
  154. }).should.throw();
  155. (function() {
  156. fs.writeFileSync("/", "Hello");
  157. }).should.throw();
  158. (function() {
  159. fs.rmdirSync("/");
  160. }).should.throw();
  161. (function() {
  162. fs.unlinkSync("/");
  163. }).should.throw();
  164. (function() {
  165. fs.mkdirSync("/test/dir");
  166. }).should.throw();
  167. (function() {
  168. fs.mkdirSync("/test/file");
  169. }).should.throw();
  170. (function() {
  171. fs.mkdirpSync("/test/file");
  172. }).should.throw();
  173. (function() {
  174. fs.readdirSync("/test/file");
  175. }).should.throw();
  176. fs.readdirSync("/test/").should.be.eql(["dir", "file"]);
  177. });
  178. it("should throw on readlink", function() {
  179. var fs = new MemoryFileSystem();
  180. fs.mkdirpSync("/test/dir");
  181. (function() {
  182. fs.readlinkSync("/");
  183. }).should.throw();
  184. (function() {
  185. fs.readlinkSync("/link");
  186. }).should.throw();
  187. (function() {
  188. fs.readlinkSync("/test");
  189. }).should.throw();
  190. (function() {
  191. fs.readlinkSync("/test/dir");
  192. }).should.throw();
  193. (function() {
  194. fs.readlinkSync("/test/dir/link");
  195. }).should.throw();
  196. });
  197. });
  198. describe("async", function() {
  199. it("should be able to use the async versions", function(done) {
  200. var fs = new MemoryFileSystem();
  201. fs.mkdirp("/test/dir", function(err) {
  202. if(err) throw err;
  203. fs.writeFile("/test/dir/a", "Hello", function(err) {
  204. if(err) throw err;
  205. fs.writeFile("/test/dir/b", "World", "utf-8", function(err) {
  206. if(err) throw err;
  207. fs.readFile("/test/dir/a", "utf-8", function(err, content) {
  208. if(err) throw err;
  209. content.should.be.eql("Hello");
  210. fs.readFile("/test/dir/b", function(err, content) {
  211. if(err) throw err;
  212. content.should.be.eql(new Buffer("World"));
  213. fs.exists("/test/dir/b", function(exists) {
  214. exists.should.be.eql(true);
  215. done();
  216. });
  217. });
  218. });
  219. });
  220. });
  221. });
  222. });
  223. it("should return errors", function(done) {
  224. var fs = new MemoryFileSystem();
  225. fs.readFile("/fail/file", function(err, content) {
  226. err.should.be.instanceof(Error);
  227. fs.writeFile("/fail/file", "", function(err) {
  228. err.should.be.instanceof(Error);
  229. done();
  230. });
  231. });
  232. });
  233. });
  234. describe("streams", function() {
  235. describe("writable streams", function() {
  236. it("should write files", function() {
  237. var fs = new MemoryFileSystem();
  238. fs.createWriteStream("/file").end("Hello");
  239. fs.readFileSync("/file", "utf8").should.be.eql("Hello");
  240. });
  241. it("should zero files", function() {
  242. var fs = new MemoryFileSystem();
  243. fs.createWriteStream("/file").end();
  244. fs.readFileSync("/file", "utf8").should.be.eql("");
  245. });
  246. it("should accept pipes", function(done) {
  247. // TODO: Any way to avoid the asyncness of this?
  248. var fs = new MemoryFileSystem();
  249. bl(new Buffer("Hello"))
  250. .pipe(fs.createWriteStream("/file"))
  251. .once('finish', function() {
  252. fs.readFileSync("/file", "utf8").should.be.eql("Hello");
  253. done();
  254. });
  255. });
  256. it("should propagate errors", function(done) {
  257. var fs = new MemoryFileSystem();
  258. var stream = fs.createWriteStream("file");
  259. var err = false;
  260. stream.once('error', function() {
  261. err = true;
  262. }).once('finish', function() {
  263. err.should.eql(true);
  264. done();
  265. });
  266. stream.end();
  267. });
  268. });
  269. describe("readable streams", function() {
  270. it("should read files", function(done) {
  271. var fs = new MemoryFileSystem();
  272. fs.writeFileSync("/file", "Hello");
  273. fs.createReadStream("/file").pipe(bl(function(err, data) {
  274. data.toString('utf8').should.be.eql("Hello");
  275. done();
  276. }));
  277. });
  278. it("should respect start/end", function(done) {
  279. var fs = new MemoryFileSystem();
  280. fs.writeFileSync("/file", "Hello");
  281. fs.createReadStream("/file", {
  282. start: 1,
  283. end: 3
  284. }).pipe(bl(function(err, data) {
  285. data.toString('utf8').should.be.eql("el");
  286. done();
  287. }));
  288. });
  289. it("should propagate errors", function(done) {
  290. var fs = new MemoryFileSystem();
  291. var stream = fs.createReadStream("file");
  292. var err = false;
  293. // Why does this dummy event need to be here? It looks like it
  294. // either has to be this or data before the stream will actually
  295. // do anything.
  296. stream.on('readable', function() { }).on('error', function() {
  297. err = true;
  298. }).on('end', function() {
  299. err.should.eql(true);
  300. done();
  301. });
  302. stream.read(0);
  303. });
  304. });
  305. });
  306. describe("normalize", function() {
  307. it("should normalize paths", function() {
  308. var fs = new MemoryFileSystem();
  309. fs.normalize("/a/b/c").should.be.eql("/a/b/c");
  310. fs.normalize("/a//b/c").should.be.eql("/a/b/c");
  311. fs.normalize("/a//b//c").should.be.eql("/a/b/c");
  312. fs.normalize("//a//b//c").should.be.eql("/a/b/c");
  313. fs.normalize("/a/////b/c").should.be.eql("/a/b/c");
  314. fs.normalize("/./a/d///..////b/c").should.be.eql("/a/b/c");
  315. fs.normalize("/..").should.be.eql("/");
  316. fs.normalize("/.").should.be.eql("/");
  317. fs.normalize("/.git").should.be.eql("/.git");
  318. fs.normalize("/a/b/c/.git").should.be.eql("/a/b/c/.git");
  319. fs.normalize("/a/b/c/..git").should.be.eql("/a/b/c/..git");
  320. fs.normalize("/a/b/c/..").should.be.eql("/a/b");
  321. fs.normalize("/a/b/c/../..").should.be.eql("/a");
  322. fs.normalize("/a/b/c/../../..").should.be.eql("/");
  323. fs.normalize("C:\\a\\..").should.be.eql("C:\\");
  324. fs.normalize("C:\\a\\b\\..").should.be.eql("C:\\a");
  325. fs.normalize("C:\\a\\b\\\c\\..\\..").should.be.eql("C:\\a");
  326. fs.normalize("C:\\a\\b\\d\\..\\c\\..\\..").should.be.eql("C:\\a");
  327. fs.normalize("C:\\a\\b\\d\\\\.\\\\.\\c\\.\\..").should.be.eql("C:\\a\\b\\d");
  328. });
  329. });
  330. describe("join", function() {
  331. it("should join paths", function() {
  332. var fs = new MemoryFileSystem();
  333. fs.join("/", "a/b/c").should.be.eql("/a/b/c");
  334. fs.join("/a", "b/c").should.be.eql("/a/b/c");
  335. fs.join("/a/b", "c").should.be.eql("/a/b/c");
  336. fs.join("/a/", "b/c").should.be.eql("/a/b/c");
  337. fs.join("/a//", "b/c").should.be.eql("/a/b/c");
  338. fs.join("a", "b/c").should.be.eql("a/b/c");
  339. fs.join("a/b", "c").should.be.eql("a/b/c");
  340. fs.join("C:", "a/b").should.be.eql("C:\\a\\b");
  341. fs.join("C:\\", "a/b").should.be.eql("C:\\a\\b");
  342. fs.join("C:\\", "a\\b").should.be.eql("C:\\a\\b");
  343. });
  344. it("should join paths (weird cases)", function() {
  345. var fs = new MemoryFileSystem();
  346. fs.join("/", "").should.be.eql("/");
  347. fs.join("/a/b/", "").should.be.eql("/a/b/");
  348. fs.join("/a/b/c", "").should.be.eql("/a/b/c");
  349. fs.join("C:", "").should.be.eql("C:");
  350. fs.join("C:\\a\\b", "").should.be.eql("C:\\a\\b");
  351. });
  352. it("should join paths (absolute request)", function() {
  353. var fs = new MemoryFileSystem();
  354. fs.join("/a/b/c", "/d/e/f").should.be.eql("/d/e/f");
  355. fs.join("C:\\a\\b\\c", "/d/e/f").should.be.eql("/d/e/f");
  356. fs.join("/a/b/c", "C:\\d\\e\\f").should.be.eql("C:\\d\\e\\f");
  357. fs.join("C:\\a\\b\\c", "C:\\d\\e\\f").should.be.eql("C:\\d\\e\\f");
  358. });
  359. });
  360. describe("os", function() {
  361. var fileSystem;
  362. beforeEach(function() {
  363. fileSystem = new MemoryFileSystem({
  364. "": true,
  365. a: {
  366. "": true,
  367. index: new Buffer("1"), // /a/index
  368. dir: {
  369. "": true,
  370. index: new Buffer("2") // /a/dir/index
  371. }
  372. },
  373. "C:": {
  374. "": true,
  375. a: {
  376. "": true,
  377. index: new Buffer("3"), // C:\files\index
  378. dir: {
  379. "": true,
  380. index: new Buffer("4") // C:\files\a\index
  381. }
  382. }
  383. }
  384. });
  385. });
  386. describe("unix", function() {
  387. it("should stat stuff", function() {
  388. fileSystem.statSync("/a").isDirectory().should.be.eql(true);
  389. fileSystem.statSync("/a").isFile().should.be.eql(false);
  390. fileSystem.statSync("/a/index").isDirectory().should.be.eql(false);
  391. fileSystem.statSync("/a/index").isFile().should.be.eql(true);
  392. fileSystem.statSync("/a/dir").isDirectory().should.be.eql(true);
  393. fileSystem.statSync("/a/dir").isFile().should.be.eql(false);
  394. fileSystem.statSync("/a/dir/index").isDirectory().should.be.eql(false);
  395. fileSystem.statSync("/a/dir/index").isFile().should.be.eql(true);
  396. });
  397. it("should readdir directories", function() {
  398. fileSystem.readdirSync("/a").should.be.eql(["index", "dir"]);
  399. fileSystem.readdirSync("/a/dir").should.be.eql(["index"]);
  400. });
  401. it("should readdir directories", function() {
  402. fileSystem.readFileSync("/a/index", "utf-8").should.be.eql("1");
  403. fileSystem.readFileSync("/a/dir/index", "utf-8").should.be.eql("2");
  404. });
  405. it("should also accept multi slashs", function() {
  406. fileSystem.statSync("/a///dir//index").isFile().should.be.eql(true);
  407. });
  408. });
  409. describe("windows", function() {
  410. it("should stat stuff", function() {
  411. fileSystem.statSync("C:\\a").isDirectory().should.be.eql(true);
  412. fileSystem.statSync("C:\\a").isFile().should.be.eql(false);
  413. fileSystem.statSync("C:\\a\\index").isDirectory().should.be.eql(false);
  414. fileSystem.statSync("C:\\a\\index").isFile().should.be.eql(true);
  415. fileSystem.statSync("C:\\a\\dir").isDirectory().should.be.eql(true);
  416. fileSystem.statSync("C:\\a\\dir").isFile().should.be.eql(false);
  417. fileSystem.statSync("C:\\a\\dir\\index").isDirectory().should.be.eql(false);
  418. fileSystem.statSync("C:\\a\\dir\\index").isFile().should.be.eql(true);
  419. });
  420. it("should readdir directories", function() {
  421. fileSystem.readdirSync("C:\\a").should.be.eql(["index", "dir"]);
  422. fileSystem.readdirSync("C:\\a\\dir").should.be.eql(["index"]);
  423. });
  424. it("should readdir directories", function() {
  425. fileSystem.readFileSync("C:\\a\\index", "utf-8").should.be.eql("3");
  426. fileSystem.readFileSync("C:\\a\\dir\\index", "utf-8").should.be.eql("4");
  427. });
  428. it("should also accept multi slashs", function() {
  429. fileSystem.statSync("C:\\\\a\\\\\\dir\\\\index").isFile().should.be.eql(true);
  430. });
  431. it("should also accept a normal slash", function() {
  432. fileSystem.statSync("C:\\a\\dir/index").isFile().should.be.eql(true);
  433. fileSystem.statSync("C:\\a\\dir\\index").isFile().should.be.eql(true);
  434. fileSystem.statSync("C:\\a/dir/index").isFile().should.be.eql(true);
  435. fileSystem.statSync("C:\\a/dir\\index").isFile().should.be.eql(true);
  436. });
  437. });
  438. });