Esempio n. 1
0
    async def test_websocket_receives_and_handles_multiple_responses(
            self, mock_ssl, mock_websockets):
        first_response = WSResponse().with_attribute('body')
        second_response = WSResponse().with_attribute('type')

        ws_tester = (WSTest('wss://example.com').with_parameter(
            'example',
            123).with_response(first_response).with_response(second_response))

        mock_socket = MagicMock()
        mock_socket.close = MagicMock(return_value=asyncio.Future())
        mock_socket.close.return_value.set_result(MagicMock())

        first_future = asyncio.Future()
        first_future.set_result(json.dumps({'body': {}}))
        second_future = asyncio.Future()
        second_future.set_result(json.dumps({'type': {}}))
        mock_socket.recv = MagicMock(
            side_effect=[second_future, first_future,
                         asyncio.Future()])

        mock_websockets.return_value = asyncio.Future()
        mock_websockets.return_value.set_result(mock_socket)

        ssl_context = MagicMock()
        mock_ssl.return_value = ssl_context

        await ws_tester.run()

        self.assertEqual(2, len(ws_tester.received_json))
        self.assertEqual(2, len(ws_tester.received_responses))
        self.assertTrue(ws_tester.is_complete())
        mock_socket.close.assert_called_once()
Esempio n. 2
0
    async def test_websocket_receives_and_handles_single_response(
            self, mock_ssl, mock_websockets):
        response = WSResponse().with_attribute('body')

        ws_tester = (WSTest('wss://example.com').with_parameter(
            'example', 123).with_response(response))

        mock_socket = MagicMock()
        mock_socket.close = MagicMock(return_value=asyncio.Future())
        mock_socket.close.return_value.set_result(MagicMock())

        response_json = json.dumps({'body': {}})
        future = asyncio.Future()
        future.set_result(response_json)
        mock_socket.recv = MagicMock(side_effect=[future, asyncio.Future()])

        mock_websockets.return_value = asyncio.Future()
        mock_websockets.return_value.set_result(mock_socket)

        ssl_context = MagicMock()
        mock_ssl.return_value = ssl_context

        await ws_tester.run()

        self.assertEqual(response, ws_tester.received_responses[0])
        self.assertEqual(response_json, ws_tester.received_json[0])
        self.assertTrue(ws_tester.is_complete())
        mock_socket.close.assert_called_once()
Esempio n. 3
0
    def test_all_attributes_is_match(self):
        ws_response = (WSResponse().with_attribute(
            'type', 'new_request').with_attribute('body'))

        test_data = {'type': 'new_request', 'body': {}}

        self.assertTrue(ws_response.is_match(test_data))
Esempio n. 4
0
    async def test_websocket_test_receive_response_with_unresolved_trigger(
            self, mock_ssl, mock_websockets):
        ws_tester = (WSTest('wss://example.com').with_response(
            WSResponse().with_attribute('type').with_trigger(
                WSMessage().with_attribute('test', '${body}'))))

        mock_socket = MagicMock()
        mock_socket.close = MagicMock(return_value=asyncio.Future())
        mock_socket.close.return_value.set_result(MagicMock())

        send_future = asyncio.Future()
        send_future.set_result({})
        mock_socket.send = MagicMock(return_value=send_future)

        receive_future = asyncio.Future()
        receive_future.set_result(json.dumps({'type': 'Hello, world!'}))
        mock_socket.recv = MagicMock(
            side_effect=[receive_future, asyncio.Future()])

        mock_websockets.return_value = asyncio.Future()
        mock_websockets.return_value.set_result(mock_socket)

        ssl_context = MagicMock()
        mock_ssl.return_value = ssl_context

        await ws_tester.run()

        self.assertTrue(ws_tester.is_complete())
        mock_socket.send.assert_called_once_with('{"test": "${body}"}')
        mock_socket.close.assert_called_once()
Esempio n. 5
0
    def test_no_attributes_match(self):
        ws_response = (WSResponse().with_attribute(
            'type', 'new_request').with_attribute('body'))

        test_data = {'not_type': 'new_request', 'not_body': {}}

        self.assertFalse(ws_response.is_match(test_data))
Esempio n. 6
0
    async def test_websocket_response_timeout_with_received_response_logging_disabled(
            self, mock_ssl, mock_websockets):
        ws_tester = (WSTest('wss://example.com').with_response_timeout(
            0.1).with_response(WSResponse().with_attribute('message',
                                                           'hello')))

        mock_socket = MagicMock()
        mock_socket.close = MagicMock(return_value=asyncio.Future())
        mock_socket.close.return_value.set_result(MagicMock())

        first_future = asyncio.Future()
        first_future.set_result(json.dumps({'message': 'bye'}))

        mock_socket.recv = MagicMock(
            side_effect=[first_future, asyncio.Future()])

        mock_websockets.return_value = asyncio.Future()
        mock_websockets.return_value.set_result(mock_socket)

        ssl_context = MagicMock()
        mock_ssl.return_value = ssl_context

        with self.assertRaises(WSTimeoutError) as ex:
            await ws_tester.run()

        expected_error = 'Timed out waiting for responses:\n{"message": "hello"}'
        self.assertEqual(expected_error, str(ex.exception))

        mock_socket.close.assert_called_once()
Esempio n. 7
0
    def test_resolved_attribute_no_match(self):
        ws_response = (WSResponse().with_attribute(
            'type', 'new_request').with_attribute('body/attribute', 'value'))

        test_data = {'type': 'new_request', 'body': {'attribute': 'not_value'}}

        self.assertFalse(ws_response.is_match(test_data))
Esempio n. 8
0
    def test_resolve_top_level_list_without_index(self):
        ws_response = WSResponse().with_attribute('//colour', 'blue')

        test_data = [{
            'colour': 'red'
        }, {
            'colour': 'green'
        }, {
            'colour': 'blue'
        }]

        self.assertTrue(ws_response.is_match(test_data))
Esempio n. 9
0
    def test_resolved_attribute_by_list_index(self):
        ws_response = WSResponse().with_attribute('body/0/colour', 'red')

        test_data = {
            'body': [{
                'colour': 'red'
            }, {
                'colour': 'green'
            }, {
                'colour': 'blue'
            }]
        }

        self.assertTrue(ws_response.is_match(test_data))
Esempio n. 10
0
    def test_resolved_attribute_by_list_without_index_no_match(self):
        ws_response = WSResponse().with_attribute('body//colour', 'yellow')

        test_data = {
            'body': [{
                'colour': 'red'
            }, {
                'colour': 'green'
            }, {
                'colour': 'blue'
            }]
        }

        self.assertFalse(ws_response.is_match(test_data))
Esempio n. 11
0
    def test_resolved_recursive_attribute_match(self):
        ws_response = WSResponse().with_attribute('body/first/second/third',
                                                  'value')

        test_data = {
            'type': 'new_request',
            'body': {
                'first': {
                    'second': {
                        'third': 'value',
                        'fourth': 'not_value'
                    }
                }
            }
        }

        self.assertTrue(ws_response.is_match(test_data))
Esempio n. 12
0
    async def test_websocket_test_timeout(self, mock_ssl, mock_websockets):
        response = WSResponse().with_attribute('body')

        ws_tester = (WSTest('wss://example.com').with_parameter(
            'example', 123).with_test_timeout(0.1).with_response(response))

        mock_socket = MagicMock()
        mock_socket.close = MagicMock(return_value=asyncio.Future())
        mock_socket.close.return_value.set_result(MagicMock())

        mock_socket.recv = MagicMock(return_value=asyncio.Future())

        mock_websockets.return_value = asyncio.Future()
        mock_websockets.return_value.set_result(mock_socket)

        ssl_context = MagicMock()
        mock_ssl.return_value = ssl_context

        self.assertEqual(ws_tester.test_timeout, 0.1)
        with self.assertRaises(WSTimeoutError):
            await ws_tester.run()
        mock_socket.close.assert_called_once()
Esempio n. 13
0
    def test_create_ws_response(self):
        ws_response = WSResponse()

        self.assertDictEqual({}, ws_response.attributes)
Esempio n. 14
0
 def test_stringify(self):
     response = WSResponse().with_attribute('test', 123)
     self.assertEqual('{"test": 123}', str(response))
Esempio n. 15
0
    def test_with_trigger(self):
        message = WSMessage().with_attribute('test', 123)
        ws_response = WSResponse().with_trigger(message)

        self.assertEqual(1, len(ws_response.triggers))
        self.assertEqual(message, ws_response.triggers[0])
Esempio n. 16
0
    def test_with_attribute(self):
        ws_response = WSResponse().with_attribute('test')

        self.assertIn('test', ws_response.attributes)
        self.assertEqual(1, len(ws_response.attributes))
Esempio n. 17
0
    def test_resolved_attribute_by_list_index_not_enough_elements(self):
        ws_response = WSResponse().with_attribute('body/0/colour', 'red')

        test_data = {'body': []}

        self.assertFalse(ws_response.is_match(test_data))
Esempio n. 18
0
    def test_resolve_by_key_when_list_fails(self):
        ws_response = WSResponse().with_attribute('body/colour', 'red')

        test_data = {'body': ['red', 'green', 'blue']}

        self.assertFalse(ws_response.is_match(test_data))
Esempio n. 19
0
    def test_resolve_by_index_when_dict_fails(self):
        ws_response = WSResponse().with_attribute('body/0/colour', 'red')

        test_data = {'body': {'colour': 'red'}}

        self.assertFalse(ws_response.is_match(test_data))
Esempio n. 20
0
    def test_with_attribute_with_value(self):
        ws_response = WSResponse().with_attribute('test', 123)

        self.assertEqual(123, ws_response.attributes['test'])
        self.assertEqual(1, len(ws_response.attributes))
Esempio n. 21
0
    def test_resolved_attribute_by_just_list_index(self):
        ws_response = WSResponse().with_attribute('body/0/', 'red')

        test_data = {'body': ['red', 'green', 'blue']}

        self.assertTrue(ws_response.is_match(test_data))
Esempio n. 22
0
    def test_websocket_with_expected_response(self):
        response = WSResponse().with_attribute('type')
        ws_tester = WSTest('wss://example.com').with_response(response)

        self.assertTrue(ws_tester.expected_responses)
        self.assertEqual(response, ws_tester.expected_responses[0])