test-exclude.js 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196
  1. /* global describe, it, context */
  2. const exclude = require('../')
  3. require('chai').should()
  4. describe('testExclude', function () {
  5. it('should exclude the node_modules folder by default', function () {
  6. exclude().shouldInstrument('./banana/node_modules/cat.js').should.equal(false)
  7. exclude().shouldInstrument('node_modules/cat.js').should.equal(false)
  8. })
  9. it('ignores ./', function () {
  10. exclude().shouldInstrument('./test.js').should.equal(false)
  11. exclude().shouldInstrument('./foo.test.js').should.equal(false)
  12. })
  13. it('matches files in root with **/', function () {
  14. exclude().shouldInstrument('__tests__/**').should.equal(false)
  15. })
  16. it('does not instrument files outside cwd', function () {
  17. exclude().shouldInstrument('../foo.js').should.equal(false)
  18. })
  19. it('applies exclude rule ahead of include rule', function () {
  20. const e = exclude({
  21. include: ['test.js', 'foo.js'],
  22. exclude: ['test.js']
  23. })
  24. e.shouldInstrument('test.js').should.equal(false)
  25. e.shouldInstrument('foo.js').should.equal(true)
  26. e.shouldInstrument('banana.js').should.equal(false)
  27. })
  28. it('should handle gitignore-style excludes', function () {
  29. const e = exclude({
  30. exclude: ['dist']
  31. })
  32. e.shouldInstrument('dist/foo.js').should.equal(false)
  33. e.shouldInstrument('dist/foo/bar.js').should.equal(false)
  34. e.shouldInstrument('src/foo.js').should.equal(true)
  35. })
  36. it('should handle gitignore-style includes', function () {
  37. const e = exclude({
  38. include: ['src']
  39. })
  40. e.shouldInstrument('src/foo.test.js').should.equal(false)
  41. e.shouldInstrument('src/foo.js').should.equal(true)
  42. e.shouldInstrument('src/foo/bar.js').should.equal(true)
  43. })
  44. it("handles folder '.' in path", function () {
  45. const e = exclude()
  46. e.shouldInstrument('test/fixtures/basic/.next/dist/pages/async-props.js').should.equal(false)
  47. })
  48. it('excludes node_modules folder, even when empty exclude group is provided', function () {
  49. const e = exclude({
  50. exclude: []
  51. })
  52. e.shouldInstrument('./banana/node_modules/cat.js').should.equal(false)
  53. e.shouldInstrument('node_modules/some/module/to/cover.js').should.equal(false)
  54. e.shouldInstrument('__tests__/a-test.js').should.equal(true)
  55. e.shouldInstrument('src/a.test.js').should.equal(true)
  56. e.shouldInstrument('src/foo.js').should.equal(true)
  57. })
  58. it('allows node_modules folder to be included, if !node_modules is explicitly provided', function () {
  59. const e = exclude({
  60. exclude: ['!**/node_modules/**']
  61. })
  62. e.shouldInstrument('./banana/node_modules/cat.js').should.equal(true)
  63. e.shouldInstrument('node_modules/some/module/to/cover.js').should.equal(true)
  64. e.shouldInstrument('__tests__/a-test.js').should.equal(true)
  65. e.shouldInstrument('src/a.test.js').should.equal(true)
  66. e.shouldInstrument('src/foo.js').should.equal(true)
  67. })
  68. it('exports defaultExclude', function () {
  69. exclude.defaultExclude.should.deep.equal([
  70. 'test/**',
  71. 'test{,-*}.js',
  72. '**/*.test.js',
  73. '**/__tests__/**',
  74. '**/node_modules/**'
  75. ])
  76. })
  77. describe('pkgConf', function () {
  78. it('should load exclude rules from config key', function () {
  79. const e = exclude({
  80. configPath: './test/fixtures/exclude',
  81. configKey: 'a'
  82. })
  83. e.shouldInstrument('foo.js').should.equal(true)
  84. e.shouldInstrument('batman.js').should.equal(false)
  85. e.configFound.should.equal(true)
  86. })
  87. it('should load include rules from config key', function () {
  88. const e = exclude({
  89. configPath: './test/fixtures/include',
  90. configKey: 'b'
  91. })
  92. e.shouldInstrument('foo.js').should.equal(false)
  93. e.shouldInstrument('batman.js').should.equal(true)
  94. e.configFound.should.equal(true)
  95. })
  96. it('should only instrument files that are included in subdirs', function () {
  97. const e = exclude({
  98. configPath: './test/fixtures/include-src-only',
  99. configKey: 'c'
  100. })
  101. e.shouldInstrument('bar/baz.js').should.equal(false)
  102. e.shouldInstrument('bad/file.js').should.equal(false)
  103. e.shouldInstrument('foo.js').should.equal(false)
  104. e.shouldInstrument('src/app.test.js').should.equal(false)
  105. e.shouldInstrument('src/app.js').should.equal(true)
  106. })
  107. it('should respect defaultExcludes if no config is given', function () {
  108. const e = exclude({
  109. configPath: './test/fixtures/defaults',
  110. configKey: 'd'
  111. })
  112. e.shouldInstrument('test.js').should.equal(false)
  113. e.shouldInstrument('src/app.test.js').should.equal(false)
  114. e.shouldInstrument('bar/baz.js').should.equal(true)
  115. e.shouldInstrument('bad/file.js').should.equal(true)
  116. e.shouldInstrument('foo.js').should.equal(true)
  117. e.shouldInstrument('index.js').should.equal(true)
  118. })
  119. it('should not throw if a key is missing', function () {
  120. var e = exclude({
  121. configPath: './test/fixtures/include',
  122. configKey: 'c'
  123. })
  124. e.configFound.should.equal(false)
  125. })
  126. context('when given an object', function () {
  127. it('should use the defaultExcludes if the object is empty', function () {
  128. const e = exclude({
  129. configPath: './test/fixtures/exclude-empty-object',
  130. configKey: 'e'
  131. })
  132. e.shouldInstrument('test.js').should.equal(false)
  133. e.shouldInstrument('src/app.test.js').should.equal(false)
  134. e.shouldInstrument('bar/baz.js').should.equal(true)
  135. e.shouldInstrument('bad/file.js').should.equal(true)
  136. e.shouldInstrument('foo.js').should.equal(true)
  137. e.shouldInstrument('index.js').should.equal(true)
  138. })
  139. it('should use the defaultExcludes if the object is not empty', function () {
  140. const e = exclude({
  141. configPath: './test/fixtures/exclude-object',
  142. configKey: 'e'
  143. })
  144. e.shouldInstrument('test.js').should.equal(false)
  145. e.shouldInstrument('src/app.test.js').should.equal(false)
  146. e.shouldInstrument('bar/baz.js').should.equal(true)
  147. e.shouldInstrument('bad/file.js').should.equal(true)
  148. e.shouldInstrument('foo.js').should.equal(true)
  149. e.shouldInstrument('index.js').should.equal(true)
  150. })
  151. })
  152. })
  153. // see: https://github.com/istanbuljs/babel-plugin-istanbul/issues/71
  154. it('allows exclude/include rule to be a string', function () {
  155. const e = exclude({
  156. exclude: 'src/**/*.spec.js',
  157. include: 'src/**'
  158. })
  159. e.shouldInstrument('src/batman/robin/foo.spec.js').should.equal(false)
  160. e.shouldInstrument('src/batman/robin/foo.js').should.equal(true)
  161. })
  162. })