#!/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_helpdocs


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

    def test_run_helpdocs(self) -> None:
        out_path = os.path.join(self.temp_dir, "gen", "test.tar.gz")
        src_dir = os.path.join(self.temp_dir, "scripts")
        depfile = os.path.join(self.temp_dir, "depfile")

        fx_bin = os.path.join(src_dir, "scripts/fx")
        with mock.patch.object(subprocess, "run") as mock_run:
            gen_helpdocs.run_fx_helpdoc(src_dir, out_path, depfile)
            mock_run.assert_called_once_with(
                [
                    fx_bin,
                    "helpdoc",
                    "--depfile",
                    depfile,
                    "--archive",
                    out_path,
                ],
                stdout=None,
            )
