Files
LangBot/tests/test_mattermost_docs.py
T

79 lines
3.8 KiB
Python

"""Read-only contracts for Mattermost documentation translations; no network access."""
import json
from pathlib import Path
import re
import unittest
ROOT = Path(__file__).resolve().parents[1]
LOCALES = {"en": "en", "cn": "zh", "jp": "ja"}
GUIDE = "usage/platforms/mattermost"
IMAGE = re.compile(r"!\[([^\]]*)\]\((/images/[^)]+)\)")
class MattermostDocsTests(unittest.TestCase):
def test_each_site_locale_has_a_guide_and_support_table_entry(self):
docs = json.loads((ROOT / "docs.json").read_text(encoding="utf-8"))
for language in docs["navigation"]["languages"]:
locale = LOCALES[language["language"]]
with self.subTest(locale=locale):
guide = ROOT / f"{locale}/{GUIDE}.mdx"
self.assertTrue(guide.is_file(), f"Missing translated guide: {guide}")
readme = (guide.parent / "readme.mdx").read_text(encoding="utf-8")
rows = [line for line in readme.splitlines() if line.startswith("| Mattermost |")]
self.assertEqual(len(rows), 1)
self.assertIn("✅", rows[0])
self.assertIn(f"](/{locale}/{GUIDE})", rows[0])
self.assertTrue(rows[0].split("|")[3].strip(), "Edition support notes missing")
def test_each_site_locale_lists_mattermost_in_bot_navigation(self):
docs = json.loads((ROOT / "docs.json").read_text(encoding="utf-8"))
def page_lists(value):
if isinstance(value, dict):
if "pages" in value:
yield value["pages"]
for child in value.values():
yield from page_lists(child)
elif isinstance(value, list):
for child in value:
yield from page_lists(child)
for language in docs["navigation"]["languages"]:
locale = LOCALES[language["language"]]
with self.subTest(locale=locale):
groups = [pages for pages in page_lists(language)
if f"{locale}/usage/platforms/slack" in pages]
self.assertEqual(len(groups), 1)
self.assertEqual(groups[0].count(f"{locale}/{GUIDE}"), 1)
def test_translations_preserve_source_steps_permissions_and_assets(self):
source = (ROOT / f"zh/{GUIDE}.mdx").read_text(encoding="utf-8")
source_images = [url for _, url in IMAGE.findall(source)]
for locale, screenshot_note in (("en", "Chinese"), ("ja", "中国語")):
with self.subTest(locale=locale):
path = ROOT / f"{locale}/{GUIDE}.mdx"
self.assertTrue(path.is_file(), f"Missing translated guide: {path}")
text = path.read_text(encoding="utf-8")
self.assertTrue(text.startswith('---\ntitle: "Mattermost"\n'))
self.assertRegex(text, r'(?m)^description: ".+"$')
self.assertIn('icon: "/images/platforms/mattermost.svg"', text)
self.assertTrue((ROOT / "images/platforms/mattermost.svg").is_file())
for permission in ("`post:all`", "`post:channels`"):
self.assertIn(permission, text)
self.assertEqual(len(re.findall(r"^## ", text, re.M)),
len(re.findall(r"^## ", source, re.M)))
self.assertEqual(len(re.findall(r"^- ", text, re.M)),
len(re.findall(r"^- ", source, re.M)))
self.assertIn(screenshot_note, text)
images = IMAGE.findall(text)
self.assertEqual([url for _, url in images], source_images)
for alt, url in images:
self.assertTrue(alt.strip(), "Translated screenshot alt text missing")
self.assertTrue((ROOT / url.lstrip("/")).is_file(), url)
if __name__ == "__main__":
unittest.main()