import pytest import tempfile import os import json from pr.core.usage_tracker import UsageTracker @pytest.fixture def temp_usage_file(tmp_path, monkeypatch): from pr.core import usage_tracker original_file = usage_tracker.USAGE_DB_FILE temp_file = str(tmp_path / "usage.json") monkeypatch.setattr(usage_tracker, 'USAGE_DB_FILE', temp_file) yield temp_file if os.path.exists(temp_file): os.remove(temp_file) monkeypatch.setattr(usage_tracker, 'USAGE_DB_FILE', original_file) def test_usage_tracker_init(): tracker = UsageTracker() summary = tracker.get_session_summary() assert summary['requests'] == 0 assert summary['total_tokens'] == 0 assert summary['estimated_cost'] == 0.0 def test_track_request_known_model(): tracker = UsageTracker() tracker.track_request('gpt-3.5-turbo', 100, 50) summary = tracker.get_session_summary() assert summary['requests'] == 1 assert summary['input_tokens'] == 100 assert summary['output_tokens'] == 50 assert summary['total_tokens'] == 150 assert 'gpt-3.5-turbo' in summary['models_used'] # Cost: (100/1000)*0.0005 + (50/1000)*0.0015 = 0.00005 + 0.000075 = 0.000125 assert abs(summary['estimated_cost'] - 0.000125) < 1e-6 def test_track_request_unknown_model(): tracker = UsageTracker() tracker.track_request('unknown-model', 100, 50) summary = tracker.get_session_summary() assert summary['requests'] == 1 assert summary['estimated_cost'] == 0.0 # Unknown model, cost 0 def test_track_request_multiple(): tracker = UsageTracker() tracker.track_request('gpt-3.5-turbo', 100, 50) tracker.track_request('gpt-4', 200, 100) summary = tracker.get_session_summary() assert summary['requests'] == 2 assert summary['input_tokens'] == 300 assert summary['output_tokens'] == 150 assert summary['total_tokens'] == 450 assert len(summary['models_used']) == 2 def test_get_formatted_summary(): tracker = UsageTracker() tracker.track_request('gpt-3.5-turbo', 100, 50) formatted = tracker.get_formatted_summary() assert "Total Requests: 1" in formatted assert "Total Tokens: 150" in formatted assert "Estimated Cost: $0.0001" in formatted assert "gpt-3.5-turbo" in formatted def test_get_total_usage_no_file(temp_usage_file): total = UsageTracker.get_total_usage() assert total['total_requests'] == 0 assert total['total_tokens'] == 0 assert total['total_cost'] == 0.0 def test_get_total_usage_with_data(temp_usage_file): # Manually create history file history = [ {'timestamp': '2023-01-01', 'model': 'gpt-3.5-turbo', 'input_tokens': 100, 'output_tokens': 50, 'total_tokens': 150, 'cost': 0.000125}, {'timestamp': '2023-01-02', 'model': 'gpt-4', 'input_tokens': 200, 'output_tokens': 100, 'total_tokens': 300, 'cost': 0.008} ] with open(temp_usage_file, 'w') as f: json.dump(history, f) total = UsageTracker.get_total_usage() assert total['total_requests'] == 2 assert total['total_tokens'] == 450 assert abs(total['total_cost'] - 0.008125) < 1e-6