diff --git a/odoo-stubs/tests/common.pyi b/odoo-stubs/tests/common.pyi index ad64ef3..b6d315a 100644 --- a/odoo-stubs/tests/common.pyi +++ b/odoo-stubs/tests/common.pyi @@ -2,9 +2,12 @@ import collections import logging import sys import unittest +from concurrent.futures import Future from re import Pattern from itertools import count +from subprocess import Popen +from threading import Thread from typing import Any, Callable, Generator, Generic, Iterator, Literal, Mapping, Match, TypeVar from unittest import TestSuite from xmlrpc import client as xmlrpclib @@ -13,6 +16,7 @@ import requests from lxml.etree import _Element from websocket import WebSocket +from .runner import OdooTestResult from ..api import Environment from ..http import Session from ..models import BaseModel @@ -80,7 +84,7 @@ class BaseCase(unittest.TestCase, metaclass=MetaCase): longMessage: bool warm: bool def __init__(self, methodName: str = ...) -> None: ... - def run(self, result) -> None: ... + def run(self, result: OdooTestResult) -> None: ... def shortDescription(self) -> None: ... def cursor(self) -> Cursor: ... @property @@ -142,7 +146,8 @@ def fmap(future, map_fun): ... def fchain(future, next_callback): ... class ChromeBrowser: - test_class: str + remote_debugging_port: int + test_class: type[HttpCase] devtools_port: int | None ws_url: str ws: WebSocket | None @@ -151,32 +156,46 @@ class ChromeBrowser: chrome_pid: int | None screenshots_dir: str screencasts_dir: str | None + screencasts_frames_dir: str | None screencast_frames: list window_size: str + touch_enabled: bool sigxcpu_handler: Any - def __init__(self, logger: logging.Logger, window_size: str, test_class: str) -> None: ... + _request_id: count[int] + _result: Future + error_checker: Any + had_failure: bool + _responses: dict[int, Future] + _frames: dict + _handlers: dict + _receiver: Thread + def __init__(self, test_class: type[HttpCase]) -> None: ... def signal_handler(self, sig, frame) -> None: ... def stop(self) -> None: ... @property def executable(self) -> str | None: ... + def _chrome_without_limit(self, cmd) -> Popen: ... def _spawn_chrome(self, cmd: list[str]) -> int | None: ... def _chrome_start(self) -> None: ... + dev_tools_frontend_url: str def _find_websocket(self) -> None: ... def _json_command(self, command: str, timeout: int = ..., get_key: Any | None = ...): ... def _open_websocket(self) -> None: ... - def _websocket_send(self, method: str, params: Any | None = ...) -> int | None: ... - def _get_message(self, raise_log_error: bool = ...) -> dict: ... + def _receive(self, dbname: str) -> None: ... + def _websocket_request(self, method: str, *, params: Any | None = ..., timeout: float = ...): ... + def _websocket_send(self, method: str, *, params: Any | None = ..., with_future: bool = ...) -> Future | None: ... + def _handle_console(self, type, args: Any | None = ..., stackTrace: Any | None = ..., **kw) -> None: ... + def _handle_exception(self, exceptionDetails: dict, timestamp) -> None: ... + def _handle_frame_stopped_loading(self, frameId) -> None: ... + def _handle_screencast_frame(self, sessionId, data, metadata) -> None: ... _TO_LEVEL: dict[str, int] - def _websocket_wait_id(self, awaited_id: int, timeout: int = ...) -> dict: ... - def _websocket_wait_event(self, method: str, params: dict | None = ..., timeout: int = ...) -> dict | None: ... - def take_screenshot(self, prefix: str = ..., suffix: str | None = ...) -> None: ... + def take_screenshot(self, prefix: str = ..., suffix: str | None = ...) -> Future: ... def _save_screencast(self, prefix: str = ...) -> None: ... - screencasts_frames_dir: str def start_screencast(self) -> None: ... - def set_cookie(self, name: str, value, path, domain) -> dict: ... - def delete_cookie(self, name: str, **kwargs) -> dict: ... + def set_cookie(self, name: str, value, path, domain) -> None: ... + def delete_cookie(self, name: str, **kwargs) -> None: ... def _wait_ready(self, ready_code, timeout: int = ...) -> bool: ... - def _wait_code_ok(self, code, timeout: float) -> Literal[True] | None: ... + def _wait_code_ok(self, code, timeout: float, error_checker: Any | None = ...) -> None: ... def navigate_to(self, url: str, wait_stop: bool = ...) -> None: ... def clear(self) -> None: ... def _from_remoteobject(self, arg: Mapping): ... @@ -196,8 +215,10 @@ class Transport(xmlrpclib.Transport): class HttpCase(TransactionCase): registry_test_mode: bool - browser: ChromeBrowser + browser: ChromeBrowser | None browser_size: str + touch_enabled: bool + allow_end_on_form: bool _logger: logging.Logger @classmethod def setUpClass(cls) -> None: ... @@ -214,9 +235,10 @@ class HttpCase(TransactionCase): headers: Mapping | None = ..., allow_redirects: bool = ..., head: bool = ...) -> requests.Response: ... def _wait_remaining_requests(self, timeout: int = ...) -> None: ... def logout(self, keep_db: bool = ...) -> None: ... - session: OpenERPSession + session: Session def authenticate(self, user, password) -> Session: ... - def browser_js(self, url_path: str, code: str, ready: str = ..., login: str | None = ..., timeout: int = ..., **kw) -> None: ... + def browser_js(self, url_path: str, code: str, ready: str = ..., login: str | None = ..., timeout: int = ..., + cookies: Any | None = ..., error_checker: Any | None = ..., watch: bool = ..., **kw) -> None: ... @classmethod def base_url(cls) -> str: ... def start_tour(self, url_path: str, tour_name: str, step_delay: float | None = ..., **kwargs) -> None: ... @@ -226,12 +248,11 @@ class HttpSavepointCase(HttpCase): @classmethod def __init_subclass__(cls) -> None: ... +def no_retry(arg: _T) -> _T: ... def users(*logins: str) -> Callable[[_CallableT], _CallableT]: ... def warmup(func: _CallableT, *args, **kwargs) -> _CallableT: ... def can_import(module: str) -> bool: ... -ref_re: Pattern - class Form(Generic[_ModelT]): _env: Environment _model: _ModelT @@ -239,6 +260,7 @@ class Form(Generic[_ModelT]): _values: dict _changed: set def __init__(self, recordp: _ModelT, view: _ModelT | str | None = ...) -> None: ... + def _get_view_fields(self, node: _Element, model: BaseModel) -> dict: ... def _o2m_set_edition_view(self, descr: dict, node: _Element, level: int) -> None: ... def __str__(self) -> str: ... def _process_fvg(self, model: BaseModel, fvg: dict, level: int = ...) -> None: ... @@ -256,7 +278,7 @@ class Form(Generic[_ModelT]): def _values_to_save(self, all_fields: bool = ...) -> dict: ... def _values_to_save_(self, record_values: dict, fields: dict, view: Any, changed: set, all_fields: bool = ..., modifiers_values: dict | None = ..., parent_link: Any | None = ...) -> dict: ... - def _perform_onchange(self, fields: list[str]) -> dict: ... + def _perform_onchange(self, fields: list[str], context: dict | None = ...) -> dict: ... def _onchange_values(self) -> dict: ... def _onchange_values_(self, fields, record: dict) -> dict: ... def _cleanup_onchange(self, descr: dict, value, current): ...