1313
1414import constants
1515from app .endpoints .rlsapi_v1 import (
16+ _build_instructions ,
1617 _get_default_model_id ,
1718 infer_endpoint ,
1819 retrieve_simple_response ,
@@ -87,6 +88,12 @@ def mock_empty_llm_response_fixture(mocker: MockerFixture) -> None:
8788 _setup_responses_mock (mocker , mocker .AsyncMock (return_value = mock_response ))
8889
8990
91+ @pytest .fixture (name = "mock_auth_resolvers" )
92+ def mock_auth_resolvers_fixture (mocker : MockerFixture ) -> None :
93+ """Mock authorization resolvers for endpoint tests."""
94+ mock_authorization_resolvers (mocker )
95+
96+
9097@pytest .fixture (name = "mock_api_connection_error" )
9198def mock_api_connection_error_fixture (mocker : MockerFixture ) -> None :
9299 """Mock responses.create() to raise APIConnectionError."""
@@ -96,6 +103,47 @@ def mock_api_connection_error_fixture(mocker: MockerFixture) -> None:
96103 )
97104
98105
106+ # --- Test _build_instructions ---
107+
108+
109+ @pytest .mark .parametrize (
110+ ("systeminfo_kwargs" , "expected_contains" , "expected_not_contains" ),
111+ [
112+ pytest .param (
113+ {"os" : "RHEL" , "version" : "9.3" , "arch" : "x86_64" },
114+ ["OS: RHEL" , "Version: 9.3" , "Architecture: x86_64" ],
115+ [],
116+ id = "full_systeminfo" ,
117+ ),
118+ pytest .param (
119+ {"os" : "RHEL" , "version" : "" , "arch" : "" },
120+ ["OS: RHEL" ],
121+ ["Version:" , "Architecture:" ],
122+ id = "partial_systeminfo" ,
123+ ),
124+ pytest .param (
125+ {},
126+ [constants .DEFAULT_SYSTEM_PROMPT ],
127+ ["OS:" , "Version:" , "Architecture:" ],
128+ id = "empty_systeminfo" ,
129+ ),
130+ ],
131+ )
132+ def test_build_instructions (
133+ systeminfo_kwargs : dict [str , str ],
134+ expected_contains : list [str ],
135+ expected_not_contains : list [str ],
136+ ) -> None :
137+ """Test _build_instructions with various system info combinations."""
138+ systeminfo = RlsapiV1SystemInfo (** systeminfo_kwargs )
139+ result = _build_instructions (systeminfo )
140+
141+ for expected in expected_contains :
142+ assert expected in result
143+ for not_expected in expected_not_contains :
144+ assert not_expected not in result
145+
146+
99147# --- Test _get_default_model_id ---
100148
101149
@@ -151,7 +199,9 @@ async def test_retrieve_simple_response_success(
151199 mock_configuration : AppConfig , mock_llm_response : None
152200) -> None :
153201 """Test retrieve_simple_response returns LLM response text."""
154- response = await retrieve_simple_response ("How do I list files?" )
202+ response = await retrieve_simple_response (
203+ "How do I list files?" , constants .DEFAULT_SYSTEM_PROMPT
204+ )
155205 assert response == "This is a test LLM response."
156206
157207
@@ -160,7 +210,9 @@ async def test_retrieve_simple_response_empty_output(
160210 mock_configuration : AppConfig , mock_empty_llm_response : None
161211) -> None :
162212 """Test retrieve_simple_response handles empty LLM output."""
163- response = await retrieve_simple_response ("Test question" )
213+ response = await retrieve_simple_response (
214+ "Test question" , constants .DEFAULT_SYSTEM_PROMPT
215+ )
164216 assert response == ""
165217
166218
@@ -170,18 +222,19 @@ async def test_retrieve_simple_response_api_connection_error(
170222) -> None :
171223 """Test retrieve_simple_response propagates APIConnectionError."""
172224 with pytest .raises (APIConnectionError ):
173- await retrieve_simple_response ("Test question" )
225+ await retrieve_simple_response ("Test question" , constants . DEFAULT_SYSTEM_PROMPT )
174226
175227
176228# --- Test infer_endpoint ---
177229
178230
179231@pytest .mark .asyncio
180232async def test_infer_minimal_request (
181- mocker : MockerFixture , mock_configuration : AppConfig , mock_llm_response : None
233+ mock_configuration : AppConfig ,
234+ mock_llm_response : None ,
235+ mock_auth_resolvers : None ,
182236) -> None :
183237 """Test /infer endpoint returns valid response with LLM text."""
184- mock_authorization_resolvers (mocker )
185238 request = RlsapiV1InferRequest (question = "How do I list files?" )
186239
187240 response = await infer_endpoint (infer_request = request , auth = MOCK_AUTH )
@@ -194,10 +247,11 @@ async def test_infer_minimal_request(
194247
195248@pytest .mark .asyncio
196249async def test_infer_full_context_request (
197- mocker : MockerFixture , mock_configuration : AppConfig , mock_llm_response : None
250+ mock_configuration : AppConfig ,
251+ mock_llm_response : None ,
252+ mock_auth_resolvers : None ,
198253) -> None :
199254 """Test /infer endpoint handles full context (stdin, attachments, terminal)."""
200- mock_authorization_resolvers (mocker )
201255 request = RlsapiV1InferRequest (
202256 question = "Why did this command fail?" ,
203257 context = RlsapiV1Context (
@@ -217,10 +271,11 @@ async def test_infer_full_context_request(
217271
218272@pytest .mark .asyncio
219273async def test_infer_generates_unique_request_ids (
220- mocker : MockerFixture , mock_configuration : AppConfig , mock_llm_response : None
274+ mock_configuration : AppConfig ,
275+ mock_llm_response : None ,
276+ mock_auth_resolvers : None ,
221277) -> None :
222278 """Test that each /infer call generates a unique request_id."""
223- mock_authorization_resolvers (mocker )
224279 request = RlsapiV1InferRequest (question = "How do I list files?" )
225280
226281 response1 = await infer_endpoint (infer_request = request , auth = MOCK_AUTH )
@@ -231,12 +286,11 @@ async def test_infer_generates_unique_request_ids(
231286
232287@pytest .mark .asyncio
233288async def test_infer_api_connection_error_returns_503 (
234- mocker : MockerFixture ,
235289 mock_configuration : AppConfig ,
236290 mock_api_connection_error : None ,
291+ mock_auth_resolvers : None ,
237292) -> None :
238293 """Test /infer endpoint returns 503 when LLM service is unavailable."""
239- mock_authorization_resolvers (mocker )
240294 request = RlsapiV1InferRequest (question = "Test question" )
241295
242296 with pytest .raises (HTTPException ) as exc_info :
@@ -247,12 +301,11 @@ async def test_infer_api_connection_error_returns_503(
247301
248302@pytest .mark .asyncio
249303async def test_infer_empty_llm_response_returns_fallback (
250- mocker : MockerFixture ,
251304 mock_configuration : AppConfig ,
252305 mock_empty_llm_response : None ,
306+ mock_auth_resolvers : None ,
253307) -> None :
254308 """Test /infer endpoint returns fallback text when LLM returns empty response."""
255- mock_authorization_resolvers (mocker )
256309 request = RlsapiV1InferRequest (question = "Test question" )
257310
258311 response = await infer_endpoint (infer_request = request , auth = MOCK_AUTH )
0 commit comments