mirror of
https://github.com/openai/gpt-oss.git
synced 2025-08-06 00:55:46 +03:00
The project had almost no test coverage - just a single test checking if the API returns 200. This adds proper testing infrastructure and 21 new tests covering the main API functionality. Tests now cover response creation, error handling, tools, sessions, performance, and usage tracking. All tests passing.
118 lines
2.9 KiB
Python
118 lines
2.9 KiB
Python
import os
|
|
import sys
|
|
import pytest
|
|
from typing import Generator, Any
|
|
from unittest.mock import Mock, MagicMock
|
|
from fastapi.testclient import TestClient
|
|
|
|
sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), '..')))
|
|
|
|
from openai_harmony import (
|
|
HarmonyEncodingName,
|
|
load_harmony_encoding,
|
|
)
|
|
from gpt_oss.responses_api.api_server import create_api_server
|
|
|
|
|
|
@pytest.fixture(scope="session")
|
|
def harmony_encoding():
|
|
return load_harmony_encoding(HarmonyEncodingName.HARMONY_GPT_OSS)
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_infer_token(harmony_encoding):
|
|
fake_tokens = harmony_encoding.encode(
|
|
"<|channel|>final<|message|>Test response<|return|>",
|
|
allowed_special="all"
|
|
)
|
|
token_queue = fake_tokens.copy()
|
|
|
|
def _mock_infer(tokens: list[int], temperature: float = 0.0, new_request: bool = False) -> int:
|
|
nonlocal token_queue
|
|
if len(token_queue) == 0:
|
|
token_queue = fake_tokens.copy()
|
|
return token_queue.pop(0)
|
|
return _mock_infer
|
|
|
|
|
|
@pytest.fixture
|
|
def api_client(harmony_encoding, mock_infer_token) -> Generator[TestClient, None, None]:
|
|
app = create_api_server(
|
|
infer_next_token=mock_infer_token,
|
|
encoding=harmony_encoding
|
|
)
|
|
with TestClient(app) as client:
|
|
yield client
|
|
|
|
|
|
@pytest.fixture
|
|
def sample_request_data():
|
|
return {
|
|
"model": "gpt-oss-120b",
|
|
"input": "Hello, how can I help you today?",
|
|
"stream": False,
|
|
"reasoning_effort": "low",
|
|
"temperature": 0.7,
|
|
"tools": []
|
|
}
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_browser_tool():
|
|
mock = MagicMock()
|
|
mock.search.return_value = ["Result 1", "Result 2"]
|
|
mock.open_page.return_value = "Page content"
|
|
mock.find_on_page.return_value = "Found text"
|
|
return mock
|
|
|
|
|
|
@pytest.fixture
|
|
def mock_python_tool():
|
|
mock = MagicMock()
|
|
mock.execute.return_value = {
|
|
"output": "print('Hello')",
|
|
"error": None,
|
|
"exit_code": 0
|
|
}
|
|
return mock
|
|
|
|
|
|
@pytest.fixture(autouse=True)
|
|
def reset_test_environment():
|
|
test_env_vars = ['OPENAI_API_KEY', 'GPT_OSS_MODEL_PATH']
|
|
original_values = {}
|
|
|
|
for var in test_env_vars:
|
|
if var in os.environ:
|
|
original_values[var] = os.environ[var]
|
|
del os.environ[var]
|
|
|
|
yield
|
|
|
|
for var, value in original_values.items():
|
|
os.environ[var] = value
|
|
|
|
|
|
@pytest.fixture
|
|
def performance_timer():
|
|
import time
|
|
|
|
class Timer:
|
|
def __init__(self):
|
|
self.start_time = None
|
|
self.end_time = None
|
|
|
|
def start(self):
|
|
self.start_time = time.time()
|
|
|
|
def stop(self):
|
|
self.end_time = time.time()
|
|
return self.elapsed
|
|
|
|
@property
|
|
def elapsed(self):
|
|
if self.start_time and self.end_time:
|
|
return self.end_time - self.start_time
|
|
return None
|
|
|
|
return Timer() |