import pathlib from io import StringIO from unittest.mock import patch from chatmastermind.tags import TagLine from chatmastermind.message import Message, Question, Answer, Tag, MessageFilter from chatmastermind.chat import Chat, terminal_width from .test_main import CmmTestCase class TestChat(CmmTestCase): def setUp(self) -> None: self.chat = Chat([]) self.message1 = Message(Question('Question 1'), Answer('Answer 1'), {Tag('tag1')}, file_path=pathlib.Path('0001.txt')) self.message2 = Message(Question('Question 2'), Answer('Answer 2'), {Tag('tag2')}, file_path=pathlib.Path('0002.txt')) def test_filter(self) -> None: self.chat.add_msgs([self.message1, self.message2]) self.chat.filter(MessageFilter(answer_contains='Answer 1')) self.assertEqual(len(self.chat.messages), 1) self.assertEqual(self.chat.messages[0].question, 'Question 1') def test_sort(self) -> None: self.chat.add_msgs([self.message2, self.message1]) self.chat.sort() self.assertEqual(self.chat.messages[0].question, 'Question 1') self.assertEqual(self.chat.messages[1].question, 'Question 2') self.chat.sort(reverse=True) self.assertEqual(self.chat.messages[0].question, 'Question 2') self.assertEqual(self.chat.messages[1].question, 'Question 1') def test_clear(self) -> None: self.chat.add_msgs([self.message1]) self.chat.clear() self.assertEqual(len(self.chat.messages), 0) def test_add_msgs(self) -> None: self.chat.add_msgs([self.message1, self.message2]) self.assertEqual(len(self.chat.messages), 2) self.assertEqual(self.chat.messages[0].question, 'Question 1') self.assertEqual(self.chat.messages[1].question, 'Question 2') @patch('sys.stdout', new_callable=StringIO) def test_print(self, mock_stdout: StringIO) -> None: self.chat.add_msgs([self.message1, self.message2]) self.chat.print(paged=False) expected_output = f"""{'-'*terminal_width()} {Question.txt_header} Question 1 {Answer.txt_header} Answer 1 {'-'*terminal_width()} {Question.txt_header} Question 2 {Answer.txt_header} Answer 2 """ self.assertEqual(mock_stdout.getvalue(), expected_output) @patch('sys.stdout', new_callable=StringIO) def test_print_with_tags_and_file(self, mock_stdout: StringIO) -> None: self.chat.add_msgs([self.message1, self.message2]) self.chat.print(paged=False, with_tags=True, with_file=True) expected_output = f"""{'-'*terminal_width()} {Question.txt_header} Question 1 {Answer.txt_header} Answer 1 {TagLine.prefix} tag1 FILE: 0001.txt {'-'*terminal_width()} {Question.txt_header} Question 2 {Answer.txt_header} Answer 2 {TagLine.prefix} tag2 FILE: 0002.txt """ self.assertEqual(mock_stdout.getvalue(), expected_output)