Before: call ale#assert#SetUpFixerTest('javascript', 'eslint') runtime autoload/ale/handlers/eslint.vim After: call ale#assert#TearDownFixerTest() Execute(The executable path should be correct): call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.js') " eslint_d output with an older eslint version is used here. GivenCommandOutput ['v4.4.1 (eslint_d v5.1.0)'] AssertFixer \ { \ 'read_temporary_file': 1, \ 'command': (has('win32') ? 'node.exe ' : '') \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/eslint/bin/eslint.js')) \ . ' -c ' . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/.eslintrc.js')) \ . ' --fix %t', \ } Execute(The lower priority configuration file in a nested directory should be preferred): call ale#test#SetFilename('../eslint-test-files/react-app/subdir-with-config/testfile.js') AssertFixer \ { \ 'read_temporary_file': 1, \ 'command': (has('win32') ? 'node.exe ' : '') \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/eslint/bin/eslint.js')) \ . ' -c ' . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/subdir-with-config/.eslintrc')) \ . ' --fix %t', \ } Execute(package.json should be used as a last resort): call ale#test#SetFilename('../eslint-test-files/react-app/subdir-with-package-json/testfile.js') AssertFixer \ { \ 'read_temporary_file': 1, \ 'command': (has('win32') ? 'node.exe ' : '') \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/eslint/bin/eslint.js')) \ . ' -c ' . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/.eslintrc.js')) \ . ' --fix %t', \ } call ale#test#SetFilename('../eslint-test-files/package.json') AssertFixer \ { \ 'read_temporary_file': 1, \ 'command': \ ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/node_modules/.bin/eslint')) \ . ' -c ' . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/package.json')) \ . ' --fix %t', \ } Execute(The version check should be correct): call ale#test#SetFilename('../eslint-test-files/react-app/subdir-with-config/testfile.js') " We should run the command to get the version the first time. GivenCommandOutput ['4.9.0'] AssertFixer [ \ (has('win32') ? 'node.exe ' : '') \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/eslint/bin/eslint.js')) \ . ' --version', \ { \ 'command': (has('win32') ? 'node.exe ' : '') \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/eslint/bin/eslint.js')) \ . ' --stdin-filename %s --stdin --fix-dry-run --format=json', \ 'process_with': 'ale#fixers#eslint#ProcessFixDryRunOutput', \ }, \] AssertFixer [ \ { \ 'command': (has('win32') ? 'node.exe ' : '') \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/eslint/bin/eslint.js')) \ . ' --stdin-filename %s --stdin --fix-dry-run --format=json', \ 'process_with': 'ale#fixers#eslint#ProcessFixDryRunOutput', \ }, \] Execute(--fix-dry-run should be used for 4.9.0 and up): call ale#test#SetFilename('../eslint-test-files/react-app/subdir/testfile.js') GivenCommandOutput ['4.9.0'] AssertFixer \ { \ 'command': (has('win32') ? 'node.exe ' : '') \ . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/react-app/node_modules/eslint/bin/eslint.js')) \ . ' --stdin-filename %s --stdin --fix-dry-run --format=json', \ 'process_with': 'ale#fixers#eslint#ProcessFixDryRunOutput', \ } Execute(--fix-to-stdout should be used for eslint_d): call ale#test#SetFilename('../eslint-test-files/app-with-eslint-d/testfile.js') AssertFixer \ { \ 'read_temporary_file': 1, \ 'command': \ ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/app-with-eslint-d/node_modules/.bin/eslint_d')) \ . ' -c ' . ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/package.json')) \ . ' --fix %t', \ } " The option should be used when eslint_d is new enough. " We look at the ESLint version instead of the eslint_d version. GivenCommandOutput ['v3.19.0 (eslint_d v4.2.0)'] AssertFixer \ { \ 'command': \ ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/app-with-eslint-d/node_modules/.bin/eslint_d')) \ . ' --stdin-filename %s --stdin --fix-to-stdout', \ 'process_with': 'ale#fixers#eslint#ProcessEslintDOutput', \ } " The option should be used for new versions too. GivenCommandOutput ['4.9.0'] AssertFixer \ { \ 'command': \ ale#Escape(ale#path#Simplify(g:dir . '/../eslint-test-files/app-with-eslint-d/node_modules/.bin/eslint_d')) \ . ' --stdin-filename %s --stdin --fix-to-stdout', \ 'process_with': 'ale#fixers#eslint#ProcessEslintDOutput', \ } Execute(The --fix-dry-run post-processor should handle JSON output correctly): AssertEqual \ [], \ ale#fixers#eslint#ProcessFixDryRunOutput(bufnr(''), []) AssertEqual \ [], \ ale#fixers#eslint#ProcessFixDryRunOutput(bufnr(''), ['']) AssertEqual \ [], \ ale#fixers#eslint#ProcessFixDryRunOutput(bufnr(''), ['[{}]']) AssertEqual \ ['foo', 'bar'], \ ale#fixers#eslint#ProcessFixDryRunOutput(bufnr(''), ['[{"output": "foo\nbar"}]']) Execute(The eslint_d post-processor should permit regular JavaScript content): AssertEqual \ [ \ 'const x = ''Error: foo''', \ 'const y = 3', \ ], \ ale#fixers#eslint#ProcessEslintDOutput(bufnr(''), [ \ 'const x = ''Error: foo''', \ 'const y = 3', \ ]) Execute(The eslint_d post-processor should handle error messages correctly): AssertEqual \ [], \ ale#fixers#eslint#ProcessEslintDOutput(bufnr(''), [ \ 'Error: No ESLint configuration found.', \ ]) Execute(The eslint_d post-processor should handle failing to connect properly): AssertEqual \ [], \ ale#fixers#eslint#ProcessEslintDOutput(bufnr(''), [ \ 'Could not connect', \ ])