Skip to content

Commit 763e761

Browse files
committed
Add tests for _GeneratorRequest initialization and iteration
1 parent 1a348b6 commit 763e761

File tree

3 files changed

+132
-1
lines changed

3 files changed

+132
-1
lines changed

src/iop/_generator_request.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from typing import Any, Optional, Union
22

33
from . import _iris
4-
from ._dispatch import dispatch_serializer, dispatch_deserializer
4+
from ._dispatch import dispatch_serializer
55

66
class _GeneratorRequest:
77
"""Generator class to interetate over responses from a request.

src/tests/test_business_host.py

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,58 @@ def test_send_multi_request_sync(self, business_host):
4646

4747
assert result == [('test', SimpleMessage(integer=1, string='test'), MyResponse(value='test'), 1)]
4848

49+
class TestGeneratorRequest:
50+
def test_generator_request_initialization(self, business_host):
51+
business_host.iris_handle.dispatchSendRequestSync = MagicMock()
52+
business_host.iris_handle.dispatchSendRequestSync.return_value = iris.cls("IOP.Generator.Message.Ack")._New()
53+
54+
from iop._generator_request import _GeneratorRequest
55+
generator = _GeneratorRequest(business_host, "test_target", SimpleMessage(integer=1, string='test'))
56+
57+
assert generator.host == business_host
58+
assert generator.target == "test_target"
59+
assert generator.request == SimpleMessage(integer=1, string='test')
60+
61+
@patch('iop._business_host._iris.get_iris')
62+
@patch('iop._business_host.dispach_message')
63+
def test_dispatch_generator_started(self, mock_dispatch, mock_iris, business_host):
64+
mock_generator = iter([1, 2, 3])
65+
mock_dispatch.return_value = mock_generator
66+
mock_ack = MagicMock()
67+
mock_iris.return_value.IOP.Generator.Message.Ack._New.return_value = mock_ack
68+
69+
result = business_host._dispatch_generator_started("request")
70+
71+
assert result == mock_ack
72+
assert hasattr(business_host, '_gen')
73+
74+
@patch('iop._business_host.dispach_message')
75+
def test_dispatch_generator_started_not_iterable(self, mock_dispatch, business_host):
76+
mock_dispatch.return_value = SimpleMessage(integer=1, string='test')
77+
78+
with pytest.raises(TypeError):
79+
business_host._dispatch_generator_started("request")
80+
81+
def test_dispatch_generator_poll_next(self, business_host):
82+
# Configure the mock to return proper buffer size
83+
mock_msg = SimpleMessage(integer=1, string='test')
84+
85+
business_host._gen = iter([SimpleMessage(integer=1, string='test'), SimpleMessage(integer=2, string='test2')])
86+
87+
result = business_host._dispatch_generator_poll()
88+
89+
# deserialize the message
90+
result = deserialize_message(result)
91+
92+
assert result == SimpleMessage(integer=1, string='test')
93+
94+
def test_dispatch_generator_poll_stop(self, business_host):
95+
business_host._gen = iter([])
96+
97+
result = business_host._dispatch_generator_poll()
98+
99+
assert result._IsA("IOP.Generator.Message.Stop")
100+
49101
class TestMessageSerialization:
50102
def test_dispatch_serializer_valid(self, business_host):
51103
message = SimpleMessage(integer=1, string='test')
Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
import pytest
2+
from iop._generator_request import _GeneratorRequest
3+
from iop import PydanticMessage
4+
from unittest.mock import Mock, patch
5+
6+
def test_generator_request_initialization():
7+
# Mock host and request
8+
mock_host = Mock()
9+
mock_request = PydanticMessage()
10+
11+
# Set up mock response for send_request_sync
12+
mock_ack = Mock()
13+
mock_ack._IsA.return_value = True
14+
mock_host.send_request_sync.return_value = mock_ack
15+
16+
# Test successful initialization
17+
generator = _GeneratorRequest(mock_host, "test_target", mock_request)
18+
assert generator.host == mock_host
19+
assert generator.target == "test_target"
20+
assert generator.request == mock_request
21+
22+
# Verify send_request_sync was called correctly
23+
mock_host.send_request_sync.assert_called_once()
24+
25+
def test_generator_request_failed_initialization():
26+
# Mock host and request
27+
mock_host = Mock()
28+
mock_request = PydanticMessage()
29+
30+
# Set up mock response for send_request_sync to fail
31+
mock_host.send_request_sync.return_value = None
32+
33+
# Test failed initialization
34+
with pytest.raises(RuntimeError, match="Failed to send request, no acknowledgment received."):
35+
_GeneratorRequest(mock_host, "test_target", mock_request)
36+
37+
def test_generator_request_iteration():
38+
# Mock host and request
39+
mock_host = Mock()
40+
mock_request = PydanticMessage()
41+
42+
# Set up mock responses for all calls: initialization, iteration, and stop
43+
mock_ack = Mock()
44+
mock_ack._IsA.return_value = True
45+
mock_response = Mock()
46+
mock_response._IsA.return_value = False
47+
mock_stop = Mock()
48+
mock_stop._IsA.return_value = True
49+
50+
# Configure mock to return ack for init, regular response, then stop message
51+
mock_host.send_request_sync.side_effect = [mock_ack, mock_response, mock_stop]
52+
53+
# Create generator
54+
generator = _GeneratorRequest(mock_host, "test_target", mock_request)
55+
56+
# Test iteration
57+
responses = list(generator)
58+
assert len(responses) == 1
59+
assert responses[0] == mock_response
60+
61+
def test_generator_request_none_response():
62+
# Mock host and request
63+
mock_host = Mock()
64+
mock_request = PydanticMessage()
65+
66+
# Set up mock response for initialization
67+
mock_ack = Mock()
68+
mock_ack._IsA.return_value = True
69+
mock_host.send_request_sync.return_value = mock_ack
70+
71+
# Create generator
72+
generator = _GeneratorRequest(mock_host, "test_target", mock_request)
73+
74+
# Set up mock to return None for iteration
75+
mock_host.send_request_sync.side_effect = [None]
76+
77+
# Test iteration should stop on None response
78+
responses = list(generator)
79+
assert len(responses) == 0

0 commit comments

Comments
 (0)