1+ """Tests for parse_tags utility function."""
2+
3+ from typing import List , Union
4+
5+ import pytest
6+
7+ from basic_memory .utils import parse_tags
8+
9+
10+ @pytest .mark .parametrize (
11+ "input_tags,expected" ,
12+ [
13+ # None input
14+ (None , []),
15+ # List inputs
16+ ([], []),
17+ (["tag1" , "tag2" ], ["tag1" , "tag2" ]),
18+ (["tag1" , "" , "tag2" ], ["tag1" , "tag2" ]), # Empty tags are filtered
19+ ([" tag1 " , " tag2 " ], ["tag1" , "tag2" ]), # Whitespace is stripped
20+ # String inputs
21+ ("" , []),
22+ ("tag1" , ["tag1" ]),
23+ ("tag1,tag2" , ["tag1" , "tag2" ]),
24+ ("tag1, tag2" , ["tag1" , "tag2" ]), # Whitespace after comma is stripped
25+ ("tag1,,tag2" , ["tag1" , "tag2" ]), # Empty tags are filtered
26+ # Tags with leading '#' characters - these should be stripped
27+ (["#tag1" , "##tag2" ], ["tag1" , "tag2" ]),
28+ ("#tag1,##tag2" , ["tag1" , "tag2" ]),
29+ (["tag1" , "#tag2" , "##tag3" ], ["tag1" , "tag2" , "tag3" ]),
30+ # Mixed whitespace and '#' characters
31+ ([" #tag1 " , " ##tag2 " ], ["tag1" , "tag2" ]),
32+ (" #tag1 , ##tag2 " , ["tag1" , "tag2" ]),
33+ ],
34+ )
35+ def test_parse_tags (
36+ input_tags : Union [List [str ], str , None ], expected : List [str ]
37+ ) -> None :
38+ """Test tag parsing with various input formats."""
39+ result = parse_tags (input_tags )
40+ assert result == expected
41+
42+
43+ def test_parse_tags_special_case () -> None :
44+ """Test parsing from non-string, non-list types."""
45+ # Test with custom object that has __str__ method
46+ class TagObject :
47+ def __str__ (self ) -> str :
48+ return "tag1,tag2"
49+
50+ result = parse_tags (TagObject ()) # pyright: ignore [reportArgumentType]
51+ assert result == ["tag1" , "tag2" ]
0 commit comments