Coverage for tests/test_roundtrip.py: 100%
33 statements
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-31 04:18 +0200
« prev ^ index » next coverage.py v7.15.2, created at 2026-08-31 04:18 +0200
1"""Test for BEEP Frame from parsing to generation."""
3from io import BytesIO
4from unittest import TestCase
6from galaxy_beep_frame.converter import Lexer, Parser
7from galaxy_beep_frame.frame import ContinuationIndicator, Frame
8from galaxy_beep_frame.header_type import PossibleHeaderType
11class TestRoundtrip(TestCase):
12 """Test BEEP Frame from parsing to generation."""
14 def test_string_frame_roundtrip(self) -> None:
15 """Test roundtrip starting from bytes."""
17 initial_str = b""
18 initial_str += b"RPY 14 88 * 234 142\r\n"
19 initial_str += b"Content-Type: application/beep+xml\r\n"
20 initial_str += b"\r\n"
21 initial_str += b"<start number='88'>\r\n"
22 initial_str += (
23 b" <profile uri='http://iana.org/beep/SASL/OTP' />\r\n"
24 )
25 initial_str += b" <title>WOW</title>\r\n"
26 initial_str += b"</start>\r\n"
27 initial_str += b"END\r\n"
28 lexer = Lexer()
29 frames = Parser.parse(lexer.lex(BytesIO(initial_str)))
31 self.assertEqual(len(frames), 1)
33 result_str = frames[0].build()
35 self.assertEqual(initial_str, result_str)
37 def test_frame_string_roundtrip(self) -> None:
38 """Test roundtrip starting from a Frame."""
40 initial_frame = Frame(
41 payload=b"<start number='13'>\r\n<profile uri='http://iana.org/beep/SASL/OTP' /></start>\r\n",
42 channel_number=102,
43 message_number=13,
44 sequence_number=400,
45 answer_number=23,
46 continuation_indicator=ContinuationIndicator.COMPLETE,
47 header_type=PossibleHeaderType.ANS,
48 )
50 content = initial_frame.build()
52 lexer = Lexer()
53 end_frames = Parser.parse(lexer.lex(BytesIO(content)))
55 self.assertEqual(len(end_frames), 1)
57 end_frame = end_frames[0]
59 self.assertEqual(initial_frame.payload, end_frame.payload)
60 self.assertEqual(
61 initial_frame.state.channel_number,
62 end_frame.state.channel_number,
63 )
64 self.assertEqual(
65 initial_frame.state.header_type.continuation_indicator,
66 end_frame.state.header_type.continuation_indicator,
67 )
68 self.assertEqual(
69 initial_frame.state.message_number,
70 end_frame.state.message_number,
71 )
72 self.assertEqual(
73 initial_frame.state.sequence_number,
74 end_frame.state.sequence_number,
75 )