# This Source Code Form is subject to the terms of the Mozilla Public
# License, v. 2.0. If a copy of the MPL was not distributed with this
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
"""
There are some basic tests run
as part of the Decision task to make sure
documentation exists
for taskgraph functionality.
These functions are defined
in gecko_taskgraph.generator
and call
gecko_taskgraph.util.verify.verify_docs
with different parameters to do the
actual checking.
"""
import os.path
import pytest
from mozunit
import main
import gecko_taskgraph.util.verify
from gecko_taskgraph
import GECKO
from gecko_taskgraph.util.verify
import DocPaths, verify_docs
FF_DOCS_BASE = os.path.join(GECKO,
"taskcluster",
"docs")
EXTRA_DOCS_BASE = os.path.abspath(os.path.join(os.path.dirname(__file__),
"docs"))
@pytest.fixture
def mock_single_doc_path(monkeypatch):
"""Set a single path containing documentation"""
mocked_documentation_paths = DocPaths()
mocked_documentation_paths.add(FF_DOCS_BASE)
monkeypatch.setattr(
gecko_taskgraph.util.verify,
"documentation_paths", mocked_documentation_paths
)
@pytest.fixture
def mock_two_doc_paths(monkeypatch):
"""Set two paths containing documentation"""
mocked_documentation_paths = DocPaths()
mocked_documentation_paths.add(FF_DOCS_BASE)
mocked_documentation_paths.add(EXTRA_DOCS_BASE)
monkeypatch.setattr(
gecko_taskgraph.util.verify,
"documentation_paths", mocked_documentation_paths
)
@pytest.mark.usefixtures(
"mock_single_doc_path")
class PyTestSingleDocPath:
"""
Taskcluster documentation
for Firefox
is in a single directory. Check the tests
running at build time to make sure documentation exists, actually work themselves.
"""
def test_heading(self):
"""
Look
for a headings
in filename matching identifiers. This
is used when making sure
documentation exists
for kinds
and attributes.
"""
verify_docs(
filename=
"kinds.rst",
identifiers=[
"build",
"packages",
"toolchain"],
appearing_as=
"heading",
)
with pytest.raises(Exception, match=
"missing from doc file"):
verify_docs(
filename=
"kinds.rst",
identifiers=[
"build",
"packages",
"badvalue"],
appearing_as=
"heading",
)
def test_inline_literal(self):
"""
Look
for inline-literals
in filename. Used when checking documentation
for decision
task parameters
and run-using functions.
"""
verify_docs(
filename=
"parameters.rst",
identifiers=[
"base_repository",
"head_repository",
"owner"],
appearing_as=
"inline-literal",
)
with pytest.raises(Exception, match=
"missing from doc file"):
verify_docs(
filename=
"parameters.rst",
identifiers=[
"base_repository",
"head_repository",
"badvalue"],
appearing_as=
"inline-literal",
)
@pytest.mark.usefixtures(
"mock_two_doc_paths")
class PyTestTwoDocPaths:
"""
Thunderbird extends Firefox
's taskgraph with additional kinds. The documentation
for Thunderbird kinds are
in its repository,
and documentation_paths will have
two places to look
for files. Run the same tests
as for a single documentation
path,
and cover additional possible scenarios.
"""
def test_heading(self):
"""
Look
for a headings
in filename matching identifiers. This
is used when
making sure documentation exists
for kinds
and attributes.
The first test looks
for headings that are all within the first doc path,
the second test
is new
and has a heading found
in the second path.
The final check has a identifier that will
not match
and should
produce an error.
"""
verify_docs(
filename=
"kinds.rst",
identifiers=[
"build",
"packages",
"toolchain"],
appearing_as=
"heading",
)
verify_docs(
filename=
"kinds.rst",
identifiers=[
"build",
"packages",
"newkind"],
appearing_as=
"heading",
)
with pytest.raises(Exception, match=
"missing from doc file"):
verify_docs(
filename=
"kinds.rst",
identifiers=[
"build",
"packages",
"badvalue"],
appearing_as=
"heading",
)
def test_inline_literal(self):
"""
Look
for inline-literals
in filename. Used when checking documentation
for decision
task parameters
and run-using functions.
As with the heading tests,
the second check looks
for an identifier
in the added documentation path.
"""
verify_docs(
filename=
"parameters.rst",
identifiers=[
"base_repository",
"head_repository",
"owner"],
appearing_as=
"inline-literal",
)
verify_docs(
filename=
"parameters.rst",
identifiers=[
"base_repository",
"head_repository",
"newparameter"],
appearing_as=
"inline-literal",
)
with pytest.raises(Exception, match=
"missing from doc file"):
verify_docs(
filename=
"parameters.rst",
identifiers=[
"base_repository",
"head_repository",
"badvalue"],
appearing_as=
"inline-literal",
)
if __name__ ==
"__main__":
main()