Skip to content

Commit 4dbdda9

Browse files
test_: Code Migration from status-cli-tests with create private groups and message
1 parent a610961 commit 4dbdda9

File tree

1 file changed

+225
-0
lines changed

1 file changed

+225
-0
lines changed
Lines changed: 225 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,225 @@
1+
import pytest
2+
from constants import *
3+
from src.libs.common import delay
4+
from src.libs.custom_logger import get_custom_logger
5+
from src.steps.common import StepsCommon
6+
from validators.contact_request_validator import ContactRequestValidator
7+
from validators.group_chat_validator import GroupChatValidator
8+
9+
logger = get_custom_logger(__name__)
10+
11+
12+
@pytest.mark.usefixtures("start_2_nodes")
13+
class TestPrivateGroupMessages(StepsCommon):
14+
def test_group_chat_messages_baseline(self):
15+
num_private_groups = NUM_MESSAGES
16+
private_groups = []
17+
contact_request_sent = False
18+
19+
for i in range(num_private_groups):
20+
if i % 2 == 0:
21+
sender_node = self.first_node
22+
receiver_node = self.second_node
23+
receiver_pubkey = self.second_node_pubkey
24+
else:
25+
sender_node = self.second_node
26+
receiver_node = self.first_node
27+
receiver_pubkey = self.first_node_pubkey
28+
29+
if not contact_request_sent:
30+
display_name = f"{receiver_node.name}_user"
31+
contact_request_message = f"contact_request_{i}"
32+
timestamp, message_id, contact_request_message, response = self.send_and_wait_for_message(
33+
(sender_node, receiver_node), display_name, i
34+
)
35+
36+
if not response:
37+
raise AssertionError(
38+
f"Contact request failed between {sender_node.name} and {receiver_node.name}")
39+
40+
chat_id = response["result"]["chats"][0]["lastMessage"]["id"]
41+
accept_response = receiver_node.accept_contact_request(chat_id)
42+
43+
if not accept_response:
44+
raise AssertionError(
45+
f"Failed to accept contact request on {receiver_node.name} for chatId {chat_id}"
46+
)
47+
48+
contact_request_sent = True
49+
delay(12)
50+
51+
group_name = f"private_group_from_{sender_node.name}_{i}"
52+
try:
53+
timestamp, message_id, response = self.create_and_validate_private_group(
54+
sender_node, [receiver_pubkey], group_name
55+
)
56+
57+
if not response:
58+
raise AssertionError("Failed to create private group. No valid response received.")
59+
else:
60+
logger.info(f"Private group '{group_name}' created successfully with message ID: {message_id}")
61+
private_groups.append((timestamp, group_name, message_id, sender_node.name))
62+
63+
except AssertionError as e:
64+
logger.error(f"Group creation validation failed: {e}")
65+
66+
messages = []
67+
for ts, group_name, msg_id, sender in private_groups:
68+
group_id, _ = self.join_private_group(sender_node=sender_node, members_list=[receiver_pubkey])
69+
message = f"message_{msg_id}"
70+
timestamp, message_id, response = self.send_and_validate_message(sender_node, group_id, message)
71+
messages.append((timestamp, message, message_id, sender_node.name))
72+
73+
if not response:
74+
raise AssertionError(f"Failed to send message '{message}' in group '{group_name}'")
75+
76+
missing_messages = [
77+
(ts, message, msg_id, sender) for ts, message, msg_id, sender in messages if msg_id is None
78+
]
79+
80+
if missing_messages:
81+
formatted_missing_messages = [
82+
f"Timestamp: {ts}, Message: {msg}, ID: {msg_id}, Sender: {sender}" for ts, msg, msg_id, sender in
83+
missing_messages
84+
]
85+
raise AssertionError(
86+
f"{len(missing_messages)} messages out of {num_private_groups} were not received correctly: " +
87+
"\n".join(formatted_missing_messages)
88+
)
89+
self.first_node.stop()
90+
self.second_node.stop()
91+
92+
def send_and_wait_for_message(self, nodes, display_name, index, timeout=10):
93+
sender_node, receiver_node = nodes
94+
95+
receiver_pubkey = receiver_node.get_pubkey(display_name)
96+
contact_request_message = f"contact_request_{index}"
97+
98+
timestamp, message_id, response = self.send_with_timestamp(
99+
sender_node.send_contact_request, receiver_pubkey, contact_request_message
100+
)
101+
102+
validator = ContactRequestValidator(response)
103+
validator.run_all_validations(receiver_pubkey, display_name, contact_request_message)
104+
105+
try:
106+
receiver_node.wait_for_signal("history.request.started", timeout)
107+
108+
messages_new_events = receiver_node.wait_for_complete_signal("messages.new", timeout)
109+
messages_new_event = None
110+
111+
for event in messages_new_events:
112+
if "chats" in event.get("event", {}):
113+
messages_new_event = event
114+
try:
115+
validator.validate_event_against_response(
116+
messages_new_event,
117+
fields_to_validate={
118+
"text": "text",
119+
"displayName": "displayName",
120+
"id": "id"
121+
}
122+
)
123+
break
124+
except AssertionError as validation_error:
125+
logger.error(f"Validation failed for event: {messages_new_event}, Error: {validation_error}")
126+
continue
127+
128+
if messages_new_event is None:
129+
raise ValueError("No 'messages.new' event with 'chats' data found within the timeout period.")
130+
131+
receiver_node.wait_for_signal("history.request.completed", timeout)
132+
133+
except (TimeoutError, ValueError) as e:
134+
logger.error(f"Signal validation failed: {str(e)}")
135+
return timestamp, message_id, contact_request_message, None
136+
137+
return timestamp, message_id, contact_request_message, response
138+
139+
def create_and_validate_private_group(self, node, members_pubkeys, group_name, timeout=10):
140+
timestamp, message_id, response = self.send_with_timestamp_for_group(
141+
node.create_group_chat_with_members, members_pubkeys, group_name
142+
)
143+
144+
if not response or "result" not in response or "chats" not in response["result"]:
145+
raise AssertionError("Invalid response structure. Expected 'result' with 'chats' list.")
146+
147+
chat_data = response["result"]["chats"][0]
148+
validator = GroupChatValidator(chat_data)
149+
150+
try:
151+
validator.validate_fields(
152+
{
153+
"name": group_name,
154+
"active": True,
155+
"chatType": 3,
156+
"members": [
157+
{"id": pubkey} for pubkey in members_pubkeys
158+
]
159+
}
160+
)
161+
except AssertionError as validation_error:
162+
raise AssertionError(f"Validation failed for group chat creation: {validation_error}")
163+
164+
try:
165+
node.wait_for_signal("history.request.completed", timeout)
166+
except TimeoutError:
167+
logger.error("Timeout waiting for group chat creation events.")
168+
return timestamp, message_id, None
169+
170+
return timestamp, message_id, response
171+
172+
def send_and_validate_message(self, sender_node, group_id, message, timeout=10):
173+
timestamp, message_id, response = self.send_with_timestamp(
174+
sender_node.send_group_chat_message, group_id, message
175+
)
176+
177+
if not response or "result" not in response or "chats" not in response["result"]:
178+
raise AssertionError("Invalid response structure. Expected 'result' with chat message details.")
179+
180+
message_data = response["result"]["chats"][0].get("lastMessage", {})
181+
if not message_data:
182+
raise AssertionError("No 'lastMessage' data found in response.")
183+
184+
validator = GroupChatValidator(message_data)
185+
try:
186+
validator.validate_message_fields(
187+
{
188+
"id": message_id,
189+
"text": message,
190+
"chatId": group_id,
191+
"timestamp": timestamp
192+
}
193+
)
194+
except AssertionError as validation_error:
195+
raise AssertionError(f"Validation failed for message send: {validation_error}")
196+
197+
try:
198+
sender_node.wait_for_signal("message.delivered", timeout)
199+
except TimeoutError:
200+
logger.error("Timeout waiting for message delivery.")
201+
return timestamp, message_id, None
202+
203+
return timestamp, message_id, response
204+
205+
def test_group_chat_messages_with_latency(self):
206+
with self.add_latency():
207+
self.test_group_chat_messages_baseline()
208+
209+
def test_group_chat_messages_with_packet_loss(self):
210+
with self.add_packet_loss():
211+
self.test_group_chat_messages_baseline()
212+
213+
def test_group_chat_messages_with_low_bandwidth(self):
214+
with self.add_low_bandwidth():
215+
self.test_group_chat_messages_baseline()
216+
217+
def test_group_chat_messages_with_node_pause_10_seconds(self):
218+
with self.node_pause(self.first_node):
219+
delay(10)
220+
try:
221+
self.test_group_chat_messages_baseline()
222+
except Exception as e:
223+
logger.info(f"Expected exception occurred while node was paused: {e}")
224+
assert "Read timed out" in str(e) or "ConnectionError" in str(e), \
225+
"Unexpected error type when node is paused"

0 commit comments

Comments
 (0)