]>
Commit | Line | Data |
---|---|---|
0ab4d181 MD |
1 | # frozen_string_literal: true |
2 | ||
9be00a32 MM |
3 | require 'spec_helper' |
4 | ||
5 | module 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 |
163 | end |