# Zulip's OpenAPI-based API documentation system is documented at # https://zulip.readthedocs.io/en/latest/documentation/api.html # # This file contains the top-level logic for testing the cURL examples # in Zulip's API documentation; the details are in # zerver.openapi.curl_param_value_generators. import glob import html import json import shlex import subprocess import markdown from zulip import Client from zerver.models import get_realm from zerver.openapi import markdown_extension from zerver.openapi.curl_param_value_generators import ( CALLED_GENERATOR_FUNCTIONS, REGISTERED_GENERATOR_FUNCTIONS, ) def test_generated_curl_examples_for_success(client: Client) -> None: authentication_line = f"{client.email}:{client.api_key}" # A limited Markdown engine that just processes the code example syntax. realm = get_realm("zulip") md_engine = markdown.Markdown(extensions=[markdown_extension.makeExtension( api_url=realm.uri + "/api")]) # We run our curl tests in alphabetical order (except that we # delay the deactivate-user test to the very end), since we depend # on "add" tests coming before "remove" tests in some cases. We # should try to either avoid ordering dependencies or make them # very explicit. for file_name in sorted( glob.glob("templates/zerver/api/*.md"), key=lambda file_name: (file_name == "templates/zerver/api/deactivate-user.md", file_name), ): documentation_lines = open(file_name).readlines() for line in documentation_lines: # A typical example from the Markdown source looks like this: # {generate_code_example(curl, ...} if not line.startswith("{generate_code_example(curl"): continue # To do an end-to-end test on the documentation examples # that will be actually shown to users, we use the # Markdown rendering pipeline to compute the user-facing # example, and then run that to test it. curl_command_html = md_engine.convert(line.strip()) unescaped_html = html.unescape(curl_command_html) curl_command_text = unescaped_html[len("
curl\n"):-len("