fune/python/mozlint/test/test_cli.py
Mitchell Hentges 90c289dfa4 Bug 1753769: "runcli.py" in tests should use explicit paths r=ahal
The new `mozlint` behaviour will always lean on the VCS
to only lint changed files.

However, in tests, the VCS is going to be slow and also provide
inconsistent data between tests. Additionally, in some contexts,
the VCS won't be available.

Resolve this by hardcoding a file to lint for each case.

Differential Revision: https://phabricator.services.mozilla.com/D138033
2022-02-08 22:06:59 +00:00

127 lines
3.5 KiB
Python

# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
import os
import subprocess
import sys
from distutils.spawn import find_executable
import mozunit
import pytest
from mozlint import cli
here = os.path.abspath(os.path.dirname(__file__))
@pytest.fixture
def parser():
return cli.MozlintParser()
@pytest.fixture
def run(parser, lintdir, files):
def inner(args=None):
args = args or []
args.extend(files)
lintargs = vars(parser.parse_args(args))
lintargs["root"] = here
lintargs["config_paths"] = [os.path.join(here, "linters")]
return cli.run(**lintargs)
return inner
def test_cli_with_ascii_encoding(run, monkeypatch, capfd):
cmd = [sys.executable, "runcli.py", "-l=string", "-f=stylish", "files/foobar.js"]
env = os.environ.copy()
env["PYTHONPATH"] = os.pathsep.join(sys.path)
env["PYTHONIOENCODING"] = "ascii"
proc = subprocess.Popen(
cmd,
stdout=subprocess.PIPE,
stderr=subprocess.STDOUT,
cwd=here,
env=env,
universal_newlines=True,
)
out = proc.communicate()[0]
assert "Traceback" not in out
def test_cli_run_with_fix(run, capfd):
ret = run(["-f", "json", "--fix", "--linter", "external"])
out, err = capfd.readouterr()
assert ret == 0
assert out.endswith("{}\n")
@pytest.mark.skipif(not find_executable("echo"), reason="No `echo` executable found.")
def test_cli_run_with_edit(run, parser, capfd):
os.environ["EDITOR"] = "echo"
ret = run(["-f", "compact", "--edit", "--linter", "external"])
out, err = capfd.readouterr()
out = out.splitlines()
assert ret == 1
assert out[0].endswith("foobar.js") # from the `echo` editor
assert "foobar.js: line 1, col 1, Error" in out[1]
assert "foobar.js: line 2, col 1, Error" in out[2]
assert "2 problems" in out[-1]
assert len(out) == 5
del os.environ["EDITOR"]
with pytest.raises(SystemExit):
parser.parse_args(["--edit"])
def test_cli_run_with_setup(run, capfd):
# implicitly call setup
ret = run(["-l", "setup", "-l", "setupfailed", "-l", "setupraised"])
out, err = capfd.readouterr()
assert "setup passed" in out
assert "setup failed" in out
assert "setup raised" in out
assert ret == 1
# explicitly call setup
ret = run(["-l", "setup", "-l", "setupfailed", "-l", "setupraised", "--setup"])
out, err = capfd.readouterr()
assert "setup passed" in out
assert "setup failed" in out
assert "setup raised" in out
assert ret == 1
def test_cli_for_exclude_list(run, monkeypatch, capfd):
ret = run(["-l", "excludes", "--check-exclude-list"])
out, err = capfd.readouterr()
assert "**/foobar.js" in out
assert (
"The following list of paths are now green and can be removed from the exclude list:"
in out
)
ret = run(["-l", "excludes_empty", "--check-exclude-list"])
out, err = capfd.readouterr()
assert "No path in the exclude list is green." in out
assert ret == 1
def test_cli_run_with_wrong_linters(run, capfd):
run(["-l", "external", "-l", "foobar"])
out, err = capfd.readouterr()
# Check if it identifes foobar as invalid linter
assert "A failure occurred in the foobar linter." in out
# Check for exception message
assert "Invalid linters given, run again using valid linters or no linters" in out
if __name__ == "__main__":
mozunit.main()