import unittest from unittest.mock import patch import app import usage class UsageTests(unittest.TestCase): def test_failed_audit_counts_start_and_failure_without_input(self): with patch('app.track') as track, patch('app.quick_grade', side_effect=ValueError('limit')): app.run('private/example') self.assertEqual([c.args for c in track.call_args_list], [('hf_audit_started',), ('hf_audit_failed',)]) def test_success_counts_only_after_result_is_rendered(self): with patch('app.track') as track, patch('app.quick_grade', return_value={}), \ patch('app.card_payload', return_value={'markdown': 'private card'}), patch('app.render', return_value='result'): app.run('org/example') self.assertEqual([c.args for c in track.call_args_list], [('hf_audit_started',), ('hf_audit_completed',)]) def test_invalid_syntax_does_not_count_as_an_audit(self): with patch('app.track') as track: app.run('') track.assert_not_called() def test_transport_sends_event_only_and_failure_is_harmless(self): with patch('usage.requests.post', side_effect=RuntimeError('offline')) as post: usage._send('hf_audit_completed') self.assertEqual(post.call_args.kwargs['json'], {'event': 'hf_audit_completed'}) self.assertEqual(post.call_args.kwargs['timeout'], 2) def test_local_and_unknown_events_are_not_sent(self): with patch('usage.ENABLED', False), patch('usage._pending.put_nowait') as send: usage.track('hf_audit_started') send.assert_not_called() with patch('usage.ENABLED', True), patch('usage._pending.put_nowait') as send: usage.track('report_ingested') send.assert_not_called()