]> git.immae.eu Git - github/fretlink/pronto-hlint.git/blob - spec/pronto/eslint_spec.rb
a00a05b519656393d6bb898916491e6832bc1e5b
[github/fretlink/pronto-hlint.git] / spec / pronto / eslint_spec.rb
1 # frozen_string_literal: true
2
3 require 'spec_helper'
4
5 module Pronto
6 describe ESLintNpm do
7 let(:eslint) { ESLintNpm.new(patches) }
8 let(:patches) { [] }
9
10 describe '#run' do
11 subject(:run) { eslint.run }
12
13 context 'patches are nil' do
14 let(:patches) { nil }
15
16 it 'returns an empty array' do
17 expect(run).to eql([])
18 end
19 end
20
21 context 'no patches' do
22 let(:patches) { [] }
23
24 it 'returns an empty array' do
25 expect(run).to eql([])
26 end
27 end
28
29 context 'patches with a one and a four warnings' do
30 include_context 'test repo'
31
32 let(:patches) { repo.diff('master') }
33
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
41
42 context(
43 'with files to lint config that never matches',
44 config: { 'files_to_lint' => 'will never match' }
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',
53 config: { 'files_to_lint' => '\.js$' }
54 ) do
55 it 'returns correct amount of errors' do
56 expect(run.count).to eql(2)
57 end
58 end
59
60 context(
61 'with different eslint executable',
62 config: { 'eslint_executable' => './custom_eslint.sh' }
63 ) do
64 it 'calls the custom eslint eslint_executable' do
65 expect { run }.to raise_error(JSON::ParserError, /custom eslint called/)
66 end
67 end
68 end
69
70 context 'repo with ignored and not ignored file, each with three warnings' do
71 include_context 'eslintignore repo'
72
73 let(:patches) { repo.diff('master') }
74
75 it 'returns correct number of errors' do
76 expect(run.count).to eql(3)
77 end
78
79 it 'has correct first message' do
80 expect(run.first.msg).to eql("'HelloWorld' is defined but never used.")
81 end
82 end
83 end
84
85 describe '#files_to_lint' do
86 subject(:files_to_lint) { eslint.files_to_lint }
87
88 it 'matches .js by default' do
89 expect(files_to_lint).to match('my_js.js')
90 end
91
92 it 'matches .es6 by default' do
93 expect(files_to_lint).to match('my_js.es6')
94 end
95 end
96
97 describe '#eslint_executable' do
98 subject(:eslint_executable) { eslint.eslint_executable }
99
100 it 'is `eslint` by default' do
101 expect(eslint_executable).to eql('eslint')
102 end
103
104 context(
105 'with different eslint executable config',
106 config: { 'eslint_executable' => 'custom_eslint' }
107 ) do
108 it 'is correct' do
109 eslint.read_config
110 expect(eslint_executable).to eql('custom_eslint')
111 end
112 end
113 end
114
115 describe '#eslint_command_line' do
116 subject(:eslint_command_line) { eslint.send(:eslint_command_line, path) }
117 let(:path) { '/some/path.rb' }
118
119 it 'adds json output flag' do
120 expect(eslint_command_line).to include('-f json')
121 end
122
123 it 'adds path' do
124 expect(eslint_command_line).to include(path)
125 end
126
127 it 'starts with eslint executable' do
128 expect(eslint_command_line).to start_with(eslint.eslint_executable)
129 end
130
131 context 'with path that should be escaped' do
132 let(:path) { '/must be/$escaped' }
133
134 it 'escapes the path correctly' do
135 expect(eslint_command_line).to include('/must\\ be/\\$escaped')
136 end
137
138 it 'does not include unescaped path' do
139 expect(eslint_command_line).not_to include(path)
140 end
141 end
142 end
143 end
144 end