You can not select more than 25 topics
			Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
		
		
		
		
		
			
		
			
				
					
					
						
							182 lines
						
					
					
						
							5.8 KiB
						
					
					
				
			
		
		
	
	
							182 lines
						
					
					
						
							5.8 KiB
						
					
					
				import json
 | 
						|
import sys
 | 
						|
 | 
						|
if sys.version_info < (3, 3):
 | 
						|
    from mock import patch
 | 
						|
else:
 | 
						|
    from unittest.mock import patch
 | 
						|
 | 
						|
if sys.version_info < (2, 7):
 | 
						|
    import unittest2 as unittest
 | 
						|
else:
 | 
						|
    import unittest
 | 
						|
 | 
						|
# Flask is supported only for python2 and python3.3+
 | 
						|
if sys.version_info < (3, 0) or sys.version_info >= (3, 3):
 | 
						|
    try:
 | 
						|
        from flask import Flask
 | 
						|
    except ImportError:
 | 
						|
        raise unittest.SkipTest('Flask not found for testing')
 | 
						|
 | 
						|
    from ...backend.flask import JSONRPCAPI, api
 | 
						|
 | 
						|
    @api.dispatcher.add_method
 | 
						|
    def dummy():
 | 
						|
        return ""
 | 
						|
 | 
						|
 | 
						|
@unittest.skipIf((3, 0) <= sys.version_info < (3, 3),
 | 
						|
                 'Flask does not support python 3.0 - 3.2')
 | 
						|
class TestFlaskBackend(unittest.TestCase):
 | 
						|
    REQUEST = json.dumps({
 | 
						|
        "id": "0",
 | 
						|
        "jsonrpc": "2.0",
 | 
						|
        "method": "dummy",
 | 
						|
    })
 | 
						|
 | 
						|
    def setUp(self):
 | 
						|
        self.client = self._get_test_client(JSONRPCAPI())
 | 
						|
 | 
						|
    def _get_test_client(self, api):
 | 
						|
        @api.dispatcher.add_method
 | 
						|
        def dummy():
 | 
						|
            return ""
 | 
						|
 | 
						|
        app = Flask(__name__)
 | 
						|
        app.config["TESTING"] = True
 | 
						|
        app.register_blueprint(api.as_blueprint())
 | 
						|
        return app.test_client()
 | 
						|
 | 
						|
    def test_client(self):
 | 
						|
        response = self.client.post(
 | 
						|
            '/',
 | 
						|
            data=self.REQUEST,
 | 
						|
            content_type='application/json',
 | 
						|
        )
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
        data = json.loads(response.data.decode('utf8'))
 | 
						|
        self.assertEqual(data['result'], '')
 | 
						|
 | 
						|
    def test_method_not_allowed(self):
 | 
						|
        response = self.client.get(
 | 
						|
            '/',
 | 
						|
            content_type='application/json',
 | 
						|
        )
 | 
						|
        self.assertEqual(response.status_code, 405, "Should allow only POST")
 | 
						|
 | 
						|
    def test_parse_error(self):
 | 
						|
        response = self.client.post(
 | 
						|
            '/',
 | 
						|
            data='{',
 | 
						|
            content_type='application/json',
 | 
						|
        )
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
        data = json.loads(response.data.decode('utf8'))
 | 
						|
        self.assertEqual(data['error']['code'], -32700)
 | 
						|
        self.assertEqual(data['error']['message'], 'Parse error')
 | 
						|
 | 
						|
    def test_wrong_content_type(self):
 | 
						|
        response = self.client.post(
 | 
						|
            '/',
 | 
						|
            data=self.REQUEST,
 | 
						|
            content_type='application/x-www-form-urlencoded',
 | 
						|
        )
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
        data = json.loads(response.data.decode('utf8'))
 | 
						|
        self.assertEqual(data['error']['code'], -32700)
 | 
						|
        self.assertEqual(data['error']['message'], 'Parse error')
 | 
						|
 | 
						|
    def test_invalid_request(self):
 | 
						|
        response = self.client.post(
 | 
						|
            '/',
 | 
						|
            data='{"method": "dummy", "id": 1}',
 | 
						|
            content_type='application/json',
 | 
						|
        )
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
        data = json.loads(response.data.decode('utf8'))
 | 
						|
        self.assertEqual(data['error']['code'], -32600)
 | 
						|
        self.assertEqual(data['error']['message'], 'Invalid Request')
 | 
						|
 | 
						|
    def test_method_not_found(self):
 | 
						|
        data = {
 | 
						|
            "jsonrpc": "2.0",
 | 
						|
            "method": "dummy2",
 | 
						|
            "id": 1
 | 
						|
        }
 | 
						|
        response = self.client.post(
 | 
						|
            '/',
 | 
						|
            data=json.dumps(data),
 | 
						|
            content_type='application/json',
 | 
						|
        )
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
        data = json.loads(response.data.decode('utf8'))
 | 
						|
        self.assertEqual(data['error']['code'], -32601)
 | 
						|
        self.assertEqual(data['error']['message'], 'Method not found')
 | 
						|
 | 
						|
    def test_invalid_parameters(self):
 | 
						|
        data = {
 | 
						|
            "jsonrpc": "2.0",
 | 
						|
            "method": "dummy",
 | 
						|
            "params": [42],
 | 
						|
            "id": 1
 | 
						|
        }
 | 
						|
        response = self.client.post(
 | 
						|
            '/',
 | 
						|
            data=json.dumps(data),
 | 
						|
            content_type='application/json',
 | 
						|
        )
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
        data = json.loads(response.data.decode('utf8'))
 | 
						|
        self.assertEqual(data['error']['code'], -32602)
 | 
						|
        self.assertEqual(data['error']['message'], 'Invalid params')
 | 
						|
 | 
						|
    def test_resource_map(self):
 | 
						|
        response = self.client.get('/map')
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
        self.assertTrue("JSON-RPC map" in response.data.decode('utf8'))
 | 
						|
 | 
						|
    def test_method_not_allowed_prefix(self):
 | 
						|
        response = self.client.get(
 | 
						|
            '/',
 | 
						|
            content_type='application/json',
 | 
						|
        )
 | 
						|
        self.assertEqual(response.status_code, 405)
 | 
						|
 | 
						|
    def test_resource_map_prefix(self):
 | 
						|
        response = self.client.get('/map')
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
 | 
						|
    def test_as_view(self):
 | 
						|
        api = JSONRPCAPI()
 | 
						|
        with patch.object(api, 'jsonrpc') as mock_jsonrpc:
 | 
						|
            self.assertIs(api.as_view(), mock_jsonrpc)
 | 
						|
 | 
						|
    def test_not_check_content_type(self):
 | 
						|
        client = self._get_test_client(JSONRPCAPI(check_content_type=False))
 | 
						|
        response = client.post(
 | 
						|
            '/',
 | 
						|
            data=self.REQUEST,
 | 
						|
        )
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
        data = json.loads(response.data.decode('utf8'))
 | 
						|
        self.assertEqual(data['result'], '')
 | 
						|
 | 
						|
    def test_check_content_type(self):
 | 
						|
        client = self._get_test_client(JSONRPCAPI(check_content_type=False))
 | 
						|
        response = client.post(
 | 
						|
            '/',
 | 
						|
            data=self.REQUEST,
 | 
						|
            content_type="application/x-www-form-urlencoded"
 | 
						|
        )
 | 
						|
        self.assertEqual(response.status_code, 200)
 | 
						|
        data = json.loads(response.data.decode('utf8'))
 | 
						|
        self.assertEqual(data['result'], '')
 | 
						|
 | 
						|
    def test_empty_initial_dispatcher(self):
 | 
						|
        class SubDispatcher(type(api.dispatcher)):
 | 
						|
            pass
 | 
						|
 | 
						|
        custom_dispatcher = SubDispatcher()
 | 
						|
        custom_api = JSONRPCAPI(custom_dispatcher)
 | 
						|
        self.assertEqual(type(custom_api.dispatcher), SubDispatcher)
 | 
						|
        self.assertEqual(id(custom_api.dispatcher), id(custom_dispatcher))
 | 
						|
 |