File size: 6,337 Bytes
a5784e9
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
"""
High-quality tests for api_utils/dependencies.py - FastAPI dependency injection.

Focus: Test all 12 dependency getter functions.
Strategy: Mock server module globals, verify each function returns correct object.
"""

from asyncio import Event, Lock, Queue
from unittest.mock import MagicMock, patch

from api_utils.dependencies import (
    get_current_ai_studio_model_id,
    get_excluded_model_ids,
    get_log_ws_manager,
    get_logger,
    get_model_list_fetch_event,
    get_page_instance,
    get_parsed_model_list,
    get_processing_lock,
    get_request_queue,
    get_server_state,
    get_worker_task,
)
from api_utils.server_state import state


def test_get_logger():
    """
    Test scenario: Get logger dependency
    Expected: Return state.logger object
    """
    mock_logger = MagicMock()

    with patch.object(state, "logger", mock_logger):
        result = get_logger()

        # Verify: Return state.logger
        assert result is mock_logger


def test_get_log_ws_manager():
    """
    Test scenario: Get WebSocket manager dependency
    Expected: Return state.log_ws_manager object
    """
    mock_ws_manager = MagicMock()

    with patch.object(state, "log_ws_manager", mock_ws_manager):
        result = get_log_ws_manager()

        # Verify: Return state.log_ws_manager
        assert result is mock_ws_manager


def test_get_request_queue():
    """
    Test scenario: Get request queue dependency
    Expected: Return state.request_queue object
    """
    mock_queue = MagicMock(spec=Queue)

    with patch.object(state, "request_queue", mock_queue):
        result = get_request_queue()

        # Verify: Return state.request_queue
        assert result is mock_queue


def test_get_processing_lock():
    """
    Test scenario: Get processing lock dependency
    Expected: Return state.processing_lock object
    """
    mock_lock = MagicMock(spec=Lock)

    with patch.object(state, "processing_lock", mock_lock):
        result = get_processing_lock()

        # Verify: Return state.processing_lock
        assert result is mock_lock


def test_get_worker_task():
    """
    Test scenario: Get worker task dependency
    Expected: Return state.worker_task object
    """
    mock_task = MagicMock()

    with patch.object(state, "worker_task", mock_task):
        result = get_worker_task()

        # Verify: Return state.worker_task
        assert result is mock_task


def test_get_server_state():
    """
    Test scenario: Get server state dependency
    Expected: Return dict containing 4 boolean flags
    """
    with (
        patch.object(state, "is_initializing", True),
        patch.object(state, "is_playwright_ready", False),
        patch.object(state, "is_browser_connected", True),
        patch.object(state, "is_page_ready", False),
    ):
        result = get_server_state()

        # Verify: Return dict contains all 4 flags
        assert isinstance(result, dict)
        assert result["is_initializing"] is True
        assert result["is_playwright_ready"] is False
        assert result["is_browser_connected"] is True
        assert result["is_page_ready"] is False


def test_get_server_state_immutable_snapshot():
    """
    Test scenario: Verify get_server_state returns immutable snapshot
    Expected: Return new dict, not original reference
    """
    with (
        patch.object(state, "is_initializing", False),
        patch.object(state, "is_playwright_ready", True),
        patch.object(state, "is_browser_connected", False),
        patch.object(state, "is_page_ready", True),
    ):
        result1 = get_server_state()
        result2 = get_server_state()

        # Verify: Each call returns a new dict
        assert result1 is not result2
        # Verify: Values are the same
        assert result1 == result2


def test_get_page_instance():
    """
    Test scenario: Get page instance dependency
    Expected: Return state.page_instance object
    """
    mock_page = MagicMock()

    with patch.object(state, "page_instance", mock_page):
        result = get_page_instance()

        # Verify: Return state.page_instance
        assert result is mock_page


def test_get_model_list_fetch_event():
    """
    Test scenario: Get model list fetch event dependency
    Expected: Return state.model_list_fetch_event object
    """
    mock_event = MagicMock(spec=Event)

    with patch.object(state, "model_list_fetch_event", mock_event):
        result = get_model_list_fetch_event()

        # Verify: Return state.model_list_fetch_event
        assert result is mock_event


def test_get_parsed_model_list():
    """
    Test scenario: Get parsed model list dependency
    Expected: Return state.parsed_model_list object
    """
    mock_model_list = [
        {"id": "gemini-1.5-pro", "object": "model"},
        {"id": "gemini-2.0-flash", "object": "model"},
    ]

    with patch.object(state, "parsed_model_list", mock_model_list):
        result = get_parsed_model_list()

        # Verify: Return state.parsed_model_list
        assert result is mock_model_list
        assert len(result) == 2


def test_get_excluded_model_ids():
    """
    Test scenario: Get excluded model IDs set dependency
    Expected: Return state.excluded_model_ids object
    """
    mock_excluded_ids = {"model-1", "model-2", "model-3"}

    with patch.object(state, "excluded_model_ids", mock_excluded_ids):
        result = get_excluded_model_ids()

        # Verify: Return state.excluded_model_ids
        assert result is mock_excluded_ids
        assert len(result) == 3


def test_get_current_ai_studio_model_id():
    """
    Test scenario: Get current AI Studio model ID dependency
    Expected: Return state.current_ai_studio_model_id object
    """
    mock_model_id = "gemini-1.5-pro"

    with patch.object(state, "current_ai_studio_model_id", mock_model_id):
        result = get_current_ai_studio_model_id()

        # Verify: Return state.current_ai_studio_model_id
        assert result == "gemini-1.5-pro"


def test_get_current_ai_studio_model_id_none():
    """
    Test scenario: Current model ID is None (initial state)
    Expected: Return None
    """
    with patch.object(state, "current_ai_studio_model_id", None):
        result = get_current_ai_studio_model_id()

        # Verify: Return None
        assert result is None