Files
xc_agent_platform_demo/tests/test_readonly_probe.py

62 lines
3.2 KiB
Python
Raw Normal View History

import io
import json
import os
import unittest
import urllib.error
from unittest.mock import patch, MagicMock
from src.readonly_probe import probe_readonly
from scripts.probe_readonly import main
class TestReadonlyProbe(unittest.TestCase):
def test_missing_token_no_network(self):
with patch.dict(os.environ, {}, clear=True), patch('urllib.request.urlopen') as call:
self.assertFalse(probe_readonly()['auth_ok'])
with patch('sys.stdout', io.StringIO()):
self.assertEqual(main(), 1)
call.assert_not_called()
def test_success_and_exact_request(self):
response = MagicMock()
response.__enter__.return_value = response
response.status = 200
response.read.return_value = json.dumps({'code': 0, 'data': {
'records': [{'modelId': 'secret-value'}], 'total': 10}}).encode()
with patch.dict(os.environ, {'EXTERNAL_SERVICE_TOKEN': 'secret-value'}, clear=True), patch('urllib.request.urlopen', return_value=response) as call:
result = probe_readonly()
request = call.call_args.args[0]
self.assertEqual(request.get_method(), 'GET')
self.assertEqual(request.full_url, 'https://modelhub.org.cn/api/adapt/task/page?onlyMine=true&pageSize=5&current=1')
self.assertEqual(request.get_header('Xc-token'), 'secret-value')
self.assertTrue(result['auth_ok'])
self.assertEqual(result['record_summary'], {'count': 1, 'total': 10})
self.assertNotIn('secret-value', json.dumps(result))
def test_errors_no_fallback_or_echo(self):
for code in (40100, 40101, 50000):
error = urllib.error.HTTPError('https://example.test', 403, '', {}, io.BytesIO(json.dumps({'code': code, 'message': 'secret-value'}).encode()))
with patch.dict(os.environ, {'XC_TOKEN': 'secret-value'}, clear=True), patch('urllib.request.urlopen', side_effect=error) as call:
result = probe_readonly()
self.assertEqual(call.call_count, 1)
self.assertFalse(result['auth_ok'])
self.assertEqual(result['platform_code'], code)
self.assertIn(str(code) if code != 50000 else 'other', result['error_attribution'])
self.assertNotIn('secret-value', json.dumps(result))
def test_transport_and_invalid_json(self):
for error in (OSError('secret-value'), urllib.error.URLError('secret-value')):
with patch.dict(os.environ, {'XC_TOKEN': 'secret-value'}, clear=True), patch('urllib.request.urlopen', side_effect=error):
self.assertEqual(probe_readonly()['error_attribution'], 'transport/timeout')
response = MagicMock()
response.__enter__.return_value = response
response.status, response.read.return_value = 200, b'invalid secret-value'
with patch.dict(os.environ, {'XC_TOKEN': 'secret-value'}, clear=True), patch('urllib.request.urlopen', return_value=response):
self.assertFalse(probe_readonly()['auth_ok'])
def test_import_no_network(self):
import importlib
import src.readonly_probe
with patch('urllib.request.urlopen') as call:
importlib.reload(src.readonly_probe)
call.assert_not_called()