def validate_api_response_openapi( self, url: str, method: str, result: HttpResponse, data: Union[str, bytes, Dict[str, Any]], http_headers: Dict[str, Any], intentionally_undocumented: bool = False, ) -> None: """ Validates all API responses received by this test against Zulip's API documentation, declared in zerver/openapi/zulip.yaml. This powerful test lets us use Zulip's extensive test coverage of corner cases in the API to ensure that we've properly documented those corner cases. """ if not (url.startswith("/json") or url.startswith("/api/v1")): return try: content = orjson.loads(result.content) except orjson.JSONDecodeError: return json_url = False if url.startswith('/json'): json_url = True url, query_data = self.extract_api_suffix_url(url) if len(query_data) != 0: # In some cases the query parameters are defined in the URL itself. In such cases # The `data` argument of our function is not used. Hence get `data` argument # from url. data = query_data response_validated = validate_against_openapi_schema(content, url, method, str(result.status_code)) if response_validated: validate_request(url, method, data, http_headers, json_url, str(result.status_code), intentionally_undocumented=intentionally_undocumented)
def test_validator(self) -> None: """ Test to make sure the request validator works properly The tests cover both cases such as catching valid requests marked as invalid and making sure invalid requests are markded properly """ # `/users/me/subscriptions` doesn't require any parameters validate_request('/users/me/subscriptions', 'get', {}, {}, False, uses_invalid_parameters=False) with self.assertRaises(AssertionError): validate_request('/users/me/subscriptions', 'get', {}, {}, False, uses_invalid_parameters=True) validate_request('/dev_fetch_api_key', 'post', {}, {}, False, uses_invalid_parameters=True) with self.assertRaises(SchemaError): validate_request('/dev_fetch_api_key', 'post', {}, {}, False, uses_invalid_parameters=False)
def test_validator(self) -> None: """ Test to make sure the request validator works properly The tests cover both cases such as catching valid requests marked as invalid and making sure invalid requests are markded properly """ # `/users/me/subscriptions` doesn't require any parameters validate_request("/users/me/subscriptions", "get", {}, {}, False, "200") with self.assertRaises(SchemaError): # `/messages` POST does not work on an empty response validate_request("/messages", "post", {}, {}, False, "200") # 400 responses are allowed to fail validation. validate_request("/messages", "post", {}, {}, False, "400") # `intentionally_undocumented` allows validation errors on # 200 responses. validate_request( "/dev_fetch_api_key", "post", {}, {}, False, "200", intentionally_undocumented=True )