]> git.immae.eu Git - github/fretlink/pronto-hlint.git/blame - spec/pronto/eslint_spec.rb
use xenial on ci
[github/fretlink/pronto-hlint.git] / spec / pronto / eslint_spec.rb
CommitLineData
0ab4d181
MD
1# frozen_string_literal: true
2
9be00a32
MM
3require 'spec_helper'
4
5module Pronto
5001cb27
MD
6 describe ESLintNpm do
7 let(:eslint) { ESLintNpm.new(patches) }
1845f2e3 8 let(:patches) { [] }
9be00a32
MM
9
10 describe '#run' do
2add6782 11 subject(:run) { eslint.run }
9be00a32
MM
12
13 context 'patches are nil' do
14 let(:patches) { nil }
2add6782
MD
15
16 it 'returns an empty array' do
17 expect(run).to eql([])
18 end
9be00a32
MM
19 end
20
21 context 'no patches' do
22 let(:patches) { [] }
2add6782
MD
23
24 it 'returns an empty array' do
25 expect(run).to eql([])
26 end
9be00a32
MM
27 end
28
29509625 29 context 'patches with a one and a four warnings' do
9be00a32
MM
30 include_context 'test repo'
31
32 let(:patches) { repo.diff('master') }
33
2add6782
MD
34 it 'returns correct number of errors' do
35 expect(run.count).to eql(5)
36 end
37
38 it 'has correct first message' do
39 expect(run.first.msg).to eql("'foo' is not defined.")
40 end
1845f2e3
MD
41
42 context(
43 'with files to lint config that never matches',
212da35b 44 config: { 'files_to_lint' => 'will never match' }
1845f2e3
MD
45 ) do
46 it 'returns zero errors' do
47 expect(run.count).to eql(0)
48 end
49 end
50
51 context(
52 'with files to lint config that matches only .js',
fa137a53 53 config: { 'files_to_lint' => '\.js$' }
1845f2e3
MD
54 ) do
55 it 'returns correct amount of errors' do
56 expect(run.count).to eql(2)
57 end
58 end
59
12df00b5 60 context(
61 'with cmd_line_opts to include .html',
62 config: { 'cmd_line_opts' => '--ext .html' }
63 ) do
64 it 'returns correct number of errors' do
65 expect(run.count).to eql 5
66 end
67 end
68
1845f2e3
MD
69 context(
70 'with different eslint executable',
212da35b 71 config: { 'eslint_executable' => './custom_eslint.sh' }
1845f2e3
MD
72 ) do
73 it 'calls the custom eslint eslint_executable' do
74 expect { run }.to raise_error(JSON::ParserError, /custom eslint called/)
75 end
76 end
9be00a32 77 end
fb94b0e6 78
29509625 79 context 'repo with ignored and not ignored file, each with three warnings' do
fb94b0e6
MD
80 include_context 'eslintignore repo'
81
82 let(:patches) { repo.diff('master') }
83
2add6782
MD
84 it 'returns correct number of errors' do
85 expect(run.count).to eql(3)
86 end
87
88 it 'has correct first message' do
89 expect(run.first.msg).to eql("'HelloWorld' is defined but never used.")
90 end
fb94b0e6 91 end
9be00a32 92 end
3403f9d1 93
1845f2e3
MD
94 describe '#files_to_lint' do
95 subject(:files_to_lint) { eslint.files_to_lint }
3403f9d1
MD
96
97 it 'matches .js by default' do
98 expect(files_to_lint).to match('my_js.js')
99 end
100
101 it 'matches .es6 by default' do
102 expect(files_to_lint).to match('my_js.es6')
103 end
104 end
105
1845f2e3
MD
106 describe '#eslint_executable' do
107 subject(:eslint_executable) { eslint.eslint_executable }
3403f9d1
MD
108
109 it 'is `eslint` by default' do
110 expect(eslint_executable).to eql('eslint')
111 end
c89a62b8
MD
112
113 context(
114 'with different eslint executable config',
115 config: { 'eslint_executable' => 'custom_eslint' }
116 ) do
117 it 'is correct' do
118 eslint.read_config
119 expect(eslint_executable).to eql('custom_eslint')
120 end
121 end
122 end
123
124 describe '#eslint_command_line' do
125 subject(:eslint_command_line) { eslint.send(:eslint_command_line, path) }
126 let(:path) { '/some/path.rb' }
127
128 it 'adds json output flag' do
129 expect(eslint_command_line).to include('-f json')
130 end
131
132 it 'adds path' do
133 expect(eslint_command_line).to include(path)
134 end
135
136 it 'starts with eslint executable' do
137 expect(eslint_command_line).to start_with(eslint.eslint_executable)
138 end
139
140 context 'with path that should be escaped' do
141 let(:path) { '/must be/$escaped' }
142
143 it 'escapes the path correctly' do
144 expect(eslint_command_line).to include('/must\\ be/\\$escaped')
145 end
146
147 it 'does not include unescaped path' do
148 expect(eslint_command_line).not_to include(path)
149 end
150 end
12df00b5 151
152 context(
153 'with some command line options',
154 config: { 'cmd_line_opts' => '--my command --line opts' }
155 ) do
156 it 'includes the custom command line options' do
157 eslint.read_config
158 expect(eslint_command_line).to include('--my command --line opts')
159 end
160 end
3403f9d1 161 end
9be00a32
MM
162 end
163end