#!/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 unittest
from unittest import mock

import docsgen_transforms


class DocsgenTransformsTest(unittest.TestCase):
    SAMPLE_TOC = 'toc:\n- title: "Code of conduct"\n  path: /CODE_OF_CONDUCT.md\n- title: "Overview"\n  path: /docs/contribute/testing/README.md'
    SAMPLE_MD = "# Diagnostics Selectors\n[TOC]\n## Listener {#Listener}\nblah blah blah\n### OnGesture {#Listener.OnGesture}\nhahaha"
    UPDATED_REF = """Project: /_project.yaml
Book: /_book.yaml
edit_url: https://fuchsia.googlesource.com/reference-docs/+show/main/fakefile
bug_url: https://bugs.fuchsia.dev/p/fuchsia/issues/entry?template=Fuchsia.dev%20Documentation&description=Issue%20on%20page:%20https://ci.android.com/edit?repo=fuchsia/fuchsia/main%26file=fakefile
<!-- public markdown source of this page: https://fuchsia.googlesource.com/reference-docs/+show/main/fakefile -->
<!-- The header above is automatically added to this file. Do not modify anything above this line. -->
# Diagnostics Selectors
[TOC]
## Listener {#Listener}
blah blah blah
### OnGesture {#Listener.OnGesture}
hahaha
<!-- The footer below is automatically added to this file. Do not modify anything below this line. -->

"""
    UPDATED_REG = """Project: /_project.yaml
Book: /_book.yaml
edit_url: https://ci.android.com/edit?repo=fuchsia/fuchsia/main&file=fakefile
bug_url: https://bugs.fuchsia.dev/p/fuchsia/issues/entry?template=Fuchsia.dev%20Documentation&description=Issue%20on%20page:%20https://ci.android.com/edit?repo=fuchsia/fuchsia/main%26file=fakefile
<!-- original source of this page: https://cs.opensource.google/fuchsia/fuchsia/+/main:fakefile -->
<!-- The header above is automatically added to this file. Do not modify anything above this line. -->
# Diagnostics Selectors
[TOC]
## Listener {#Listener}
blah blah blah
### OnGesture {#Listener.OnGesture}
hahaha
<!-- The footer below is automatically added to this file. Do not modify anything below this line. -->
<div class="align-right">
<a href="https://bugs.fuchsia.dev/p/fuchsia/issues/entry?template=Fuchsia.dev%20Documentation&description=Issue%20on%20page:%20https://ci.android.com/edit?repo=fuchsia/fuchsia/main%26file=fakefile" title="Report a bug or suggest improvements on this page"><span class="material-icons" style="font-size: 18px">bug_report</span></a>
<a href="https://cs.opensource.google/fuchsia/fuchsia/+/main:fakefile" title="View the source code of this page"><span class="material-icons" style="font-size: 18px">code</span></a>
<a href="https://ci.android.com/edit?repo=fuchsia/fuchsia/main&file=fakefile" title="Edit the source code of this page"><span class="material-icons" style="font-size: 18px">edit</span></a>
</div>

"""

    def test_add_markdown_footer_and_header_ref(self):
        with mock.patch.object(docsgen_transforms.glob, "glob") as mock_glob:
            with mock.patch(
                "builtins.open", mock.mock_open(read_data=self.SAMPLE_MD)
            ) as mock_open:
                mock_glob.return_value = ["fakefile"]
                docsgen_transforms._add_markdown_header_and_footer(
                    is_regular_docs=False
                )
                handle = mock_open()
                handle.write.assert_called_once_with(self.UPDATED_REF)

    def test_add_markdown_footer_and_header_reg(self):
        with mock.patch.object(docsgen_transforms.glob, "glob") as mock_glob:
            with mock.patch(
                "builtins.open", mock.mock_open(read_data=self.SAMPLE_MD)
            ) as mock_open:
                mock_glob.return_value = ["fakefile"]
                docsgen_transforms._add_markdown_header_and_footer(
                    is_regular_docs=True
                )
                handle = mock_open()
                handle.write.assert_called_once_with(self.UPDATED_REG)

    def test_remove_toc(self):
        with mock.patch.object(docsgen_transforms.glob, "glob") as mock_glob:
            with mock.patch(
                "builtins.open", mock.mock_open(read_data=self.SAMPLE_MD)
            ) as mock_open:
                mock_glob.return_value = ["fakefile"]
                docsgen_transforms._remove_toc()
                handle = mock_open()
                handle.write.assert_called_once_with(
                    "# Diagnostics Selectors\n<!-- commented [TOC] -->\n## Listener {#Listener}\nblah blah blah\n### OnGesture {#Listener.OnGesture}\nhahaha"
                )

    def test_rename_readme(self):
        with mock.patch.object(docsgen_transforms.glob, "glob") as mock_glob:
            with mock.patch.object(
                docsgen_transforms.os, "rename"
            ) as mock_rename:
                mock_glob.return_value = [
                    "path/to/fake/README.md",
                    "README.md",
                ]
                docsgen_transforms._rename_readme()
                mock_rename.assert_any_call(
                    "path/to/fake/README.md", "path/to/fake/index.md"
                )
                mock_rename.assert_any_call("README.md", "index.md")

    def test_canonical_header_anchorid(self):
        with mock.patch.object(docsgen_transforms.glob, "glob") as mock_glob:
            with mock.patch(
                "builtins.open", mock.mock_open(read_data=self.SAMPLE_MD)
            ) as mock_open:
                mock_glob.return_value = ["fakefile"]
                docsgen_transforms._canonical_header_anchorid()
                handle = mock_open()
                handle.write.assert_called_once_with(
                    '# Diagnostics Selectors\n[TOC]\n## Listener {:#Listener transformation="converted"}\nblah blah blah\n### OnGesture {:#Listener.OnGesture transformation="converted"}\nhahaha'
                )

    def test_transform_toc_files_regular(self):
        with mock.patch.object(docsgen_transforms.glob, "glob") as mock_glob:
            with mock.patch(
                "builtins.open", mock.mock_open(read_data=self.SAMPLE_TOC)
            ) as mock_open:
                mock_glob.return_value = ["fakefile"]
                docsgen_transforms._transform_toc_files(is_regular_docs=True)
                handle = mock_open()
                handle.writelines.assert_called_once_with(
                    [
                        "toc:\n",
                        '- title: "Code of conduct"\n',
                        "  path: /fuchsia-src/CODE_OF_CONDUCT.md\n",
                        '- title: "Overview"\n',
                        "  path: /fuchsia-src/contribute/testing/index.md",
                    ]
                )

    def test_transform_toc_files_reference(self):
        with mock.patch.object(docsgen_transforms.glob, "glob") as mock_glob:
            with mock.patch(
                "builtins.open", mock.mock_open(read_data=self.SAMPLE_TOC)
            ) as mock_open:
                mock_glob.return_value = ["fakefile"]
                docsgen_transforms._transform_toc_files(is_regular_docs=False)
                handle = mock_open()
                handle.writelines.assert_called_once_with(
                    [
                        "toc:\n",
                        '- title: "Code of conduct"\n',
                        "  path: /CODE_OF_CONDUCT.md\n",
                        '- title: "Overview"\n',
                        "  path: /docs/contribute/testing/index.md",
                    ]
                )
