JavaScriptObfuscatorCLI.spec.ts 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194
  1. import * as fs from 'fs';
  2. import * as mkdirp from 'mkdirp';
  3. import * as sinon from 'sinon';
  4. import { StdoutWriteMock } from "../mocks/StdoutWriteMock";
  5. import { JavaScriptObfuscator } from "../../src/JavaScriptObfuscator";
  6. const assert: Chai.AssertStatic = require('chai').assert;
  7. describe('JavaScriptObfuscatorCLI', function (): void {
  8. let fixturesDirName: string = 'test/fixtures',
  9. fixtureFileName: string = 'sample.js',
  10. fixtureFilePath: string = `${fixturesDirName}/${fixtureFileName}`,
  11. outputDirName: string = 'test/tmp',
  12. outputFileName: string = 'sample-obfuscated.js',
  13. outputFilePath: string = `${outputDirName}/${outputFileName}`;
  14. this.timeout(5000);
  15. describe('run (): void', () => {
  16. before(() => {
  17. mkdirp.sync(outputDirName);
  18. });
  19. describe('--output option is set', () => {
  20. it('should creates file with obfuscated JS code in --output directory', () => {
  21. JavaScriptObfuscator.runCLI([
  22. 'node',
  23. 'javascript-obfuscator',
  24. fixtureFilePath,
  25. '--output',
  26. outputFilePath,
  27. '--compact',
  28. 'true',
  29. '--selfDefending',
  30. '0'
  31. ]);
  32. assert.equal(fs.existsSync(outputFilePath), true);
  33. });
  34. afterEach(() => {
  35. fs.unlinkSync(outputFilePath);
  36. });
  37. });
  38. describe('--output option is not set', () => {
  39. it(`should creates file called \`${outputFileName}\` with obfuscated JS code in \`${fixturesDirName}\` directory`, () => {
  40. let outputFixturesFilePath: string = `${fixturesDirName}/${outputFileName}`;
  41. JavaScriptObfuscator.runCLI([
  42. 'node',
  43. 'javascript-obfuscator',
  44. fixtureFilePath
  45. ]);
  46. assert.equal(fs.existsSync(outputFixturesFilePath), true);
  47. fs.unlinkSync(outputFixturesFilePath);
  48. });
  49. it(`should throw an error if input path is not a valid file path`, () => {
  50. assert.throws(() => JavaScriptObfuscator.runCLI([
  51. 'node',
  52. 'javascript-obfuscator',
  53. 'wrong/file/path'
  54. ]), ReferenceError);
  55. });
  56. it(`should throw an error if input file extension is not a .js extension`, () => {
  57. let outputWrongExtensionFileName: string = 'sample-obfuscated.ts',
  58. outputWrongExtensionFilePath: string = `${outputDirName}/${outputWrongExtensionFileName}`;
  59. fs.writeFileSync(outputWrongExtensionFilePath, 'data');
  60. assert.throws(() => JavaScriptObfuscator.runCLI([
  61. 'node',
  62. 'javascript-obfuscator',
  63. outputWrongExtensionFilePath
  64. ]), ReferenceError);
  65. fs.unlinkSync(outputWrongExtensionFilePath);
  66. });
  67. });
  68. describe('--sourceMap option is set', () => {
  69. let outputSourceMapPath: string = `${outputFilePath}.map`;
  70. it('should creates file with source map in the same directory as output file', () => {
  71. JavaScriptObfuscator.runCLI([
  72. 'node',
  73. 'javascript-obfuscator',
  74. fixtureFilePath,
  75. '--output',
  76. outputFilePath,
  77. '--compact',
  78. 'true',
  79. '--selfDefending',
  80. '0',
  81. '--sourceMap',
  82. 'true'
  83. ]);
  84. assert.equal(fs.existsSync(outputSourceMapPath), true);
  85. const content: string = fs.readFileSync(outputSourceMapPath, { encoding: 'utf8' }),
  86. sourceMap: any = JSON.parse(content);
  87. assert.property(sourceMap, 'version');
  88. assert.property(sourceMap, 'sources');
  89. assert.property(sourceMap, 'names');
  90. });
  91. it('should creates file with source map in the same directory as output file if `sourceMapBaseUrl` is set', () => {
  92. JavaScriptObfuscator.runCLI([
  93. 'node',
  94. 'javascript-obfuscator',
  95. fixtureFilePath,
  96. '--output',
  97. outputFilePath,
  98. '--compact',
  99. 'true',
  100. '--selfDefending',
  101. '0',
  102. '--sourceMap',
  103. 'true',
  104. '--sourceMapBaseUrl',
  105. 'http://localhost:9000/'
  106. ]);
  107. assert.equal(fs.existsSync(outputSourceMapPath), true);
  108. const content: string = fs.readFileSync(outputSourceMapPath, { encoding: 'utf8' }),
  109. sourceMap: any = JSON.parse(content);
  110. assert.property(sourceMap, 'version');
  111. assert.property(sourceMap, 'sources');
  112. assert.property(sourceMap, 'names');
  113. });
  114. afterEach(() => {
  115. fs.unlinkSync(outputFilePath);
  116. fs.unlinkSync(outputSourceMapPath);
  117. });
  118. });
  119. describe('help output', () => {
  120. let callback: sinon.SinonSpy,
  121. stdoutWriteMock: StdoutWriteMock;
  122. beforeEach(() => {
  123. callback = sinon.spy(console, 'log');
  124. stdoutWriteMock = new StdoutWriteMock(process.stdout.write);
  125. });
  126. it('should print `console.log` help if `--help` option is set', () => {
  127. stdoutWriteMock.mute();
  128. JavaScriptObfuscator.runCLI([
  129. 'node',
  130. 'javascript-obfuscator',
  131. fixtureFilePath,
  132. '--help'
  133. ]);
  134. stdoutWriteMock.restore();
  135. assert.equal(callback.called, true);
  136. });
  137. it('should print `console.log` help if no options is passed', () => {
  138. stdoutWriteMock.mute();
  139. JavaScriptObfuscator.runCLI([
  140. 'node',
  141. 'javascript-obfuscator'
  142. ]);
  143. stdoutWriteMock.restore();
  144. assert.equal(callback.called, true);
  145. });
  146. afterEach(() => {
  147. callback.restore();
  148. });
  149. });
  150. after(() => {
  151. fs.rmdirSync(outputDirName);
  152. });
  153. });
  154. });