|
1 | | -"""Comprehensive tests for feedback tool.""" |
| 1 | +"""Tests for feedback tool.""" |
2 | 2 |
|
3 | 3 | # TODO: Remove when Python 3.9 support is dropped |
4 | 4 | from __future__ import annotations |
|
10 | 10 |
|
11 | 11 | import pytest |
12 | 12 |
|
13 | | -# Disable implicit feedback for tests BEFORE importing anything else |
14 | | -os.environ["STACKONE_IMPLICIT_FEEDBACK_ENABLED"] = "false" |
15 | | -os.environ.pop("LANGSMITH_API_KEY", None) # Make sure no Langsmith key is set |
16 | | - |
17 | 13 | from stackone_ai.feedback import create_feedback_tool |
18 | 14 | from stackone_ai.models import StackOneError |
19 | 15 |
|
20 | 16 |
|
21 | | -# Mock the implicit feedback manager globally for tests |
22 | | -@pytest.fixture(autouse=True) |
23 | | -def mock_implicit_feedback() -> Any: |
24 | | - """Mock implicit feedback manager to avoid Langsmith initialization.""" |
25 | | - with patch("stackone_ai.implicit_feedback.get_implicit_feedback_manager") as mock_manager: |
26 | | - mock_instance = Mock() |
27 | | - mock_instance.record_tool_call = Mock() |
28 | | - mock_manager.return_value = mock_instance |
29 | | - yield mock_manager |
30 | | - |
31 | | - |
32 | 17 | class TestFeedbackToolValidation: |
33 | 18 | """Test suite for feedback tool input validation.""" |
34 | 19 |
|
@@ -197,33 +182,6 @@ def test_feedback_tool_integration(self) -> None: |
197 | 182 | assert langchain_tool.name == "meta_collect_tool_feedback" |
198 | 183 | assert "feedback" in langchain_tool.description.lower() |
199 | 184 |
|
200 | | - def test_feedback_tool_smoke(self) -> None: |
201 | | - """Lightweight smoke test for basic functionality.""" |
202 | | - tool = create_feedback_tool(api_key="test_key") |
203 | | - |
204 | | - api_response = { |
205 | | - "message": "Feedback successfully stored", |
206 | | - "trace_id": "trace-123", |
207 | | - } |
208 | | - |
209 | | - with patch("requests.request") as mock_request: |
210 | | - mock_response = Mock() |
211 | | - mock_response.status_code = 200 |
212 | | - mock_response.json.return_value = api_response |
213 | | - mock_response.raise_for_status = Mock() |
214 | | - mock_request.return_value = mock_response |
215 | | - |
216 | | - result = tool.execute( |
217 | | - { |
218 | | - "feedback": "Great tools!", |
219 | | - "account_id": "acc_123456", |
220 | | - "tool_names": ["test_tool"], |
221 | | - } |
222 | | - ) |
223 | | - |
224 | | - assert result == api_response |
225 | | - mock_request.assert_called_once() |
226 | | - |
227 | 185 |
|
228 | 186 | @pytest.mark.integration |
229 | 187 | def test_live_feedback_submission() -> None: |
@@ -255,92 +213,3 @@ def test_live_feedback_submission() -> None: |
255 | 213 | assert isinstance(result, dict) |
256 | 214 | assert result.get("message", "").lower().startswith("feedback") |
257 | 215 | assert "trace_id" in result and result["trace_id"] |
258 | | - |
259 | | - |
260 | | -def test_implicit_feedback_integration() -> None: |
261 | | - """Test implicit feedback system integration.""" |
262 | | - from datetime import datetime, timedelta, timezone |
263 | | - |
264 | | - from stackone_ai.implicit_feedback import ( |
265 | | - BehaviorAnalyzer, |
266 | | - ImplicitFeedbackManager, |
267 | | - SessionTracker, |
268 | | - ) |
269 | | - |
270 | | - class StubLangsmithClient: |
271 | | - def __init__(self) -> None: |
272 | | - self.is_ready = True |
273 | | - self.runs: list[dict[str, object]] = [] |
274 | | - self.feedback: list[dict[str, object]] = [] |
275 | | - |
276 | | - def create_run(self, **kwargs: object) -> dict[str, object]: |
277 | | - self.runs.append(kwargs) |
278 | | - return {"id": f"run-{len(self.runs)}"} |
279 | | - |
280 | | - def create_feedback( |
281 | | - self, |
282 | | - *, |
283 | | - run_id: str, |
284 | | - key: str, |
285 | | - score: float | None = None, |
286 | | - comment: str | None = None, |
287 | | - metadata: dict[str, object] | None = None, |
288 | | - ) -> None: |
289 | | - self.feedback.append( |
290 | | - { |
291 | | - "run_id": run_id, |
292 | | - "key": key, |
293 | | - "score": score, |
294 | | - "comment": comment, |
295 | | - "metadata": metadata, |
296 | | - } |
297 | | - ) |
298 | | - |
299 | | - analyzer = BehaviorAnalyzer() |
300 | | - tracker = SessionTracker(analyzer) |
301 | | - client = StubLangsmithClient() |
302 | | - |
303 | | - manager = ImplicitFeedbackManager( |
304 | | - enabled=True, |
305 | | - session_tracker=tracker, |
306 | | - langsmith_client=client, # type: ignore[arg-type] |
307 | | - ) |
308 | | - |
309 | | - start = datetime.now(timezone.utc) |
310 | | - first_end = start + timedelta(seconds=2) |
311 | | - manager.record_tool_call( |
312 | | - tool_name="crm.search", |
313 | | - start_time=start, |
314 | | - end_time=first_end, |
315 | | - status="success", |
316 | | - params={"query": "alpha"}, |
317 | | - result={"count": 1}, |
318 | | - error=None, |
319 | | - session_id="session-1", |
320 | | - user_id="user-1", |
321 | | - metadata={"source": "test"}, |
322 | | - fire_and_forget=False, |
323 | | - ) |
324 | | - |
325 | | - second_start = first_end + timedelta(seconds=3) |
326 | | - manager.record_tool_call( |
327 | | - tool_name="crm.search", |
328 | | - start_time=second_start, |
329 | | - end_time=second_start + timedelta(seconds=1), |
330 | | - status="success", |
331 | | - params={"query": "alpha"}, |
332 | | - result={"count": 0}, |
333 | | - error=None, |
334 | | - session_id="session-1", |
335 | | - user_id="user-1", |
336 | | - metadata={"source": "test"}, |
337 | | - fire_and_forget=False, |
338 | | - ) |
339 | | - |
340 | | - assert len(client.runs) == 2 |
341 | | - assert client.feedback, "Expected implicit feedback events" |
342 | | - feedback_entry = client.feedback[0] |
343 | | - assert feedback_entry["key"] == "refinement_needed" |
344 | | - assert feedback_entry["run_id"] == "run-2" |
345 | | - assert isinstance(feedback_entry["metadata"], dict) |
346 | | - assert feedback_entry["metadata"].get("tool_name") == "crm.search" |
0 commit comments