#!/usr/bin/env fuchsia-vendored-python
# Copyright 2021 The Fuchsia Authors. All rights reserved.
# Use of this source code is governed by a BSD-style license that can be
# found in the LICENSE file.

import os
import subprocess
import tempfile
import unittest
from unittest import mock

import gen_fidldocs


class GenReferenceDocsTest(unittest.TestCase):
    def setUp(self) -> None:
        # Create a temporary directory
        self.temp_dir = tempfile.mkdtemp()

    def test_read_fidl_docs(self) -> None:
        with mock.patch(
            "builtins.open",
            mock.mock_open(
                read_data='[{"ir":"fakefidl_a"},{"ir":"fakefidl_b"}]'
            ),
        ):
            files = gen_fidldocs.read_fidl_packages(self.temp_dir)
            self.assertEquals(files, ["fakefidl_a", "fakefidl_b"])

    def test_run_fidl_doc(self) -> None:
        build_dir = os.path.join(self.temp_dir, "out")
        out_dir = os.path.join(self.temp_dir, "gen")
        mock_files = ["a", "b", "c"]
        with mock.patch.object(subprocess, "run") as mock_run:
            fidldoc_path = os.path.join(build_dir, "host-tools", "fidldoc")
            out_fidl = os.path.join(out_dir, "fidldoc")
            gen_fidldocs.run_fidl_doc(build_dir, out_dir, mock_files)
            mock_run.assert_called_once_with(
                [
                    fidldoc_path,
                    "--silent",
                    "--path",
                    "/reference/fidl/",
                    "--out",
                    out_fidl,
                ]
                + mock_files
            )
