gecko-dev/python/mozlint/test/test_pathutils.py
Andrew Halberstadt 1f22f2329e Bug 1494069 - [mozlint] Make sure exclude paths always get discarded when necessary, r=rwood
We were currently adding exclude paths to the "discard" set if the path contains
the include, but we weren't adding them if the include contains the path.

Depends on D5863

Differential Revision: https://phabricator.services.mozilla.com/D8845

--HG--
extra : moz-landing-system : lando
2018-10-16 21:04:14 +00:00

111 lines
3.1 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/.
from __future__ import absolute_import, print_function
import os
from fnmatch import fnmatch
import mozunit
import pytest
from mozlint import pathutils
here = os.path.abspath(os.path.dirname(__file__))
root = os.path.join(here, 'filter')
def assert_paths(a, b):
def normalize(p):
if not os.path.isabs(p):
p = os.path.join(root, p)
return os.path.normpath(p)
assert set(map(normalize, a)) == set(map(normalize, b))
TEST_CASES = (
{
'paths': ['a.js', 'subdir1/subdir3/d.js'],
'include': ['.'],
'exclude': ['subdir1'],
'expected': ['a.js'],
},
{
'paths': ['a.js', 'subdir1/subdir3/d.js'],
'include': ['subdir1/subdir3'],
'exclude': ['subdir1'],
'expected': ['subdir1/subdir3/d.js'],
},
{
'paths': ['.'],
'include': ['.'],
'exclude': ['**/c.py', 'subdir1/subdir3'],
'extensions': ['py'],
'expected': ['.'],
'expected_exclude': ['subdir2/c.py', 'subdir1/subdir3'],
},
{
'paths': ['a.py', 'a.js', 'subdir1/b.py', 'subdir2/c.py', 'subdir1/subdir3/d.py'],
'include': ['.'],
'exclude': ['**/c.py', 'subdir1/subdir3'],
'extensions': ['py'],
'expected': ['a.py', 'subdir1/b.py'],
},
{
'paths': ['a.py', 'a.js', 'subdir2'],
'include': ['.'],
'exclude': [],
'extensions': ['py'],
'expected': ['a.py', 'subdir2'],
},
{
'paths': ['subdir1'],
'include': ['.'],
'exclude': ['subdir1/subdir3'],
'extensions': ['py'],
'expected': ['subdir1'],
'expected_exclude': ['subdir1/subdir3'],
},
)
@pytest.mark.parametrize('test', TEST_CASES)
def test_filterpaths(test):
expected = test.pop('expected')
expected_exclude = test.pop('expected_exclude', [])
paths, exclude = pathutils.filterpaths(root, **test)
assert_paths(paths, expected)
assert_paths(exclude, expected_exclude)
@pytest.mark.parametrize('paths,expected', [
(['subdir1/*'], ['subdir1']),
(['subdir2/*'], ['subdir2']),
(['subdir1/*.*', 'subdir1/subdir3/*', 'subdir2/*'], ['subdir1', 'subdir2']),
([root + '/*', 'subdir1/*.*', 'subdir1/subdir3/*', 'subdir2/*'], [root]),
(['subdir1/b.py', 'subdir1/subdir3'], ['subdir1/b.py', 'subdir1/subdir3']),
(['subdir1/b.py', 'subdir1/b.js'], ['subdir1/b.py', 'subdir1/b.js']),
(['subdir1/subdir3'], ['subdir1/subdir3']),
])
def test_collapse(paths, expected):
os.chdir(root)
inputs = []
for path in paths:
base, name = os.path.split(path)
if '*' in name:
for n in os.listdir(base):
if not fnmatch(n, name):
continue
inputs.append(os.path.join(base, n))
else:
inputs.append(path)
print("inputs: {}".format(inputs))
assert_paths(pathutils.collapse(inputs), expected)
if __name__ == '__main__':
mozunit.main()