# SPDX-License-Identifier: Apache-2.0 # SPDX-FileCopyrightText: Copyright contributors to the vLLM project from unittest.mock import MagicMock import pytest from vllm.entrypoints.openai.chat_completion.protocol import ( ChatCompletionRequest, ) @pytest.fixture() def should_do_global_cleanup_after_test() -> bool: return False def make_mock_tokenizer( vocab: dict[str, int], special_tokens: list[str] | None = None, ) -> MagicMock: """Create a mock tokenizer with the given vocabulary. Args: vocab: Mapping of token text to token ID. special_tokens: Which tokens to mark as special. When ``None`` (the default), every key in *vocab* is treated as special — convenient when the vocab only contains delimiter tokens. The returned mock supports get_vocab(), encode(), and decode(). decode() maps known token IDs back to their text and falls back to chr(id) for ASCII IDs or ```` for others. """ id_to_text = {v: k for k, v in vocab.items()} tokenizer = MagicMock() tokenizer.encode.return_value = [1, 2, 3] tokenizer.get_vocab.return_value = dict(vocab) tokenizer.decode.side_effect = lambda ids: "".join( id_to_text.get(i, chr(i) if i < 128 else f"<{i}>") for i in ids ) st = special_tokens if special_tokens is not None else list(vocab.keys()) tokenizer.all_special_tokens = st tokenizer.all_special_ids = [vocab[t] for t in st if t in vocab] return tokenizer @pytest.fixture def mock_request(): req = MagicMock(spec=ChatCompletionRequest) req.tools = [] req.tool_choice = "auto" req.include_reasoning = True return req