File: test_testing.py

package info (click to toggle)
sphinx-toolbox 3.9.0-2
  • links: PTS, VCS
  • area: main
  • in suites: sid
  • size: 2,924 kB
  • sloc: python: 11,636; sh: 26; javascript: 25; makefile: 16
file content (165 lines) | stat: -rw-r--r-- 5,091 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
# stdlib
from typing import Any, Dict

# 3rd party
import pytest
from docutils.nodes import NodeVisitor
from docutils.transforms import Transform
from pygments.lexer import Lexer  # type: ignore[import-untyped]
from sphinx.builders import Builder
from sphinx.domains import Domain
from sphinx.events import EventListener
from sphinx.highlighting import lexer_classes

# this package
from sphinx_toolbox.config import validate_config
from sphinx_toolbox.github.issues import IssueNode, depart_issue_node, visit_issue_node
from sphinx_toolbox.source import source_role
from sphinx_toolbox.testing import Sphinx, run_setup
from tests.common import get_app_config_values


class FakeBuilder(Builder):
	name = "FakeBuilder"


class FakeNodeVisitor(NodeVisitor):
	pass


class FakeDomain(Domain):
	name = "FakeDomain"


class FakeTransform(Transform):
	pass


class FakeLexer(Lexer):
	pass


def get_fake_lexer(*args) -> None:
	return None


def __setup(app: Sphinx) -> Dict[str, Any]:
	"""
	Setup Sphinx Extension.

	:param app: The Sphinx app.
	"""

	app.add_builder(FakeBuilder, override=True)

	app.add_config_value("source_link_target", "Sphinx", "env", types=[str])
	app.add_config_value("github_username", None, "env", types=[str])
	app.add_config_value("rebuild_true", None, True)
	app.add_config_value("rebuild_false", None, False)

	app.add_event("my-event")

	app.set_translator("my-translator", FakeNodeVisitor)

	app.add_node(IssueNode, html=(visit_issue_node, depart_issue_node))

	with pytest.raises(
			ValueError, match="node class 'IssueNode' is already registered, its visitors will be overridden"
			):
		app.add_node(IssueNode, html=(visit_issue_node, depart_issue_node))

	app.add_node(IssueNode, html=(visit_issue_node, depart_issue_node), override=True)

	# TODO: add_enumerable_node
	# TODO: add_directive

	app.add_role("source", source_role)

	with pytest.raises(ValueError, match="role 'source' is already registered, it will be overridden"):
		app.add_role("source", source_role)

	app.add_role("source", source_role, override=True)

	# TODO: add_generic_role

	app.add_domain(FakeDomain)
	app.add_domain(FakeDomain, override=True)

	app.add_role_to_domain("FakeDomain", "source", source_role)  # type: ignore[arg-type]
	app.add_role_to_domain("FakeDomain", "source", source_role, override=True)  # type: ignore[arg-type]

	# TODO: add_directive_to_domain
	# TODO: add_role_to_domain
	# TODO: add_index_to_domain
	# TODO: add_object_type
	# TODO: add_crossref_type

	app.add_transform(FakeTransform)
	app.add_post_transform(FakeTransform)

	app.add_latex_package("booktabs")
	app.add_latex_package("glossaries", options="acronyms")
	app.add_latex_package("chemformula", after_hyperref=True)

	app.add_lexer("my-lexer", FakeLexer)
	assert isinstance(FakeLexer(code='', language=''), Lexer)
	with pytest.raises(
			TypeError, match=r"app.add_lexer\(\) API changed; Please give lexer class instead instance"
			):
		app.add_lexer("my-lexer", FakeLexer(code='', language=''))

	# TODO: add_autodocumenter

	app.add_autodoc_attrgetter(FakeLexer, get_fake_lexer)

	app.add_source_suffix(".py", "python")
	app.add_source_suffix(".py", "python", override=True)

	# TODO: add_source_parser
	# TODO: add_env_collector

	app.add_html_theme("domdf_sphinx_theme", '.')

	# TODO: add_html_math_renderer

	app.connect("config-inited", validate_config, priority=850)

	return {"version": 12345, "parallel_read_safe": True}


def test_testing():
	setup_ret, directives, roles, additional_nodes, app = run_setup(__setup)

	assert app.registry.builders["FakeBuilder"] == FakeBuilder

	assert get_app_config_values(app.config.values["source_link_target"]) == ("Sphinx", "env", [str])
	assert get_app_config_values(app.config.values["github_username"]) == (None, "env", [str])
	assert get_app_config_values(app.config.values["rebuild_true"]) == (None, "env", [])
	assert get_app_config_values(app.config.values["rebuild_false"]) == (None, '', [])

	assert app.events.events["my-event"] == ''
	assert app.registry.translators["my-translator"] is FakeNodeVisitor

	assert additional_nodes == {IssueNode}
	assert app.registry.translation_handlers == {"html": {"IssueNode": (visit_issue_node, depart_issue_node)}}

	assert roles == {"source": source_role}

	assert app.registry.domains["FakeDomain"] == FakeDomain
	assert app.registry.domain_roles.setdefault("FakeDomain", {})["source"] is source_role

	assert app.registry.transforms == [FakeTransform]
	assert app.registry.post_transforms == [FakeTransform]

	assert app.registry.latex_packages == [
			("booktabs", None),
			("glossaries", "acronyms"),
			]
	assert app.registry.latex_packages_after_hyperref == [("chemformula", None)]

	assert lexer_classes["my-lexer"] == FakeLexer
	assert app.registry.autodoc_attrgettrs[FakeLexer] is get_fake_lexer
	assert app.registry.source_suffix[".py"] == "python"
	assert app.html_themes == {"domdf_sphinx_theme": '.'}
	assert app.events.listeners["config-inited"] == [EventListener(id=0, handler=validate_config, priority=850)]
	assert setup_ret == {"version": 12345, "parallel_read_safe": True}