import unittest from datetime import datetime from sia.web_io_buffer import WebIOBuffer from sia.read_entry import ReadEntry class ReadEntryTest(unittest.TestCase): def setUp(self): """Set up test cases with fixed id, timestamp, and IO buffer""" self.test_id = "test-id-1234" self.test_timestamp = datetime(2024, 10, 31, 12, 0, 0) self.io_buffer = WebIOBuffer() def test_initialization(self): """Test entry initialization""" entry = ReadEntry(self.test_id, self.test_timestamp, self.io_buffer) self.assertEqual(entry.content, "") self.assertEqual(entry.id, self.test_id) self.assertEqual(entry.timestamp, self.test_timestamp) def test_single_read(self): """Test reading content once""" test_input = "test message" self.io_buffer.append_stdin(test_input) entry = ReadEntry(self.test_id, self.test_timestamp, self.io_buffer) entry.update() self.assertEqual(entry.content, test_input) self.assertEqual(self.io_buffer.buffer_length(), 0) def test_multiple_updates(self): """Test that content is only read once even with multiple updates""" test_input = "initial input" self.io_buffer.append_stdin(test_input) entry = ReadEntry(self.test_id, self.test_timestamp, self.io_buffer) entry.update() initial_content = entry.content self.io_buffer.append_stdin("additional input") entry.update() entry.update() self.assertEqual(entry.content, initial_content) def test_empty_input(self): """Test reading when no input is available""" entry = ReadEntry(self.test_id, self.test_timestamp, self.io_buffer) entry.update() self.assertEqual(entry.content, "") def test_special_characters(self): """Test reading content with special characters""" test_input = "Special chars: \n\t\r\'\"\\" self.io_buffer.append_stdin(test_input) entry = ReadEntry(self.test_id, self.test_timestamp, self.io_buffer) entry.update() self.assertEqual(entry.content, test_input) def test_large_content(self): """Test reading large content""" test_input = "x" * 10000 self.io_buffer.append_stdin(test_input) entry = ReadEntry(self.test_id, self.test_timestamp, self.io_buffer) entry.update() self.assertEqual(entry.content, test_input) def test_generate_context_before_read(self): """Test XML context generation before reading""" entry = ReadEntry(self.test_id, self.test_timestamp, self.io_buffer) element = entry.generate_context() # Verify XML structure self.assertEqual(element.tag, "read_stdin") self.assertEqual(element.get("id"), self.test_id) self.assertIsNone(element.text) # No content before read def test_generate_context_after_read(self): """Test XML context generation after reading""" test_input = "test message" self.io_buffer.append_stdin(test_input) entry = ReadEntry(self.test_id, self.test_timestamp, self.io_buffer) entry.update() element = entry.generate_context() # Verify XML structure self.assertEqual(element.tag, "read_stdin") self.assertEqual(element.get("id"), self.test_id) self.assertEqual(element.text, f"{test_input}") def test_unicode_content(self): """Test reading Unicode content""" test_input = "Hello δΈ–η•Œ 😊" self.io_buffer.append_stdin(test_input) entry = ReadEntry(self.test_id, self.test_timestamp, self.io_buffer) entry.update() self.assertEqual(entry.content, test_input) def test_multiline_content(self): """Test reading multiline content""" test_input = """Line 1 Line 2 Line 3""" self.io_buffer.append_stdin(test_input) entry = ReadEntry(self.test_id, self.test_timestamp, self.io_buffer) entry.update() self.assertEqual(entry.content, test_input) # Verify XML escaping for multiline content element = entry.generate_context() self.assertEqual(element.text, f"{test_input}")