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
|
"""
Testing the project
(C) Laurent Franceschetti 2024
"""
import pytest
import re
from mkdocs_test.common import find_after
from test.fixture import MacrosDocProject
CURRENT_project = '.'
def test_pages():
project = MacrosDocProject(CURRENT_project)
project.build()
# did not fail
assert not project.build_result.returncode
# ----------------
# Check that the chatter works
# ----------------
entries = project.find_entries(source='main')
assert len(entries) > 0
# the post-built worked:
assert project.find_entry(source='main', title='post_build')
# ----------------
# First page
# ----------------
page = project.get_page('index')
assert page.is_markdown_rendered()
VARIABLE_NAME = 'unit_price'
# it is defined in the config file (extra)
assert VARIABLE_NAME in project.config.extra
price = project.config.extra.unit_price
# check the page meta
# those meta are not in the config file
meta = page.meta
assert 'user' in meta
assert 'bottles' in meta
assert 'announcement' in meta
assert meta.user == 'Joe'
assert page.find_text(meta.user, header='Installed', header_level=4)
assert page.find_text(meta.announcement, header='Accessing meta')
assert page.find_text(meta.bottles.lemonade, header='Dot notation')
assert not page.find_text(meta.user * 2, header='Macro') # negative test
assert 'bottles' not in project.config.extra
assert 'bottles' not in project.variables
# check that the `greeting` variable is rendered:
assert VARIABLE_NAME in project.variables
assert f"{price} euros" in page.markdown
assert f"{project.macros_plugin.include_dir}" in page.markdown
# check that both on_pre/post_page_macro() worked
assert "Added Footer (Pre-macro)" in page.markdown, f"Not in {page.markdown}"
assert page.find_text(r'is \d{4}-\d{2}-\d{2}', header='Pre-macro')
assert "Added Footer (Post-macro)" in page.markdown
assert find_after(page.plain_text, 'name of the page', 'home')
assert page.find_text('Home', header='Post-macro')
# ----------------
# Environment page
# ----------------
page = project.get_page('environment')
# read a few things that are in the tables
assert page.find_text('unit_price = 50', header='General list')
# there are two headers containing 'Macros':
assert page.find_text('say_hello', header='Macros$')
# test the `include_file()` method (used for the mkdocs.yaml file)
HEADER = r"^mkdocs.*portion"
assert page.find_text('site_name:', header=HEADER)
assert page.find_text('name: material', header=HEADER)
assert not page.find_text('foobar 417', header=HEADER) # negative control
# ----------------
# Literal page
# ----------------
page = project.get_page('literal')
# instruction not to render:
assert page.meta.render_macros == False
assert page.is_markdown_rendered() == False, f"Target: {page.markdown}, \nSource:{page.source_page.markdown}"
# Latex is not interpreted:
latex = re.escape(r"\begin{tabular}{|ccc|}")
assert page.find_text(latex, header='Offending Latex')
# Footer is processed (but not rendered)
assert page.find_text(r'now()', header='Pre-macro')
assert page.find_text('Not interpreted', header='Post-macro')
def test_strict():
"This project must fail"
project = MacrosDocProject(CURRENT_project)
# it must fail with the --strict option,
# because the second page contains an error
project.build(strict=True)
assert not project.build_result.returncode
warning = project.find_entry("Macro Rendering",
severity='warning')
assert not warning, "Warning found, shouldn't!"
|