From 12b6966c8ab6a347fd3dd85fe39df519bf5a4b1a Mon Sep 17 00:00:00 2001 From: juk0de Date: Thu, 17 Aug 2023 08:28:15 +0200 Subject: [PATCH] added testcases for Tag and TagLine classes --- tests/test_main.py | 114 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 114 insertions(+) diff --git a/tests/test_main.py b/tests/test_main.py index db5fcdb..cc5bb2e 100644 --- a/tests/test_main.py +++ b/tests/test_main.py @@ -7,6 +7,7 @@ from chatmastermind.main import create_parser, ask_cmd from chatmastermind.api_client import ai from chatmastermind.configuration import Config from chatmastermind.storage import create_chat_hist, save_answers, dump_data +from chatmastermind.tags import Tag, TagLine, TagError from unittest import mock from unittest.mock import patch, MagicMock, Mock, ANY @@ -231,3 +232,116 @@ class TestCreateParser(CmmTestCase): mock_cmdparser.add_parser.assert_any_call('config', help=ANY, aliases=ANY) mock_cmdparser.add_parser.assert_any_call('print', help=ANY, aliases=ANY) self.assertTrue('.config.yaml' in parser.get_default('config')) + + +class TestTag(CmmTestCase): + def test_valid_tag(self) -> None: + tag = Tag('mytag') + self.assertEqual(tag, 'mytag') + + def test_invalid_tag(self) -> None: + with self.assertRaises(TypeError): + Tag('tag with space') + + def test_default_separator(self) -> None: + self.assertEqual(Tag.default_separator, ' ') + + def test_alternative_separators(self) -> None: + self.assertEqual(Tag.alternative_separators, [',']) + + +class TestTagLine(CmmTestCase): + def test_valid_tagline(self) -> None: + tagline = TagLine('TAGS: tag1 tag2') + self.assertEqual(tagline, 'TAGS: tag1 tag2') + + def test_invalid_tagline(self) -> None: + with self.assertRaises(TagError): + TagLine('tag1 tag2') + + def test_prefix(self) -> None: + self.assertEqual(TagLine.prefix, 'TAGS:') + + def test_from_set(self) -> None: + tags = {Tag('tag1'), Tag('tag2')} + tagline = TagLine.from_set(tags) + self.assertEqual(tagline, 'TAGS: tag1 tag2') + + def test_tags(self) -> None: + tagline = TagLine('TAGS: tag1 tag2') + tags = tagline.tags() + self.assertEqual(tags, {Tag('tag1'), Tag('tag2')}) + + def test_merge(self) -> None: + tagline1 = TagLine('TAGS: tag1 tag2') + tagline2 = TagLine('TAGS: tag2 tag3') + merged_tagline = tagline1.merge({tagline2}) + self.assertEqual(merged_tagline, 'TAGS: tag1 tag2 tag3') + + def test_delete_tags(self) -> None: + tagline = TagLine('TAGS: tag1 tag2 tag3') + new_tagline = tagline.delete_tags({Tag('tag1'), Tag('tag3')}) + self.assertEqual(new_tagline, 'TAGS: tag2') + + def test_add_tags(self) -> None: + tagline = TagLine('TAGS: tag1') + new_tagline = tagline.add_tags({Tag('tag2'), Tag('tag3')}) + self.assertEqual(new_tagline, 'TAGS: tag1 tag2 tag3') + + def test_rename_tags(self) -> None: + tagline = TagLine('TAGS: old1 old2') + new_tagline = tagline.rename_tags({(Tag('old1'), Tag('new1')), (Tag('old2'), Tag('new2'))}) + self.assertEqual(new_tagline, 'TAGS: new1 new2') + + def test_match_tags(self) -> None: + tagline = TagLine('TAGS: tag1 tag2 tag3') + + # Test case 1: Match any tag in 'tags_or' + tags_or = {Tag('tag1'), Tag('tag4')} + tags_and: set[Tag] = set() + tags_not: set[Tag] = set() + self.assertTrue(tagline.match_tags(tags_or, tags_and, tags_not)) + + # Test case 2: Match all tags in 'tags_and' + tags_or = set() + tags_and = {Tag('tag1'), Tag('tag2'), Tag('tag3')} + tags_not = set() + self.assertTrue(tagline.match_tags(tags_or, tags_and, tags_not)) + + # Test case 3: Match any tag in 'tags_or' and match all tags in 'tags_and' + tags_or = {Tag('tag1'), Tag('tag4')} + tags_and = {Tag('tag1'), Tag('tag2')} + tags_not = set() + self.assertTrue(tagline.match_tags(tags_or, tags_and, tags_not)) + + # Test case 4: Match any tag in 'tags_or', match all tags in 'tags_and', and exclude tags in 'tags_not' + tags_or = {Tag('tag1'), Tag('tag4')} + tags_and = {Tag('tag1'), Tag('tag2')} + tags_not = {Tag('tag5')} + self.assertTrue(tagline.match_tags(tags_or, tags_and, tags_not)) + + # Test case 5: No matching tags in 'tags_or' + tags_or = {Tag('tag4'), Tag('tag5')} + tags_and = set() + tags_not = set() + self.assertFalse(tagline.match_tags(tags_or, tags_and, tags_not)) + + # Test case 6: Not all tags in 'tags_and' are present + tags_or = set() + tags_and = {Tag('tag1'), Tag('tag2'), Tag('tag3'), Tag('tag4')} + tags_not = set() + self.assertFalse(tagline.match_tags(tags_or, tags_and, tags_not)) + + # Test case 7: Some tags in 'tags_not' are present + tags_or = {Tag('tag1')} + tags_and = set() + tags_not = {Tag('tag2')} + self.assertFalse(tagline.match_tags(tags_or, tags_and, tags_not)) + + # Test case 8: 'tags_or' and 'tags_and' are None, match all tags + tags_not = set() + self.assertTrue(tagline.match_tags(None, None, tags_not)) + + # Test case 9: 'tags_or' and 'tags_and' are None, match all tags except excluded tags + tags_not = {Tag('tag2')} + self.assertFalse(tagline.match_tags(None, None, tags_not))