# Copyright 2023 The Bazel Authors. All rights reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
#     http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.

import os
import pathlib
import subprocess
import tempfile
import unittest

from python.runfiles import runfiles


class ExampleTest(unittest.TestCase):
    def __init__(self, *args, **kwargs):
        self.maxDiff = None

        super().__init__(*args, **kwargs)

    def test_pylint_entry_point(self):
        rlocation_path = os.environ.get("ENTRY_POINT")
        assert (
            rlocation_path is not None
        ), "expected 'ENTRY_POINT' env variable to be set to rlocation of the tool"

        entry_point = pathlib.Path(runfiles.Create().Rlocation(rlocation_path))
        self.assertTrue(entry_point.exists(), f"'{entry_point}' does not exist")

        # Let's run the entrypoint and check the tool version.
        #
        # NOTE @aignas 2023-08-24: the Windows python launcher with Python 3.9 and bazel 6 is not happy if we start
        # passing extra files via `subprocess.run` and it starts to fail with an error that the file which is the
        # entry_point cannot be found. However, just calling `--version` seems to be fine.
        proc = subprocess.run(
            [str(entry_point), "--version"],
            check=True,
            stdout=subprocess.PIPE,
            stderr=subprocess.PIPE,
        )
        self.assertEqual(
            "",
            proc.stderr.decode("utf-8").strip(),
        )
        self.assertRegex(proc.stdout.decode("utf-8").strip(), "^pylint 2\.15\.9")

    def test_pylint_report_has_expected_warnings(self):
        rlocation_path = os.environ.get("PYLINT_REPORT")
        assert (
            rlocation_path is not None
        ), "expected 'PYLINT_REPORT' env variable to be set to rlocation of the report"

        pylint_report = pathlib.Path(runfiles.Create().Rlocation(rlocation_path))
        self.assertTrue(pylint_report.exists(), f"'{pylint_report}' does not exist")

        self.assertRegex(
            pylint_report.read_text().strip(),
            "W8201: Logging should be used instead of the print\(\) function\. \(print-function\)",
        )


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