chromium/ui/file_manager/base/presubmit_support_test.py

#!/usr/bin/env python3
# Copyright 2022 The Chromium Authors
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os.path
import unittest
import sys

from presubmit_support import _CheckNoDirectLitImport, _CheckBannedTsTags

sys.path.append(os.path.join(os.path.dirname(__file__), '..', '..', '..'))
from PRESUBMIT_test_mocks import MockInputApi, MockOutputApi, MockFile


class NoDirectLitImportPresubmit(unittest.TestCase):
    def setUp(self):
        self.mock_input_api = MockInputApi()
        self.mock_input_api.change.RepositoryRoot = lambda: os.path.join(
            os.path.dirname(__file__), '..', '..', '..')

        self.mock_output_api = MockOutputApi()

    def emulateJsAndTsFiles(self, lines):
        ts_path = os.path.join('some', 'path', 'foo.ts')
        js_path = os.path.join('some', 'path', 'foo.js')
        foo_ts = MockFile(ts_path, lines)
        foo_js = MockFile(js_path, lines)
        self.mock_input_api.files.extend((foo_ts, foo_js))
        return ts_path, js_path

    def testWarningWithDirectLitImport(self):
        """
        If a TS file foo.ts or a JS file foo.js is changed, and there's direct
        Lit import in the file, show warnings.
        """
        lines = [
            "import {aaa} from 'a.js';",
            "import {css} from 'chrome://resources/mwc/lit/index.js';",
        ]
        ts_path, js_path = self.emulateJsAndTsFiles(lines)
        errors = _CheckNoDirectLitImport(self.mock_input_api,
                                         self.mock_output_api)
        self.assertEqual(2, len(errors))
        self.assertTrue(ts_path + ':2' in errors[0].message)
        self.assertTrue(js_path + ':2' in errors[1].message)

    def testNoWarningWithDirectLitImportInXfBase(self):
        """
        If ui/file_manager/file_manager/widgets/xf_base.ts is changed, and
        there's direct lit import in the file, no warnings.
        """
        lines = [
            "import {aaa} from 'a.js';",
            "import {css} from 'chrome://resources/mwc/lit/index.js';",
        ]
        xf_base_ts = MockFile(
            os.path.join('ui', 'file_manager', 'file_manager', 'widgets',
                         'xf_base.ts'), lines)
        self.mock_input_api.files.append(xf_base_ts)
        errors = _CheckNoDirectLitImport(self.mock_input_api,
                                         self.mock_output_api)
        self.assertEqual([], errors)

    def testNoWarningWithoutDirectLitImport(self):
        """
        If a TS file foo.ts is changed, and there is no direct Lit import
        in the file, no warnings.
        """
        self.emulateJsAndTsFiles(lines=[])
        errors = _CheckNoDirectLitImport(self.mock_input_api,
                                         self.mock_output_api)
        self.assertEqual([], errors)


class BannedTsTagsTest(unittest.TestCase):
    def setUp(self):
        self.mock_input_api = MockInputApi()
        self.mock_input_api.change.RepositoryRoot = lambda: os.path.join(
            os.path.dirname(__file__), '..', '..', '..')

        self.mock_output_api = MockOutputApi()

    def emulateJsAndTsFiles(self, lines):
        ts_path = os.path.join('some', 'path', 'foo.ts')
        js_path = os.path.join('some', 'path', 'foo.js')
        foo_ts = MockFile(ts_path, lines)
        foo_js = MockFile(js_path, lines)
        self.mock_input_api.files.extend((foo_ts, foo_js))
        return ts_path, js_path

    def testNoTags(self):
        lines = [
            "import {aaa} from 'a.js';",
            "import {css} from 'chrome://resources/mwc/lit/index.js';",
        ]
        self.emulateJsAndTsFiles(lines)
        errors = _CheckBannedTsTags(self.mock_input_api, self.mock_output_api)
        self.assertEqual(0, len(errors))

    def testTagOutsideComment(self):
        lines = [
            "import {aaa} from 'a.js';",
            "@ts-ignore randomly in the code",
        ]
        self.emulateJsAndTsFiles(lines)
        errors = _CheckBannedTsTags(self.mock_input_api, self.mock_output_api)
        self.assertEqual(0, len(errors))

    def testDetectInComments(self):
        lines = [
            "// @ts-ignore: It should block for TS",
            "import {aaa} from 'a.js';",
        ]
        ts_path, js_path = self.emulateJsAndTsFiles(lines)
        errors = _CheckBannedTsTags(self.mock_input_api, self.mock_output_api)
        self.assertEqual(1, len(errors))
        self.assertIn(ts_path, errors[0].items[0])


if __name__ == '__main__':
    unittest.main()