From 21be0ef44562a4fd9456d48914c00d4c4aaa6d31 Mon Sep 17 00:00:00 2001 From: 100RABHpy Date: Fri, 2 Apr 2021 15:58:50 +0530 Subject: [PATCH] openapi: Refactor hacky openAPI curl test. MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Fixes #17795 In PR #17014, we added support for deactivate-own-user. And while doing so, we first deactivated the client and then reactivated it. But this implementation is a bit hacky. So, to fix this, we're now deactivating a test_user so that we don't have to reactivate it. We did so by changing the value of authentication_line. As we want to keep endpoint code out of the “test_curl_examples”, we changed the value of authentication_line in `curl_param_value_generators.py`. To work this out, we create a new global variable named AUTHENTICATION_LINE in “curl_param_value_generators.py” and change its value in function “deactivate_own_user” and to use this change in “test_curl_examples,” we import AUTHENTICATION_LINE. AUTHENTICATION_LINE is of list data type because we want a pointer to original mutable object so that changes made during run time show across the module. Another way to do this is to change the way we import variable, but that will be inconsistent to the way we had in all other files. To remove confusion between AUTHENTICATION_LINE and authentication_line we renamed authentication_line to default_authentication_line. --- tools/test-api | 2 +- zerver/openapi/curl_param_value_generators.py | 25 +++++++++++++++- zerver/openapi/test_curl_examples.py | 29 +++++++------------ 3 files changed, 36 insertions(+), 20 deletions(-) diff --git a/tools/test-api b/tools/test-api index c2cb4d84f1..fd4e88da8e 100755 --- a/tools/test-api +++ b/tools/test-api @@ -106,7 +106,7 @@ with test_server_running( ) test_the_api(client, nonadmin_client, owner_client) - test_generated_curl_examples_for_success(client, owner_client) + test_generated_curl_examples_for_success(client) test_js_bindings(client) # Test error payloads diff --git a/zerver/openapi/curl_param_value_generators.py b/zerver/openapi/curl_param_value_generators.py index 4e0e55a913..5f2db62892 100644 --- a/zerver/openapi/curl_param_value_generators.py +++ b/zerver/openapi/curl_param_value_generators.py @@ -20,11 +20,15 @@ from zerver.lib.actions import ( from zerver.lib.events import do_events_register from zerver.lib.initial_password import initial_password from zerver.lib.test_classes import ZulipTestCase -from zerver.models import Client, Message, UserGroup, UserPresence, get_realm +from zerver.lib.users import get_api_key +from zerver.models import Client, Message, UserGroup, UserPresence, get_realm, get_user GENERATOR_FUNCTIONS: Dict[str, Callable[[], Dict[str, object]]] = {} REGISTERED_GENERATOR_FUNCTIONS: Set[str] = set() CALLED_GENERATOR_FUNCTIONS: Set[str] = set() +# This is a List rather than just a string in order to make it easier +# to write to it from another module. +AUTHENTICATION_LINE: List[str] = [""] helpers = ZulipTestCase() @@ -310,3 +314,22 @@ def deactivate_user() -> Dict[str, object]: acting_user=None, ) return {"user_id": user_profile.id} + + +@openapi_param_value_generator(["/users/me:delete"]) +def deactivate_own_user() -> Dict[str, object]: + test_user_email = "delete-test@zulip.com" + deactivate_test_user = do_create_user( + test_user_email, + "secret", + get_realm("zulip"), + "Mr. Delete", + role=200, + acting_user=None, + ) + realm = get_realm("zulip") + test_user = get_user(test_user_email, realm) + test_user_api_key = get_api_key(test_user) + # change authentication line to allow test_client to delete itself. + AUTHENTICATION_LINE[0] = f"{deactivate_test_user.email}:{test_user_api_key}" + return {} diff --git a/zerver/openapi/test_curl_examples.py b/zerver/openapi/test_curl_examples.py index 90be1939d0..016d3c70c8 100644 --- a/zerver/openapi/test_curl_examples.py +++ b/zerver/openapi/test_curl_examples.py @@ -16,11 +16,14 @@ from zulip import Client from zerver.models import get_realm from zerver.openapi import markdown_extension -from zerver.openapi.curl_param_value_generators import assert_all_helper_functions_called +from zerver.openapi.curl_param_value_generators import ( + AUTHENTICATION_LINE, + assert_all_helper_functions_called, +) -def test_generated_curl_examples_for_success(client: Client, owner_client: Client) -> None: - authentication_line = f"{client.email}:{client.api_key}" +def test_generated_curl_examples_for_success(client: Client) -> None: + default_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( @@ -35,6 +38,10 @@ def test_generated_curl_examples_for_success(client: Client, owner_client: Clien for file_name in sorted(glob.glob("templates/zerver/api/*.md")): with open(file_name) as f: for line in f: + # Set AUTHENTICATION_LINE to default_authentication_line. + # Set this every iteration, because deactivate_own_user + # will override this for its test. + AUTHENTICATION_LINE[0] = default_authentication_line # A typical example from the Markdown source looks like this: # {generate_code_example(curl, ...} if not line.startswith("{generate_code_example(curl"): @@ -47,21 +54,9 @@ def test_generated_curl_examples_for_success(client: Client, owner_client: Clien unescaped_html = html.unescape(curl_command_html) curl_command_text = unescaped_html[len("

curl\n") : -len("

")] curl_command_text = curl_command_text.replace( - "BOT_EMAIL_ADDRESS:BOT_API_KEY", authentication_line + "BOT_EMAIL_ADDRESS:BOT_API_KEY", AUTHENTICATION_LINE[0] ) - # TODO: This needs_reactivation block is a hack. - # However, it's awkward to test the "deactivate - # myself" endpoint with how this system tries to use - # the same account for all tests without some special - # logic for that endpoint; and the hack is better than - # just not documenting the endpoint. - needs_reactivation = False - user_id = 0 - if file_name == "templates/zerver/api/deactivate-own-user.md": - needs_reactivation = True - user_id = client.get_profile()["user_id"] - print("Testing {} ...".format(curl_command_text.split("\n")[0])) # Turn the text into an arguments list. @@ -77,8 +72,6 @@ def test_generated_curl_examples_for_success(client: Client, owner_client: Clien ) response = json.loads(response_json) assert response["result"] == "success" - if needs_reactivation: - owner_client.reactivate_user_by_id(user_id) except (AssertionError, Exception): error_template = """ Error verifying the success of the API documentation curl example.