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

1"""Test for BEEP Frame from parsing to generation.""" 

2 

3from io import BytesIO 

4from unittest import TestCase 

5 

6from galaxy_beep_frame.converter import Lexer, Parser 

7from galaxy_beep_frame.frame import ContinuationIndicator, Frame 

8from galaxy_beep_frame.header_type import PossibleHeaderType 

9 

10 

11class TestRoundtrip(TestCase): 

12 """Test BEEP Frame from parsing to generation.""" 

13 

14 def test_string_frame_roundtrip(self) -> None: 

15 """Test roundtrip starting from bytes.""" 

16 

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))) 

30 

31 self.assertEqual(len(frames), 1) 

32 

33 result_str = frames[0].build() 

34 

35 self.assertEqual(initial_str, result_str) 

36 

37 def test_frame_string_roundtrip(self) -> None: 

38 """Test roundtrip starting from a Frame.""" 

39 

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 ) 

49 

50 content = initial_frame.build() 

51 

52 lexer = Lexer() 

53 end_frames = Parser.parse(lexer.lex(BytesIO(content))) 

54 

55 self.assertEqual(len(end_frames), 1) 

56 

57 end_frame = end_frames[0] 

58 

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 )