gecko-dev/taskcluster/taskgraph/test/test_util_verify.py
Rob Lemley 29c4b97622 Bug 1609987 - unittests for taskgraph.util.verify. r=tomprince
Some initial tests for verify docs functionality.

Differential Revision: https://phabricator.services.mozilla.com/D60299

--HG--
extra : moz-landing-system : lando
2020-02-28 21:14:03 +00:00

148 lines
5.4 KiB
Python

# -*- coding: utf-8 -*-
# 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 taskgraph.generator and call
taskgraph.util.verify.verify_docs with different parameters to do the
actual checking.
"""
from __future__ import absolute_import, print_function, unicode_literals
import os.path
import pytest
import taskgraph.util.verify
from taskgraph.util.verify import (
DocPaths,
verify_docs
)
from taskgraph import GECKO
from mozunit import main
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(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(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()