81 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
			
		
		
	
	
			81 lines
		
	
	
		
			2.6 KiB
		
	
	
	
		
			Python
		
	
	
# -*- coding: utf-8 -*-
 | 
						|
# Copyright 2020 The Matrix.org Foundation C.I.C.
 | 
						|
#
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
# you may not use this file except in compliance with the License.
 | 
						|
# You may obtain a copy of the License at
 | 
						|
#
 | 
						|
#     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
# See the License for the specific language governing permissions and
 | 
						|
# limitations under the License.
 | 
						|
import json
 | 
						|
from io import BytesIO
 | 
						|
 | 
						|
from mock import Mock
 | 
						|
 | 
						|
from synapse.api.errors import SynapseError
 | 
						|
from synapse.http.servlet import (
 | 
						|
    parse_json_object_from_request,
 | 
						|
    parse_json_value_from_request,
 | 
						|
)
 | 
						|
 | 
						|
from tests import unittest
 | 
						|
 | 
						|
 | 
						|
def make_request(content):
 | 
						|
    """Make an object that acts enough like a request."""
 | 
						|
    request = Mock(spec=["content"])
 | 
						|
 | 
						|
    if isinstance(content, dict):
 | 
						|
        content = json.dumps(content).encode("utf8")
 | 
						|
 | 
						|
    request.content = BytesIO(content)
 | 
						|
    return request
 | 
						|
 | 
						|
 | 
						|
class TestServletUtils(unittest.TestCase):
 | 
						|
    def test_parse_json_value(self):
 | 
						|
        """Basic tests for parse_json_value_from_request."""
 | 
						|
        # Test round-tripping.
 | 
						|
        obj = {"foo": 1}
 | 
						|
        result = parse_json_value_from_request(make_request(obj))
 | 
						|
        self.assertEqual(result, obj)
 | 
						|
 | 
						|
        # Results don't have to be objects.
 | 
						|
        result = parse_json_value_from_request(make_request(b'["foo"]'))
 | 
						|
        self.assertEqual(result, ["foo"])
 | 
						|
 | 
						|
        # Test empty.
 | 
						|
        with self.assertRaises(SynapseError):
 | 
						|
            parse_json_value_from_request(make_request(b""))
 | 
						|
 | 
						|
        result = parse_json_value_from_request(make_request(b""), allow_empty_body=True)
 | 
						|
        self.assertIsNone(result)
 | 
						|
 | 
						|
        # Invalid UTF-8.
 | 
						|
        with self.assertRaises(SynapseError):
 | 
						|
            parse_json_value_from_request(make_request(b"\xFF\x00"))
 | 
						|
 | 
						|
        # Invalid JSON.
 | 
						|
        with self.assertRaises(SynapseError):
 | 
						|
            parse_json_value_from_request(make_request(b"foo"))
 | 
						|
 | 
						|
        with self.assertRaises(SynapseError):
 | 
						|
            parse_json_value_from_request(make_request(b'{"foo": Infinity}'))
 | 
						|
 | 
						|
    def test_parse_json_object(self):
 | 
						|
        """Basic tests for parse_json_object_from_request."""
 | 
						|
        # Test empty.
 | 
						|
        result = parse_json_object_from_request(
 | 
						|
            make_request(b""), allow_empty_body=True
 | 
						|
        )
 | 
						|
        self.assertEqual(result, {})
 | 
						|
 | 
						|
        # Test not an object
 | 
						|
        with self.assertRaises(SynapseError):
 | 
						|
            parse_json_object_from_request(make_request(b'["foo"]'))
 |